有没有办法让 MySQL GROUP BY 利用尾随空格?

Der*_*ney 6 mysql

我最近遇到了一个问题,我注意到 MySQL 在发出 GROUP BY 时会忽略尾随空格。这是表:

CREATE TABLE `myTable` (
 `id` int(10) unsigned NOT NULL,
 `foo` varchar(255) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

这是我运行的示例查询(不是生产用途,但显示了我正在尝试修复的内容):

SELECT foo, CHAR_LENGTH(foo) FROM myTable
WHERE foo='bar'
GROUP BY foo
Run Code Online (Sandbox Code Playgroud)

这将返回一个结果集:

| foo  | CHAR_LENGTH(foo)  |
+------+-------------------+
| Bar  |                 4 |
Run Code Online (Sandbox Code Playgroud)

一切都很好,除了“酒吧”的长度是三,而不是四。所以我去检查了个人条目(没有分组):

SELECT foo, CHAR_LENGTH(foo) FROM myTable
WHERE foo='bar'

| foo  | CHAR_LENGTH(foo)  |
+------+-------------------+
| Bar  |                 3 |
| Bar  |                 3 |
| Bar  |                 3 |
| Bar  |                 4 |
| Bar  |                 3 |
Run Code Online (Sandbox Code Playgroud)

现在,Bar 有五个条目,其中四个正确报告长度为 3。但有一个报告长度为 4。

事实证明,长度为 4 的那个末尾有一个空格:“Bar”。我本来希望GROUP BY将其视为完全不同的值,而不是将其与其他“酒吧”混为一谈。

如果它们有尾随(或前导)空格,有没有办法告诉 MySQL 考虑不同的值?

(在 mac osx 上运行 mysql 5.1.55 64 位)

小智 10

char值在存储时被空格填充,因此所有尾随空格都被假定为填充并在检索值时被删除。 varchar字段将保留尾随空格,但默认情况下它会被删除以进行比较。(见The CHAR and VARCHAR types

要保留varchar值的尾随空格,请使用binary运算符。像SELECT foo, CHAR_LENGTH(foo) FROM myTable WHERE foo='bar' GROUP BY BINARY foo应该做你想做的事情。