MySQL的一些骚操作

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySQL的一些骚操作,希望能帮到你

建表语句

1.表结构完全复制
create table user_bak LIKE user;

2.使用某些字段建表
create table user_bak select now() as time ;

3.建表时字段值强制转换
create table user_bak select CAST('2019-8-01' as UNSIGNED) as time;

4.临时表
解释: 只对当前会话有效,有同名表则原表隐藏不可见,会话结束自动清除
create temporary table user_bak  like user;
drop temporary table user_bak;

Cast类型强制转换

语法: 
    Cast(字段名 as 转换的类型 )

支持的类型:
    CHAR[(N)] 字符型 
    DATE 日期型
    DATETIME 日期和时间型
    DECIMAL float型
    SIGNED int
    TIME 时间型

场景:
    1.解决utf8字符查询时传入表情符,导致报错;

新建分区表

  • 示例
create table user_bak (
 id int(11) UNSIGNED AUTO_INCREMENT ,
 `name` varchar(200) DEFAULT null COMMENT '名称',
 rand_num int(11) DEFAULT NULL COMMENT '随机数',
 birthday datetime default null comment '生日',
 PRIMARY KEY (`id`,rand_num)
) ENGINE = INNODB partition by RANGE (rand_num)
(
    PARTITION p0 VALUES less THAN (20),
    PARTITION p1 VALUES less THAN (40),
    PARTITION p2 VALUES less THAN (60),
    PARTITION p3 VALUES less THAN (80),
    PARTITION p4 VALUES less THAN MAXVALUE
);
  • 注意点
1.PRIMARY必须包含分区的字段
2.不能单独创建分区,建表时就要创建
  • 常见异常
1.ERROR 1064  不能单独创建分区
解决:建表时就要把分区创建好

2.ERROR 1503 主键必须包含分区函数中所有列
解决:创建分区的字段必须放在主键索引中

子查询

-- 1.ALL - 查询返回单个结果,类似in操作
select * from user_bak where (id) 
>= ALL(select id from user_bak where id = 10)

-- 2.ANY & SUM -效果一样,类似or操作
select * from user_bak where (name,id) 
= SOME(select name,id from user_bak where id = 1 or name = 'eee')

FullText全文搜索

  • 全文搜索类型
1.自然语言搜索-搜索包含匹配词的信息
2.布尔模式搜索-
3.查询扩展搜索
  • 创建索引需要满足的条件
1.表类型为MyISAM,version5.6以后引入了对InnoDB支持
2.字段类型只能是char/varchar/text类型
3.全文搜索会自动忽略掉常用词(在记录中出现几率为50%以上)-验证可以查出来
4.停用词会被过滤掉(the/after/other等)
5.少于4个字符会被忽略,查不出来(默认4-84个字符范围,可更改)
  • 语法
-- 自然语言
select *,match(`name`) against('good boy') 
as 'percentage' from `user` where match(`name`) against('good boy');

-- 布尔模式
select *,match(`name`) against('good boy' in boolean MODE) as 'percentage' from `user` where match(`name`) against('good boy' in boolean MODE);

-- 内容顺序完全匹配
select *,match(`name`) against('"good boy"' in boolean MODE) as 'percentage' from `user` where match(`name`) against('"good boy"' in boolean MODE);

-- 扩展查询
select *,match(`name`) against('good boy' with query expansion) as 'percentage' from `user` where match(`name`) against('good boy'  with query expansion);
  • 修改查询字符长度
1.my.cnf文件中ft_min_word_len
2.重建FullText索引或者快速修复
repair table table_name quick;

字符集

有字符集有关的系统设置

character_set_system 用于存储的字符集
character_set_server 服务器默认字符集
collation_server  系统排序规则
character_set_database 数据库字符集
collation_database  数据库排序规则
character_set_client 客户端向服务器发送SQL时使用的字符集
character_set_result 表示服务器返回结果时使用的字符集
character_set_connection 连接时使用的字符串
character_set_filesystem 文件系统字符集

空间值

OpenGIS规范
point 类型值,只支持InnoDB/MyISAM/NDB/ARCHIVE引擎
point(xxxx,xxxx)

模糊匹配查询

1.like
    % 匹配任意数量的字符序列
    _ 只能匹配单个字符
    \%  \_  转义
2.REGEXP-正则查询

新建用户后授权

-- %表示所有IP可连接
CREATE USER `用户名`@`%` IDENTIFIED BY '密码';
grant all privileges on jwgateway.* to '用户名'@'%' identified by '密码';
select * from mysql.user;

判断时间与已有记录是否重叠

-- 1.方法一
SELECT * FROM test_table
WHERE (start_time >= startT AND start_time < endT)
   OR (start_time <= startT AND end_time > endT)
   OR (end_time >= startT AND end_time < endT)

-- 2.方法二
SELECT * FROM test_table WHERE NOT ( (end_time < startT OR (start_time > endT) )

判断时间间隔不能重叠

set @start='2022-06-08',@end='2022-06-10';
select * FROM xxx WHERE 
(
    (start_time <= @start and end_time >= @end )
     or (start_time >= @start and end_time >= @end and start_time < @end)
     or (start_time <= @start and end_time <= @end and end_time > @start )
     or (start_time >= @start and end_time <= @end)
)

-- 解释
/*
时间重叠情况
    startTime    endTime
  start |   end     |
  start |           |    end
        | start end |
        |           |
*/

MySQL8.0大数据表添加varchar字段

MySQL8.0官网文档
-- 原生只支持在表中追加字段,不可以随意位置插入字段
update xxx add column name varchar(255),ALGORITHM=INSTANT;

/*
作用:指定操作使用的算法类型
    COPY:对原始表的副本执行操作,并将表数据从原始表逐行复制到新表。不允许并发DML。
    INPLACE:操作可避免复制表数据,但可以在适当位置重建表。在操作的准备和执行阶段可以简短地获取表上的独占元数据锁定。通常,支持并发DML。
    INSTANT:操作只能修改数据字典中的元数据。在准备和执行期间,不会在表上获取任何独占元数据锁,并且表数据不受影响,从而使操作立即进行。允许并发DML。(在MySQL 8.0.12中引入)

INSTANT 原理:
    在 INNODB_COLUMNS.DEFAULT_VALUE、INNODB_COLUMNS.HAS_DEFAULT、INNODB_TABLES.INSTANT_COLS
    表中添加配置信息,标识添加instant字段前字段数、instant字段是否有默认值,instant添加的字段名;
    不会将添加的字段写入db文件,只有操作了数据(insert/update)后,才会将完整结构的数据更新至db文件
*/

查看NavicatPremium中的连接密码

1.NaivatPremium导出连接

注意:导出时一定要勾选上导出密码!!!
导出文件中 Password 值是加密后的密码

解密

1.打开网址 https://tool.lu/coderunner/  左上角选择php
2.复制以下代码到代码框中,修改倒数第三行代码中的加密串
3.点击执行(Run)
4.如果执行失败则修改下版本号 11/12
ps: 感谢大佬提供的代码,已经找不到出处了
<?php
class NavicatPassword{

    protected $version = 0;
    protected $aesKey = 'libcckeylibcckey';
    protected $aesIv = 'libcciv libcciv ';
    protected $blowString = '3DC5CA39';
    protected $blowKey = null;
    protected $blowIv = null;

    public function __construct($version = 12){
        $this->version = $version;
        $this->blowKey = sha1('3DC5CA39', true);
        $this->blowIv = hex2bin('d9c7c3c8870d64bd');
    }

    public function encrypt($string){
        $result = FALSE;
        switch ($this->version) {
            case 11:
                $result = $this->encryptEleven($string);
                break;
            case 12:
                $result = $this->encryptTwelve($string);
                break;
            default:
                break;
        }

        return $result;
    }

    protected function encryptEleven($string){
        $round = intval(floor(strlen($string) / 8));
        $leftLength = strlen($string) % 8;
        $result = '';
        $currentVector = $this->blowIv;

        for ($i = 0; $i < $round; $i++) {
            $temp = $this->encryptBlock($this->xorBytes(substr($string, 8 * $i, 8), $currentVector));
            $currentVector = $this->xorBytes($currentVector, $temp);
            $result .= $temp;
        }

        if ($leftLength) {
            $currentVector = $this->encryptBlock($currentVector);
            $result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector);
        }

        return strtoupper(bin2hex($result));
    }

    protected function encryptBlock($block){
        return openssl_encrypt($block, 'BF-ECB', $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING);
    }

    protected function decryptBlock($block){
        return openssl_decrypt($block, 'BF-ECB', $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING);
    }

    protected function xorBytes($str1, $str2){
        $result = '';
        for ($i = 0; $i < strlen($str1); $i++) {
            $result .= chr(ord($str1[$i]) ^ ord($str2[$i]));
        }

        return $result;
    }

    protected function encryptTwelve($string){
        $result = openssl_encrypt($string, 'AES-128-CBC', $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv);
        return strtoupper(bin2hex($result));
    }

    public function decrypt($string){
        $result = FALSE;
        switch ($this->version) {
            case 11:
                $result = $this->decryptEleven($string);
                break;
            case 12:
                $result = $this->decryptTwelve($string);
                break;
            default:
                break;
        }

        return $result;
    }

    protected function decryptEleven($upperString){
        $string = hex2bin(strtolower($upperString));

        $round = intval(floor(strlen($string) / 8));
        $leftLength = strlen($string) % 8;
        $result = '';
        $currentVector = $this->blowIv;

        for ($i = 0; $i < $round; $i++) {
            $encryptedBlock = substr($string, 8 * $i, 8);
            $temp = $this->xorBytes($this->decryptBlock($encryptedBlock), $currentVector);
            $currentVector = $this->xorBytes($currentVector, $encryptedBlock);
            $result .= $temp;
        }

        if ($leftLength) {
            $currentVector = $this->encryptBlock($currentVector);
            $result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector);
        }

        return $result;
    }

    protected function decryptTwelve($upperString){
        $string = hex2bin(strtolower($upperString));
        return openssl_decrypt($string, 'AES-128-CBC', $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv);
    }
};


//需要指定版本两种,11或12
$navicatPassword = new NavicatPassword(12);

//解密密码,替换这里的值
$decode = $navicatPassword->decrypt('xxxx');
echo $decode."\n";
?>
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9月前
|
关系型数据库 MySQL 数据库
MySQL操作
MySQL操作
74 0
|
5月前
|
存储 关系型数据库 MySQL
【MySQL学习】MySQL表的操作
【MySQL学习】MySQL表的操作
54 1
|
8月前
|
关系型数据库 MySQL 数据库
MySQL相关操作
MySQL相关操作
|
10月前
|
SQL 关系型数据库 MySQL
【MySQL】不允许你不了解如何汇总数据(二)
【MySQL】不允许你不了解如何汇总数据(二)
58 0
|
10月前
|
SQL 关系型数据库 MySQL
【MySQL】不允许你不了解如何汇总数据(一)
【MySQL】不允许你不了解如何汇总数据(一)
38 0
【MySQL】不允许你不了解如何汇总数据(一)
|
关系型数据库 MySQL 索引
MySQL 只改一条数据我这么难的吗 (二)
MySQL 只改一条数据我这么难的吗 (二)
91 0
MySQL 只改一条数据我这么难的吗 (二)
|
SQL 关系型数据库 MySQL
MySQL必知必会排序检索数据
MySQL必知必会排序检索数据
107 0
|
关系型数据库 MySQL
mysql操作
mysql操作
88 0
|
SQL 关系型数据库 MySQL
【MySQL】MySQL对数据的基本操作
前两篇博客总结完了MySQL对数据的查询,包括基本查询和高级查询,我们终于结束了查询这一部分了,不过有一说一查询这一部分还是非常非常重要的,有了这部分的基础我们才能继续学习MySQL后面的知识,如果你还没有学习这部分那我建议你先去看一下,再回来继续学习。
【MySQL】MySQL对数据的基本操作
|
SQL JSON 关系型数据库