我最近遇到了一个问题,我注意到 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
这是我运行的示例查询(不是生产用途,但显示了我要修复的内容):
SELECT foo, CHAR_LENGTH(foo) FROM myTable
WHERE foo='bar'
GROUP BY foo
这将返回一个结果集:
| foo | CHAR_LENGTH(foo) |
+------+-------------------+
| Bar | 4 |
一切都很好,除了“酒吧”的长度是三,而不是四。所以我去检查个人条目(没有分组):
SELECT foo, CHAR_LENGTH(foo) FROM myTable
WHERE foo='bar'
| foo | CHAR_LENGTH(foo) |
+------+-------------------+
| Bar | 3 |
| Bar | 3 |
| Bar | 3 |
| Bar | 4 |
| Bar | 3 |
现在,Bar 有五个条目,其中四个正确报告长度为 3。但有一个报告长度为 4。
事实证明,长度为 4 的末尾有一个空格:“Bar”。我本来希望GROUP BY
将其视为完全不同的值,而不是将其与其他“酒吧”混为一谈。
如果它们有尾随(或前导)空格,有没有办法告诉 MySQL 考虑不同的值?
(在 mac osx 上运行 mysql 5.1.55 64 位)
char
值在存储时被空格填充,因此在检索值时假定所有尾随空格都被填充和删除。varchar
字段将保留尾随空格,但默认情况下将其删除以进行比较。(见The CHAR and VARCHAR types
)要保留
varchar
值的尾随空格,请使用binary
运算符。类似的东西SELECT foo, CHAR_LENGTH(foo) FROM myTable WHERE foo='bar' GROUP BY BINARY foo
应该做你想做的事。该
GROUP BY
子句可以是多个字段和/或计算字段: