Наиболее правильный способ сравнения строк с учетом регистра без изменения параметров сортировки запрашиваемого столбца - это явное указание набора символов и параметров сравнения для значения, с которым сравнивается столбец.
select * from `table` where `column` = convert('value' using utf8mb4) collate utf8mb4_bin;
Почему бы не использовать binary
?
Использование оператора binary
нецелесообразно, поскольку оно сравнивает фактические байты кодированных строк.Если вы сравните фактические байты двух строк, закодированных с использованием разных наборов символов, две строки, которые следует считать одинаковыми, могут быть не равны.Например, если у вас есть столбец, который использует набор символов latin1
, а ваш набор символов сервера / сеанса равен utf8mb4
, то при сравнении столбца со строкой, содержащей акцент, такой как 'café', он не будет соответствовать строкамсодержащий ту же строку!Это связано с тем, что в latin1
é кодируется как байт 0xE9
, а в utf8
это два байта: 0xC3A9
.
Зачем использовать convert
, а также collate
?
Сопоставления должны соответствовать набору символов.Поэтому, если ваш сервер или сеанс настроен на использование набора символов latin1
, вы должны использовать collate latin1_bin
, но если ваш набор символов utf8mb4
, вы должны использовать collate utf8mb4_bin
.Поэтому наиболее надежное решение - всегда преобразовывать значение в наиболее гибкий набор символов и использовать двоичное сопоставление для этого набора символов.
Зачем применять convert
и collate
к значению, а не кcolumn?
Когда вы применяете любую функцию преобразования к столбцу перед сравнением, он не позволяет обработчику запросов использовать индекс, если он существует для столбца, что может значительно замедлить ваш запрос.Поэтому всегда лучше преобразовывать значение, где это возможно.Когда выполняется сравнение между двумя строковыми значениями, и одно из них имеет явно заданное сопоставление, механизм запросов будет использовать явное сопоставление независимо от того, к какому значению оно применяется.
Accent Sensitivity
Важно отметить, что MySql не только нечувствителен к регистру для столбцов, использующих параметры сортировки _ci
(как правило, по умолчанию), но также нечувствителен к accent .Это означает, что 'é' = 'e'
.Использование двоичного сопоставления (или оператора binary
) сделает сравнение строк чувствительным к акценту, а также к регистру.
Что такое utf8mb4
?
Набор символов utf8
в MySqlэто псевдоним для utf8mb3
, который в последних версиях устарел , поскольку он не поддерживает 4-байтовые символы (что важно для кодирования строк, таких как ?).Если вы хотите использовать кодировку UTF8 с MySql, вам следует использовать кодировку utf8mb4
.