MySQL新建数据库|字符集&排序规则
前言
有过新建过的数据库的小伙伴对这张图肯定不陌生了,但关于字符集和排序规则一般是直接忽略呢,还是有去了解,然后根据自身业务特点设置相应字符集或者排序规则?
分析
以上图为例子,我是基于mysql8.0新建对的,然后字符集和排序规则都不设置,新建后,你会发现mysql默认设置为如下值:
字符集 :utf8mb4排序规则:utf8mb4_0900_ai_ci
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
字符集 utf8mb4和utf8
以utf8为例,它最多支持 3 个字节,当你存4字节的 utf8 编码字符时,会入库失败(常见的如:emoji ),在2010年重新发布了 utf8mb4 支持utf8。
其他字符集
使用如下指令可以查看mysql支持的其他字符集及每个字符集对应的默认的排序集合。
show character set;
排序规则
关于排序规则命名,通常都是在相应的字符集后面加上下划线_排序方式,常见的有如下三种方式:
ci结尾
ci结尾表示大小写不敏感(case insensitive),这点也是程序往往容易忽略的一个bug,大部分场景下,特别是模糊搜索时,我们可能更希望搜索a时,a和A都会出现,但有些特殊情况,我们只希望出现a,而这时如果程序中没有做特殊处理,你查出来相当于有多条数据,却只映射到一个对象时,此时程序会抛出异常又或者查出了多条数据,当你程序没有特殊处理,只默认处理第一条此时会出现不该出现的数据展现了出来。
ca结尾
cs表示大小写敏感(case sensitive)
bin结尾
bin表示字符串每个字符串用二进制数据编译存储,区分大小写,而且可以存二进制的内容。
乱序问题
关于mysql乱序问题,在初学时真的有点头疼,有时你会发现,照着别人的文章,一毛一样的设置,结果文章可以成功,而你的却不行。(这时脾气火爆的小哥哥小姐姐可能就直接口吐芬芳了)还有一种情况,你尝试某个方法成功后,下次遇到时,再进行一毛一样的操作,你会发现这次不灵了。
乱序问题除了我们程序的编码问题外,mysql里头也有好几个地方涉及到字符集的操作:
character_set_server:mysql server(服务端)默认字符集,可以用如下命令查看:
show variables like 'character_set_server'
character_set_database:数据库默认字符集。
show variables like 'character_set_database'
character_set_client:客户端发送的查询使用的字符集。
show variables like 'character_set_client'
character_set_connection:MySQL Server接收客户端发布的查询请求后,将其转换为character_set_connection变量指定的字符集。
show variables like 'character_set_connection'
character_set_results:mysql server把结果集和错误信息转换为character_set_results指定的字符集,并发送给客户端。
show variables like 'character_set_results'
character_set_system:系统元数据(字段名等)字符集
show variables like 'character_set_system'
上述的某个阶段和其他阶段设置的字符集和不一致的时候,都可能出现乱序现象。
原创文章,作者:筱凯,如若转载,请注明出处:https://www.jingyueyun.com/ask/421.html