Может кто-нибудь объяснить, почему MySQL возвращает оба значения, когда name = 'test': "test" и "test" - PullRequest
0 голосов
/ 27 февраля 2009

У меня есть следующая таблица и данные:

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 ]

4 голосов
/ 27 февраля 2009

Из руководства по mysql:

Обратите внимание, что все параметры сортировки MySQL имеют тип PADSPACE. Это означает, что все значения CHAR и VARCHAR в MySQL сравниваются без учета конечных пробелов.

Обратите внимание, что MySQL не удаляет завершающие пробелы в версии 5.0.3 или выше, они сохраняются, но не используются при сравнении:

Значения VARCHAR не заполняются при сохранении. Обработка конечных пробелов зависит от версии. Начиная с MySQL 5.0.3, конечные пробелы сохраняются при сохранении и получении значений в соответствии со стандартным SQL. До MySQL 5.0.3 конечные пробелы удаляются из значений, когда они хранятся в столбце VARCHAR; это означает, что пробелы также отсутствуют в извлеченных значениях.

Обе эти цитаты взяты из этой страницы руководства: 10.4.1. Типы CHAR и VARCHAR

2 голосов
/ 27 февраля 2009

MySQL удаляет пробелы из конца столбцов varchar - не совсем уверен, почему это реализовано в MySQL - явно не стандарт ANSI.

Вы можете использовать символьные или текстовые поля, если хотите сохранить конечные пробелы.

РЕДАКТИРОВАТЬ: Я считаю, что это было изменено с версии 5.0.3

1 голос
/ 27 февраля 2009

Используйте ключевое слово BINARY:

ВЫБРАТЬ * ИЗ ТЕСТА, ГДЕ Двоичный файл имя = 'тест';

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...