前几天一位做安卓的前同事,闲来无事问我了解php+mysql的开发。说到mysql数据库的创建,问我字符集和字符集规则是什么意思,我跟他说为了保证我们的项目对字符集的兼容性,防止数据库存储乱码,mysql数据库和数据表都会将字符集设置成UTF8格式,如下图:
但是我一直忽略了字符集下一列的“字符规则”这一列,也是,开发过这么多年,排序规则那一列一直是默认的,貌似也没出现过什么问题。当时就那位同事说没事,那个不用改,用默认的就行……
今天中午利用午休的时间,来了解以下这个“排序规则”到底是做什么用的。
在网上一搜索,才了解到这个utf8_bin相比utf8_unicode_ci以及其它utf8_****_ci之间的区别。
utf8_bin: 对内容区分大小写,可存储二进制内容。
utf8_general_cs:即存储的内容字符集普遍兼容模式,cs则是case sensitive的缩写,意为识别时区分大小写。
utf8_unicode_ci:内容为可存储unicode编码,ci即caseinsensitive的缩写,意思为不区分大小写。
utf8_spanish_ci:适用于西班牙通用编码,ci不区分大小写。
utf8_turkish_ci:适用于土耳其通用编码。
……更多……
大小写敏感测试
例如:我们创建一个数据表student,字段(嗯,注意是字段设置的排序规则,而不仅仅是表的排序规则)设置为utf8_bin。
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(255) COLLATEutf8_binDEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
INSERT INTO `student` VALUES ('1', 'xiaoming');
INSERT INTO `student` VALUES ('2', 'lily');
INSERT INTO `student` VALUES ('3', 'Xiaoming');
INSERT INTO `student` VALUES ('4', 'Lebron James');
INSERT INTO `student` VALUES ('5', 'Kobe');
mysql> select * from student;
+----+--------------+
| id | name |
+----+--------------+
| 1 | xiaoming |
| 2 | lily |
| 3 | Xiaoming |
| 4 | Lebron James |
| 5 | Kobe |
+----+--------------+
5 rows in set
此时name字段的字符排序为utf8_bin,此时大小写敏感。
mysql> select * from student where name like '%kobe%';
Empty set
当查询kobe时,Kobe的内容便不会匹配上。
当我们修改name的字符排序为utf8_unicode_ci时,大小写不敏感。则能查询到数据。
mysql> ALTER TABLE `student`
MODIFY COLUMN `name` char(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL AFTER `id`;
mysql> select * from student where name like '%xiaoming%';
+----+----------+
| id | name |
+----+----------+
| 1 | xiaoming |
| 3 | Xiaoming |
+----+----------+
mysql> select * from student where name like '%kobe%';
+----+------+
| id | name |
+----+------+
| 5 | Kobe |
+----+------+
我们在选用字段字符排序时,根据项目存储的数据的使用场景,来选择字符集排序方式。utf8_bin建议存储一些文件二进制内容,或者文件流是使用(预计也很少有这么用的),utf8_unicode_ci个人建议广泛使用,例如存储人物姓名、电子邮箱地址时,对于数据的检索很有用,这也是为什么mysql默认就是兼容大小写不敏感查询的原因吧。utf8_general_cs如有特殊需要,建议存储类似十六进制、md5值时存储,其实如有特殊要求时在检查使用就可以。
个人观点整理,如有纰漏或观点不同,欢迎提出。