MySQL SELECT DISTINCT是否区分大小写?

21

我该如何使MySQL的SELECT DISTINCT区分大小写?

create temporary table X (name varchar(50) NULL);
insert into X values ('this'), ('This');

现在这个查询:

select distinct(name) from X;

结果为:

this

这是怎么回事?我想让SELECT DISTINCT区分大小写。难道这不应该是默认设置吗?


可能是["SELECT DISTINCT" ignores different cases]的重复问题。 - Cees Timmerman
3个回答

35

使用BINARY运算符即可实现:

SELECT DISTINCT(BINARY name) AS Name FROM X;

在选择时您也可以使用CAST操作:

SELECT DISTINCT 
(CAST(name AS CHAR CHARACTER SET utf8) COLLATE utf8_bin) AS Name FROM X;

查看此SQLFiddle


4
这段话的意思是,虽然BINARY函数简单易用,但是它会破坏非ASCII字符。例如,如果我们使用(entrée,Entrée)而不是('this','This'),那么SELECT DISTINCT(BINARY(...))将返回二进制数据。因此,你可以像@roberto-navarro建议的那样使用COLLATE函数来替代BINARY函数,从而避免这个问题。具体做法是在查询语句中使用如下代码:SELECT DISTINCT NAME COLLATE latin1_bin FROM X; - ishmael
1
每天学点新东西...我从不知道这是发生的事情...现在我的生活变得完整了。 - openwonk
1
@ishmael 我认为这应该是一个独立的答案,对我来说这是最快和最简单的方法! - Daniel Black

9
我更希望更新列定义为区分大小写冲突。
就像这样:
create table X (name VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_bin NULL);
insert into X values ('this'), ('This'); 

SQLFiddle: http://sqlfiddle.com/#!2/add276/2/0


2
您可以使用哈希函数(MD5)并在其上进行分组。
SELECT Distinct(MD5(Cat)), Cat FROM (
  SELECT 'Cat'
    UNION ALL
  SELECT 'cat'
) AS BOW

SQL输出:

这里输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接