Skip to content
楷图 · KaiTu
Go back

MySQL Collation 问题

问题描述

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 按照下面的方式选择表字符集和校对规则:

  1. 如果指定了 CHARACTER SET XCOLLATE Y,那么采用 CHARACTER SET XCOLLATE Y
  2. 如果指定了 CHARACTER SET X 而没有指定 COLLATE Y,那么采用 CHARACTER SET XCHARACTER SET X 的默认校对规则。
  3. 否则,采用服务器字符集和服务器校对规则。

建议 collation 都尽量采用字符集相应的 bin 类型的校对规则,这样不容易出错。因此,根据你的列内容需要建立相应的 collation:

ALTER TABLE artist
  MODIFY artist_name VARCHAR(255)
  CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;

本文为 2014 年老博客搬迁归档,保留原文以供参考。


Share this post:

Previous Post
Mac 下 Emacs 字体设置