MySQL DISTINCT 和重音符号

问题描述 投票:0回答:2

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

一张表

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;

该表中有两条记录:

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 和 É。

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

mysql character-encoding collation
2个回答
8
投票

表格排序规则设置为

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

MySQL 5.5 中有 3 种排序规则名称可用:

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

排序规则必须更改为

utf8_bin
。可以使用此查询对表和所有列执行此操作:

ALTER TABLE hotels CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

0
投票

在不更改表排序规则的情况下,您可以使用

DISTINCT
:
 查询 
CAST

SELECT DISTINCT(CAST(`name` AS CHAR CHARACTER SET utf8) COLLATE utf8_bin) `name`
FROM `hotels`
© www.soinside.com 2019 - 2024. All rights reserved.