问题描述
MySQL 中有时会发生这种问题:Beyoncé 在插入数据库时出现 Duplicate key,原因是在那个 unique 的列上没有设定 collation,而且表中已经有了 Beyonce 这样的项目。
虽然这里应该将两个 merge 在一起,但是在数据库设计时还是应该注意这一点,在必要时设定 collation。
MySQL Collation 的命名规则
它们以其相关的字符集名开始,通常包括一个语言名,并且以 _ci(大小写不敏感)、_cs(大小写敏感)或 _bin(二元)结束。
比如 latin1 字符集有以下几种校对规则:
| 校对规则 | 含义 |
|---|---|
latin1_german1_ci | 德国 DIN-1 |
latin1_swedish_ci | 瑞典 / 芬兰 |
latin1_danish_ci | 丹麦 / 挪威 |
latin1_german2_ci | 德国 DIN-2 |
latin1_bin | 符合 latin1 编码的二进制 |
latin1_general_ci | 多种语言(西欧) |
latin1_general_cs | 多种语言(西欧 ISO),大小写敏感 |
latin1_spanish_ci | 现代西班牙 |
MySQL 按照下面的方式选择表字符集和校对规则:
- 如果指定了
CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。 - 如果指定了
CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。 - 否则,采用服务器字符集和服务器校对规则。
建议 collation 都尽量采用字符集相应的 bin 类型的校对规则,这样不容易出错。因此,根据你的列内容需要建立相应的 collation:
ALTER TABLE artist
MODIFY artist_name VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;
本文为 2014 年老博客搬迁归档,保留原文以供参考。