MySQL, где запрос нечувствителен к регистру полей! ! !

MySQL

не могу сказать нет

Сегодня, работая сверхурочно, к нам пришла деловая девушка, чтобы проверить данные, сказав, что количество найденных данных неверно. Взгляд на SQL девушки написан так:

select distinct * from prvt_pub_stmt_vn
where issue_time >= '2020-08-01'
and issue_time <= '2020-08-01'
and prs_dmtd_cde in ('p','n');

Я анализировал-анализировал, и чувствую, что проблемы нет, поэтому я проверил значение кода поля prs_dmtd_cde, и обнаружил, что есть не только прописные P, но и строчные ps, в то время как девушка проверяла только строчные p, но количество данных гораздо больше.

Поэтому я изменил SQL девушки:

select distinct * from prvt_pub_stmt_vn
where issue_time >= '2020-08-01'
and issue_time <= '2020-08-01'
and prs_dmtd_cde in ('p','n','P','N');

Результаты оказались такими же. Это оно. . .

Конечно, при девушке нельзя отказать, так что пусть девушка вернется и посмотрит.

Я быстро проверил Интернет и обнаружил, что проблема связана с форматом кодирования и сопоставлением MySQL.

знаю, почему

Наша база данных MySQL в основном использует формат кодировки utf8, и в формате кодировки utf8 существуют различные правила сопоставления. Обычно используются следующие:

utf8_bin: хранить каждый символ в строке в шестнадцатеричном формате с учетом регистра.

utf8_general_ci: без учета регистра, ci — это аббревиатура от нечувствительный к регистру, то есть нечувствительный к регистру.

Еще раз проверьте настройки кодировки по умолчанию:

Бывает, что сортировка по умолчанию формата кодировки utf8 такая: utf8_general_ci — то есть без учета регистра.

решение

Если причина проблемы будет найдена, будет лучше назначить правильное средство.

Решение, естественно, состоит в том, чтобы напрямую изменить атрибут сопоставления поля на utf8_bin.

ALTER TABLE prvt_pub_stmt_vn CHANGE prs_dmtd_cde prs_dmtd_cde VARCHAR(255) 
CHARACTER SET utf8 COLLATE utf8_bin;

Другим решением является изменение SQL вместо изменения исходной структуры таблицы. Поставьте перед полем запроса бинарное ключевое слово.

select distinct * from prvt_pub_stmt_vn
where issue_time >= '2020-08-01'
and issue_time <= '2020-08-01'
and binary prs_dmtd_cde in ('p','n');

Запрос по умолчанию Mysql нечувствителен к регистру, вы можете добавить двоичный файл к оператору SQL, чтобы он был чувствителен к регистру.

binary — это не функция, это оператор преобразования типа, который используется для того, чтобы заставить строку, стоящую за ним, быть двоичной строкой, что можно понимать как чувствительное к регистру при сравнении строк.

Наконец

Проблема решается, конечно, чтобы рассказать девушке, насколько глубока проблема, и как я проанализировал принцип и, наконец, решил ее.

Глядя на восторженные глаза девушки, я, конечно же, очень счастлив.

Самое главное помнить об этой проблеме.В будущем, когда вы столкнетесь с делом, чувствительным к регистру в полях, вам следует обратить внимание на выбор набора символов и сопоставления при построении таблицы, чтобы такого не произошло. сегодня.