MySQL区分大小写的查询

Mic*_*iao 172 mysql case-sensitive

之前已经在本网站上询问过,但我找不到足够的答案.如果我正在进行如下查询:

Select Seller from Table where Location = 'San Jose'
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它只返回位置'圣何塞'而不是'圣何塞'或其他东西的卖家?

小智 412

默认情况下,MySQL查询不区分大小写.以下是一个寻找"价值"的简单查询.但它会返回'VALUE','value','VaLuE'等...

SELECT * FROM `table` WHERE `column` = 'value'
Run Code Online (Sandbox Code Playgroud)

好消息是,如果您需要进行区分大小写的查询,则使用BINARY运算符非常容易,这会强制逐字节比较:

SELECT * FROM `table` WHERE BINARY `column` = 'value'
Run Code Online (Sandbox Code Playgroud)

  • 1) 为此目的使用 `binary` 是有风险的,因为它实际上是要比较两个字符串的字节。如果您的默认服务器/会话字符集与列的字符集不匹配,则重音字符将被视为不相等(即 latin1 中的 ü 是“0xFC”,而在 utf8mb4 中它是“0xC3Bc”)。2)正如神仙在下面指出的那样,您应该将转换应用于参数而不是列。它将具有相同的功能效果,但如果您的列中存在索引,它将允许查询使用索引。 (3认同)

小智 81

为了改善詹姆斯的出色答案:

最好放在BINARY常数之前代替:

SELECT * FROM `table` WHERE `column` = BINARY 'value'
Run Code Online (Sandbox Code Playgroud)

放在BINARY前面column会阻止在该列上使用任何索引.

  • 如何将其添加到“LIKE”中? (2认同)
  • @Purushotamrawat只需用LIKE替换= ... SELECT*FROM`table` WHERE`column` LIKE BINARY'%value%' (2认同)

Tho*_*wes 22

虽然列出的答案是正确的,但我可以建议,如果您的列要保存区分大小写的字符串,请阅读文档并相应地更改表定义.

在我的情况下,这相当于将我的列定义为:

`tag` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ''
Run Code Online (Sandbox Code Playgroud)

在我看来,这是优先调整您的查询.

  • 我编辑修复了我非常确定的愚蠢错字,这恰恰与你想说的相反.我觉得我应该通知你,(因为这是一个两个字符的更改,网站不会自动通知你).假设您对这一变化感到满意,请随意将我的评论标记为过时并让它变得有意义.(如果我搞砸了,请对我大喊大叫.) (3认同)
  • 这应该是公认的答案. (2认同)