mysql的charset和collation

这两天在MySQL的字符集碰到了点麻烦,花了点时间了解了一下。

charset

characterset 指字符集,一个字符集定义了可以表示的所有字符,比如ascii,unicode等,它并没有指定具体的实现。以unicode为例,它有utf8,utf16等具体实现方式,最为广泛使用的就是utf8格式,它是一种变长编码的方式,可以用两个或者四个字节表示一个unicode字符,具体实现可以在网上找到很多资料,这里就不说了。
由于历史原因,mysql的utf8编码并不是标准的utf8,它只用3个字节表示一个Unicode字符,这不能表示😀😉🚗这样的emoj字符,之后又添加了一个utf8mb4作为标准的utf8。

collation

为每个字符定义了格式,这就够了吗?当然不够,我们不但需要给每个字符分配编码,让它们能存储、能传输,还需要定义一套关系来组织它们,找到它们之间的联系。这套关系的定义,就是collation。
collation定义了哪个字符和哪个字符是等价的,比如指定“大小写不敏感”,那么a和A就是等价的,这样查找时就会方便很多。世界上还有许多文字,有的有不同的音调,指定不区分音调时,e、ē、é、ě、è就是等价的,我们去查找e,也会找到ē、é、ě、è。
以utf8mb4_0900_ai_ci为例,utf8mb4指字符集编码格式,0900指的是Unicode的9.0版本,ai指accent insensitivity,即“不区分音调”,而ci表示case insensitivity,也就是“不区分大小写”。utf8mb4_unicode_ci类似。
在MySQL8之后,默认的character和collation是utf8mb4和utf8mb4_0900_ai_ci。

更改characterset 和 collation

一般来说我们在创建数据库时就应该指定它的characterset和collation

CREATE DATABASE db_name  CHARACTER SET utf8mb4  COLLATE utf8mb4_unicode_ci 

如果创建时用了其他的字符集,更改需要同时修改字段,表

ALTER TABLE db_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE db_table CHANGE `name` `name` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

posted on 2020-11-10 16:10  acgq  阅读(1018)  评论(0)    收藏  举报

导航