Mysql建库字符集和排序规则及说明
Lou_Lan 人气:0概述
我们在使用mysql的时候,尤其是在创建数据库的时候,我们需要选择当前数据库的字符集和排序规则,这样你库里面的创建数据表的时候默认的编码方式就是库选择好的。
我们这里旧按照navicat创建数据库的来说。(主要讲述中国的使用习惯)
由于汉字的特殊性,数量多等原因,我们一般在写代码或者写其它文档的时候都是选择***UTF-8***的编码方式,所以我们创建数据库的时候一般是选择UTF-8.但是我们可以看到数据床架的时候,字符集的选择有:utf8 以及 utf8mb4 这两种方式。
那么两种因该是选择哪一种呢,下面稍后看我给你吹(一般是utf8mb4)。
字符集选择结束之后我们还需要选择这个排序规则,我们都知道字符集是保存数据时候需要的编码方式,那么这个排序规则是干什么用的呢?
排序规则
是指对指定字符集下不同字符的比较规则。其特征有以下几点
- 1.两个不同的字符集不能有相同的排序规则
- 2.两个字符集有一个默认的排序规则
- 3.有一些常用的命名规则。如_ci结尾表示大小写不敏感(caseinsensitive),_cs表示大小写敏感(case sensitive),_bin表示二进制的比较(binary).
那么排序的规则应该怎么选择,也看下面我给你吹。
字符集的选择
概述中我们已经说了,在中国一般使用的编码方式大部分都是UTF-8,但是mysql的数据库中给出了两种选“utf8”,一个是“utf8mb4”。
根据查询资料得知mysql的“utf8”并不是我们常见到的UTF-8,反而“utf8mb4”是我们常用的UTF-8。
为什么会这样呢?
根据查询得知MYSQL中的“utf8”编码只支持每个字符最大3个字节的编码方式,而我们通常使用的UTF-8是每个字符最大4个字节的编码方式。
这个问题在我们中国看来就是一个bug,但是MYSQL并没有对这个bug进行修复,而是在2010年增加了一个新的字符集“utf8mb4”,这个才对应了我们常使用的UTF-8。
所以在我们这边,尤其是存储汉字的时候,需要使用的编码方式是“utf8mb4”。
#查询utf8和utf8mb4长度信息 SHOW CHARSET LIKE 'utf8%'; # 修改表的字符集 ALTER TABLE dm_user CONVERT TO CHARACTER SET utf8mb4;
排序规则
编码规则我就按照字符集是“utf8mb4”的继续说明,我们要说的字符集主要就三个:
utf8mb4_bin
utf8mb4_general_ci
utf8mb4_unicode_ci
1. utf8mb4_bin
bin的意思就是二进制的意思,也就是说排序查找的规则是按照二进制的方式进行查找的,这里就会涉及到我们常常说到的数据库里面的大小写区分。
比如说:
- a的二进制编码是: 01100001
- A的二进制编码是: 01000001
那么我们在执行
SELECT * FROM dm_user WHERE username='a'; SELECT * FROM dm_user WHERE username='A';
这两条sql语句的结果是不一样的,因为a和A的二进制编码是不一样的。
2. utf8mb4_unicode_ci 和 utf8mb4_general_ci
首先要说明的是,这两种排序规则都是不区分大小写的,也就是说在这两种排序规则下,a和A是一样的。
根据资料了解,这两种排序规则要从两个方面来看,一个是准确性,一个是性能。两种排序规则的说明链接
准确性
- utf8mb4_unicode_ci 是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序。
- utf8mb4_general_ci 没有实现Unicode排序规则,在遇到某些特殊语言或字符是,排序结果可能不是所期望的。
utf8mb4_unicode_ci使用unicode规则进行排序和比较,它使用相当复杂的算法在各种语言中以及在使用各种特殊字符时进行正确排序。
这些规则需要考虑到特定语言的约定,并不是每个人都按照我们所说的“字母顺序”对字符进行排序。就拉丁语(即“欧洲”)而言,MySQL中的Unicode排序和简化的utf8mb4_general_ci排序没有太大区别,但仍有一些区别:
例如:Unicode排序规则按使用这些字符的人通常希望的方式将“ß”排序为“ss”,将“Œ”排序为“OE”,而utf8mb4_general_ci将它们排序为单个字符(可能分别类似于“s”和“e”)。
一些Unicode字符被定义为可忽略字符,这意味着它们不应计入排序顺序,而应将比较移到下一个字符。utf8mb4_unicode_ci可以正确处理这些问题。在非拉丁语言(如亚洲语言或不同字母表的语言)中,Unicode排序和简化的utf8mb4_ci排序之间可能有更多的差异。utf8mb4_-general_ci的适用性将在很大程度上取决于所使用的语言。对某些语言来说,这是相当不够的。
性能
- utf8mb4_general_ci 在比较和排序的时候更快
- utf8mb4_unicode_ci 在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
以前我们使用general方式的排序,是受限于cpu的速度,所以使用更快的排序规则,但是就目前的服务器而言,cpu的速度已经可以忽略这两种排序规则的速度差异了,所以个人也认为unicode规则会更好一点
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
加载全部内容