MySQL DISTINCT 和重音符号

MySQL DISTINCT and accents

Debian 上的 MySQL 数据库 运行(版本 5.5.41-0+wheezy1-log)。

A table hotels 具有列 name VARCHAR(128) 并且引擎是 InnoDB。

CREATE TABLE `hotels` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT
  `name` varchar(128) NOT NULL DEFAULT '' COMMENT 'Hotel Name',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

这个table有两条记录:

1    BEST WESTERN PREMIER LE CARRE FOLIES OPERA
2    BEST WESTERN PREMIER LE CARRÉ FOLIES OPÉRA

执行 select DISTINCT name FROM hotels 时,查询仅返回 1 条记录,而应返回 2 条记录。

DBMS 似乎无法区分 E 和 É。

如何更改 table 设置以获得预期结果?

table 归类设置为 utf8_general_ci。这是 MySQL 服务器和架构的默认设置。

MySQL5.5 中有 3 个排序规则名称可用:

  • _ci结尾的名称表示排序规则不区分大小写。
  • _cs结尾的名称表示区分大小写。
  • _bin结尾的名称表示二进制排序规则。字符比较基于字符二进制代码值。

必须将排序规则更改为 utf8_bin。可以针对 table 和具有此查询的所有列完成此操作:

ALTER TABLE hotels CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;