有人可以解释为什么MySQL在name ='test'时返回两个值:“test”和“test”

时间:2009-02-27 03:01:02

标签: mysql

我有以下表格和数据:

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。

3 个答案:

答案 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';