【问题标题】:Can someone explain why MySQL returns both values when name = 'test': "test" and "test "有人可以解释为什么 MySQL 在 name = 'test': "test" 和 "test" 时返回两个值
【发布时间】:2009-02-27 03:01:01
【问题描述】:

我有以下表格和数据:

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。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    来自mysql手册:

    请注意,所有 MySQL 排序规则都是 PADSPACE 类型。这意味着 MySQL 中的所有 CHAR 和 VARCHAR 值都会在不考虑任何尾随空格的情况下进行比较。

    请注意,在 5.0.3 或更高版本中,MySQL 确实删除尾随空格,它们被存储,但在比较期间不使用:

    VARCHAR 值在存储时不会被填充。尾随空格的处理取决于版本。从 MySQL 5.0.3 开始,按照标准 SQL,在存储和检索值时保留尾随空格。在 MySQL 5.0.3 之前,当值存储到 VARCHAR 列中时,它们会从值中删除尾随空格;这意味着检索到的值中也没有空格。

    这两个引用都来自手册的这一页:10.4.1. The CHAR and VARCHAR Types

    【讨论】:

      【解决方案2】:

      MySQL 从 varchar 列的末尾删除空格 - 不完全确定为什么在 MySQL 中以这种方式实现 - 显然不是 ANSI 标准。

      如果您想保留尾随空格,您可以选择使用字符或文本字段。

      编辑:我相信这已经改变了as of version 5.0.3

      【讨论】:

        【解决方案3】:

        使用 BINARY 关键字:

        SELECT * FROM test WHERE BINARY name = 'test';

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-25
          • 1970-01-01
          • 2012-02-21
          • 1970-01-01
          • 2011-03-25
          • 2021-10-04
          • 1970-01-01
          相关资源
          最近更新 更多