我有以下表格和数据:
CREATE TABLE `test` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(8) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
INSERT INTO `test` (`id`, `name`) VALUES (1, 'test');
INSERT INTO `test` (`id`, `name`) VALUES (2, 'test ');
当我执行以下任一查询时,它返回2行(两行):
SELECT * FROM test WHERE name = 'test';
SELECT * FROM test WHERE name IN ('test');
任何人都可以向我解释这个和/或如何修复它吗?
我正在运行MySQL 5.0.27。
答案 0 :(得分:4)
来自mysql手册:
请注意,所有MySQL排序规则都是PADSPACE类型。这意味着MySQL中的所有CHAR和VARCHAR值都会进行比较,而不考虑任何尾随空格。
请注意MySQL 不删除版本5.0.3或更高版本中的尾部空格,它们是存储的,但在比较期间不使用:
VARCHAR值在存储时不会填充。尾随空格的处理取决于版本。从MySQL 5.0.3开始,在存储和检索值时,将保留尾随空格,符合标准SQL。在MySQL 5.0.3之前,当存储到VARCHAR列中时,会从值中删除尾随空格;这意味着检索到的值也不存在空格。
这两个引用都来自本手册的这一页:10.4.1. The CHAR and VARCHAR Types
答案 1 :(得分:2)
MySQL从varchar列末尾删除空格 - 不完全确定为什么在MySQL中以这种方式实现 - 显然不是ANSI标准。
如果你想保留尾随空格,你可以使用字符或文本字段。
编辑:我认为这已经改变as of version 5.0.3
答案 2 :(得分:1)
使用BINARY关键字:
SELECT * FROM test WHERE BINARY name ='test';