mysql字段字符集utf8_bin和utf8_unicode_ci的区别

   前几天一位做安卓的前同事,闲来无事问我了解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值时存储,其实如有特殊要求时在检查使用就可以。

个人观点整理,如有纰漏或观点不同,欢迎提出。

你可能感兴趣的:(mysql字段字符集utf8_bin和utf8_unicode_ci的区别)