У меня есть функция, которая возвращает пять символов в смешанном регистре. Если я сделаю запрос по этой строке, он вернет значение независимо от регистра.
Как я могу сделать строковые запросы MySQL чувствительными к регистру?
У меня есть функция, которая возвращает пять символов в смешанном регистре. Если я сделаю запрос по этой строке, он вернет значение независимо от регистра.
Как я могу сделать строковые запросы MySQL чувствительными к регистру?
Ответы:
http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
источник
SELECT 'email' COLLATE utf8_bin = 'Email'
Хорошей новостью является то, что если вам нужно сделать запрос с учетом регистра, это очень легко сделать:
источник
convert(char(0x65,0xcc,0x88) using utf8)
(то естьe
с¨
добавлением) иconvert(char(0xc3,0xab) using utf8)
(то естьë
), но добавлениеBINARY
сделает их неравными.Ответ, опубликованный Крейгом Уайтом, имеет большой штраф
потому что он не использует индексы. Таким образом, либо вам нужно изменить порядок сортировки таблиц, как указано здесь https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html .
ИЛИ
Самое простое решение - использовать двоичный файл значения.
Например.
В.С.
1 ряд в наборе (0,00 сек)
источник
Вместо использования оператора = вы можете использовать LIKE или LIKE BINARY.
Это займет «а», а не «А» в своем состоянии
источник
Чтобы использовать индекс перед использованием BINARY, вы можете сделать что-то подобное, если у вас большие таблицы.
Подзапрос приведет к действительно небольшому нечувствительному к регистру подмножеству, из которого вы затем выбираете единственное чувствительное к регистру совпадение.
источник
Наиболее правильный способ сравнения строк с учетом регистра без изменения параметров сортировки запрашиваемого столбца - это явное указание набора символов и параметров сравнения для значения, с которым сравнивается столбец.
Почему бы не использовать
binary
?Использование
binary
оператора нецелесообразно, поскольку он сравнивает фактические байты кодированных строк. Если вы сравните фактические байты двух строк, закодированных с использованием разных наборов символов, две строки, которые следует считать одинаковыми, могут быть не равны. Например, если у вас есть столбец, который используетlatin1
набор символов, и ваш набор символов сервера / сеанса имеет значениеutf8mb4
, то при сравнении столбца со строкой, содержащей акцент, такой как 'café', он не будет совпадать со строками, содержащими эту же строку! Это потому, что вlatin1
é кодируется как байт,0xE9
но вutf8
нем два байта:0xC3A9
.Зачем использовать
convert
так же, какcollate
?Сопоставления должны соответствовать набору символов. Таким образом, если ваш сервер или сеанс настроен на использование
latin1
набора символов, который вы должны использовать,collate latin1_bin
но если ваш набор символов -utf8mb4
вы должны использоватьcollate utf8mb4_bin
. Поэтому наиболее надежное решение - всегда преобразовывать значение в наиболее гибкий набор символов и использовать двоичное сопоставление для этого набора символов.Почему применяется значение
convert
иcollate
к значению, а не к столбцу?Когда вы применяете любую функцию преобразования к столбцу перед выполнением сравнения, он не позволяет обработчику запросов использовать индекс, если он существует для столбца, что может значительно замедлить ваш запрос. Поэтому всегда лучше преобразовывать значение, где это возможно. Когда сравнение выполняется между двумя строковыми значениями, и одно из них имеет явно заданное сопоставление, механизм запросов будет использовать явное сопоставление независимо от того, к какому значению оно применяется.
Акцент Чувствительность
Важно отметить, что MySql не только нечувствителен к регистру столбцов, использующих параметры
_ci
сортировки (как правило, по умолчанию), но также нечувствителен к акценту . Это значит что'é' = 'e'
. Использование двоичного сопоставления (илиbinary
оператора) сделает сравнение строк чувствительным к акценту, а также к регистру.Что такое
utf8mb4
?Набор
utf8
символов в MySql - это псевдоним, дляutf8mb3
которого не рекомендуется в последних версиях, поскольку он не поддерживает 4-байтовые символы (что важно для кодирования строк, таких как 🐈). Если вы хотите использовать кодировку UTF8 с MySql, вам следует использоватьutf8mb4
кодировку.источник
Следующее для версий MySQL, равных или выше, чем 5.5.
Добавить в /etc/mysql/my.cnf
Все другие сопоставления, которые я пробовал, казались нечувствительными к регистру, работал только "utf8_bin".
Не забудьте перезапустить mysql после этого:
Согласно http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html есть также «latin1_bin».
"Utf8_general_cs" не был принят при запуске mysql. (Я читаю "_cs" как "чувствительный к регистру" - ???).
источник
Вы можете использовать BINARY с учетом регистра, как это
к сожалению, этот sql не может использовать индекс, вы будете страдать от снижения производительности запросов, зависящих от этого индекса
К счастью, у меня есть несколько хитростей, чтобы решить эту проблему
источник
Превосходно!
Я поделюсь с вами кодом из функции, которая сравнивает пароли:
источник
declare pSuccess BINARY;
в началеНе нужно ничего менять на уровне БД, просто нужно внести изменения в SQL Query, это будет работать.
Пример -
"SELECT * FROM <TABLE> where userId = '" + iv_userId + "' AND password = BINARY '" + iv_password + "'";
Двоичное ключевое слово сделает регистр чувствительным.
источник
По умолчанию mysql не чувствителен к регистру, попробуйте изменить языковую сортировку на
latin1_general_cs
источник