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;
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;