本系列基于5.7.20 版本来讲述MySQL的新特性,从安装,文件结构,SQL ,优化 ,运维层面 复制,等几个方面展开介绍5.7 的新特性和功能,同时也建议大家跟踪官方blog和文档,以尽快知悉其新的变化。
1 SQL_MODE的变化
5.7版本默认设置SQL_MODE为"ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
master (none) 09:44:16> show variables like 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.07 sec)
看着这么多的值很多DBA小伙伴是不是眼前一亮,这里说一下我测试过程中遇到的“坑”,其他的需要各位去探索。
STRICT_TRANS_TABLES 意思是说要存储的字段的长度大于字段定义的大小,直接报错而非像5.6版本以及之前,截断数据进行存储,同时抛出一个warning。
NO_AUTO_CREATE_USER 意思是不能像5.6 那样通过grants创建用户并赋权了,而是像Oracle那样,先create user,然后再对账号进行赋权。
5.7 对于null,'00000000 00:00:00' 这类default值的影响.工作中遇到很多开发的同学喜欢用'00000000 00:00:00'来作为默认时间,在5.6 版本之前可以,但是在5.7版本中会有一定的问题。
注意: 升级版本的时候 确保sql_mode 向前兼容,否则会和开发哥哥吵起来。
详细了解SQL_MODE 请移步《sql_mode官方文档》[2]
2 online ddl支持 rename index name
个人感觉这个功能比较不怎么实用,通常改变索引名称的时候,索引中的字段也需要调整,单独修改索引的情况比较少。
mysql> alter table yy rename index idxname to idxnm; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
3 新增内置的full text 插件,支持中文 ,韩文,日文全文索引。 之前的版本 只能依赖单词之间空格进行分词,对于依赖于语义分词而非空格分词的其他语言种类,5.7 版本的引入支持解析中文,韩文,日文的全文索引--ngram full-text parser解决了该问题。具体请移步《ngram Full-Text Parser》
[1] https://dev.mysql.com/doc/refman/5.7/en/mysql-nutshell.html
[2] https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-changes
相关文章