0%

mysql中utf8和utf8mb4区别,并批量修改数据库中所有字段的编码

写在前面,昨晚睡前突然意识到一件事儿,以前看的那些书已经在潜移默化间改变了我的思维和言行。比如现在我思考一件事儿,会在脑海中自动将从前书中的一些经验映射到现实,像是我曾经经历过一样。在与人谈话时它们的影响最明显,”腹有诗书气自华”大概就是这种感觉。

utf8和utf8mb4

utf8编码最大字符长度为3字节,三个字节的UTF-8最大能编码的 Unicode字符是0xffff,也就是Unicode中的基本多文种平面(BMP)。也就是说:任何不在基本多文本平面的Unicode字符,都无法使用Mysqlutf8字符集存储。包括Emoji表情,和很多不常用的汉字,以及任何新增的 Unicode字符等等

mysql最早只支持utf8utf8mb4是在Mysql-5.5.3版本后引入的,mb4就是most bytes 4的意思,专门用来兼容四字节的unicodeutf8mb4utf8的超集,因此将字符编码从utf8变更为utf8mb4对原先的数据没有任何影响。

另外关于utf8utf8mb4的排序规则问题,参考mysql中utf8和utf8mb4的区别-癫Point的解释:

utf8_unicode_ci 比较准确,utf8_general_ci 速度比较快,通常情况下 utf8_general_ci 的准确性就够我们用的了。如果是utf8mb4那么对应的就是 utf8mb4_general_ciutf8mb4_unicode_ci

批量修改数据库中所有字段的编码

开始的时候我是一个个手动改的,但是改了两个表之后,发现后面居然还有几十张表等着我,不由瑟瑟发抖…

直接使用下面的sql可以生成alert语句,

1
2
3
4
5
6
7
8
9
10
SELECT
CONCAT(
'ALTER TABLE ',
TABLE_NAME,
' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;'
)
FROM
information_schema.`TABLES`
WHERE
TABLE_SCHEMA = '这里填数据库名';

执行上面语句后的结果,直接复制并执行,或者导出为sql文件然后执行即可。

参考文章

mysql中utf8和utf8mb4的区别-癫Point
Mysql中utf8和utf8mb4区别-朽木自雕