не могу сказать нет
Сегодня, работая сверхурочно, к нам пришла деловая девушка, чтобы проверить данные, сказав, что количество найденных данных неверно. Взгляд на 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 — это не функция, это оператор преобразования типа, который используется для того, чтобы заставить строку, стоящую за ним, быть двоичной строкой, что можно понимать как чувствительное к регистру при сравнении строк.
Наконец
Проблема решается, конечно, чтобы рассказать девушке, насколько глубока проблема, и как я проанализировал принцип и, наконец, решил ее.
Глядя на восторженные глаза девушки, я, конечно же, очень счастлив.
Самое главное помнить об этой проблеме.В будущем, когда вы столкнетесь с делом, чувствительным к регистру в полях, вам следует обратить внимание на выбор набора символов и сопоставления при построении таблицы, чтобы такого не произошло. сегодня.