Как проводить поиск Accent Sensitive в MySql
У меня есть таблица MySQL с общей сортировкой utf8. В таблице я вижу две записи:
Абаде
АБАД
Я использую запрос, который выглядит так:
SELECT * FROM `words` WHERE `word` = 'abád'
Результат запроса дает оба слова:
Абаде
АБАД
Есть ли способ указать, что я хочу только, чтобы MySQL находил акцентированное слово? Я хочу, чтобы запрос возвращал только
abád
Я также пробовал этот запрос:
SELECT * FROM `words` WHERE BINARY `word` = 'abád'
Это не дает мне никаких результатов. Спасибо за помощь.
Ответы
Ответ 1
Если ваши поисковые запросы в этом поле всегда будут чувствительны к акценту, тогда объявите сопоставление поля как utf8_bin (который будет сравнивать для равенства байты с кодировкой utf8) или используйте сопоставление, специфичное для языка, которое различает акцентированных и не-акцентированных персонажей.
col_name varchar(10) collate utf8_bin
Если обыски обычно нечувствительны к акцентам, но вы хотите сделать исключение для этого поиска, попробуйте
WHERE col_name = 'abád' collate utf8_bin
Ответ 2
В моей версии (MySql 5.0) не существует никакой комбинации charset utf8 для нечувствительных к регистру, чувствительных к акценту запросов. Единственным отличительным знаком для utf8 является utf8_bin. Однако он также чувствителен к регистру.
Моя работа заключалась в том, чтобы использовать что-то вроде этого:
SELECT * FROM `words` WHERE LOWER(column) = LOWER('aBád') COLLATE utf8_bin
Ответ 3
Ошибка MySQL для будущей ссылки http://bugs.mysql.com/bug.php?id=19567.
Ответ 4
SELECT * FROM `words` WHERE column = 'abád' collate latin1_General_CS
(или ваше сопоставление, включая cs)
Ответ 5
Вы можете попробовать найти шестую переменную символа, HEX() в mysql и использовать аналогичную функцию на вашем языке программирования и сопоставить их. Это работало хорошо для меня, когда я делал листинг, где человек мог выбрать первую букву человека.
Ответ 6
Хорошо, вы только что описали, что такое сортировка utf8_general_ci (a, á, à, â, ä, å все равно сравнению в сравнении).
В MySQL Server 5.1 также были внесены изменения в отношении utf8_general_ci и utf8_unicode_ci, поэтому он также зависит от версии сервера. Лучше проверьте документы.
Итак, если это MySQL-сервер 5.0, я бы пошел на utf8_unicode_ci вместо utf8_general_ci, что, очевидно, неверно для вашего прецедента.
Ответ 7
Я получал ту же ошибку.
Я изменил сопоставление моей таблицы с utf8_bin (через phpMyAdmin), и проблема была решена.
Надеюсь, это поможет!:)
Ответ 8
Убедитесь, что тип сортировки таблицы базы данных заканчивается на "_ci". Это означает, что регистр нечувствителен...
Измените его, чтобы сопоставить одно и то же или ближайшее имя без "_ci"...
Например... измените "utf8_general_ci" на "utf8_bin"
МКЭ
Ответ 9
Принятый ответ хорош, но будьте осторожны, что вам, возможно, придется использовать COLLATE utf8mb4_bin!
WHERE col_name = 'abád' collate utf8mb4_bin
Выше исправлены ошибки, например:
MySQL сказал: Документация 1253 - COLLATION 'utf8_bin' недействительна для CHARACTER SET 'utf8mb4'