Прослеживание пробелов в 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 решают эту проблему.
Вы можете прочитать больше здесь.