Прослеживание пробелов в varchar необходимо рассматривать в сравнении

Я использую таблицу с столбцом varchar. Я не понимал, что конечные пробелы не рассматриваются в сравнении (и что, по-видимому, два значения, которые отличаются только количеством конечных пробелов, будут нарушать свойство уникальности, если указано).

Мне нужно исправить это в таблице, желательно на месте. Есть ли рекомендуемый путь для исправления таблицы, подобной этой в MySQL?

Я обращаюсь к БД строго через программу, которую я контролирую, поэтому переключение на нечитаемый для чтения формат, такой как двоичный, будет в порядке. Но я не уверен, как это сделать и не хочу разрушать таблицу.

Ответы

Ответ 1

Я должен предположить, что вы используете MySQL 5.x, потому что MySQL 4.x не сохраняет конечные пробелы в столбце VARCHAR.

Используя стандартный оператор = в MySQL, как вы указали, конечные пробелы не учитываются:

SELECT 'this' = 'this ' возвращает TRUE

Однако LIKE сравнивает символ строк по символу, поэтому конечные пробелы значительны.

SELECT 'this' LIKE 'this ' возвращает FALSE.

Оба = и LIKE могут быть нечувствительны к регистру, используя настройку по умолчанию. Используйте предложение COLLATE, чтобы указать сортировку, если вам нужно сравнить их с учетом регистра.

Ответ 2

Не удалось запустить пустой запрос в поле таблицы с пробелами?

RTRIM(str) 

Возвращает строку str с завершающим удалены пробельные символы. MySQL > SELECT RTRIM ('barbar');         - > 'barbar' Эта функция является многобайтовой безопасностью.

Ответ 3

Сравнение базы данных играет важную роль в этом. У меня была похожая ситуация, и я понял, что набор символов = utf8mb4 и collation = utf8mb4_0900_as_cs решают эту проблему.

Вы можете прочитать больше здесь.