10 ответов:
http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
набор символов по умолчанию и параметры сортировки latin1 и latin1_swedish_ci, поэтому небинарные сравнения строк по умолчанию нечувствительны к регистру. Это означает, что при поиске с col_name, например " a%", вы получаете все значения столбцов, которые начинаются с A или A. Чтобы сделать этот поиск чувствительным к регистру, убедитесь, что один из операндов имеет чувствительные к регистру или двоичные параметры сортировки. Например, если вы сравнивая столбец и строку, которые оба имеют набор символов latin1, вы можете использовать оператор COLLATE, чтобы заставить любой операнд иметь параметры сортировки latin1_general_cs или latin1_bin:
col_name COLLATE latin1_general_cs LIKE 'a%' col_name LIKE 'a%' COLLATE latin1_general_cs col_name COLLATE latin1_bin LIKE 'a%' col_name LIKE 'a%' COLLATE latin1_binЕсли вы хотите, чтобы столбец всегда обрабатывался с учетом регистра, объявите его с учетом регистра или двоичными параметрами сортировки.
хорошая новость заключается в том, что если вам нужно сделать запрос с учетом регистра, это очень легко сделать:
SELECT * FROM `table` WHERE BINARY `column` = 'value'
вместо использования оператора=, вы можете использовать LIKE или like BINARY
// this returns 1 (true) select 'A' like 'a' // this returns 0 (false) select 'A' like binary 'a' select * from user where username like binary 'a'он будет принимать "а", а не " а " в своем состоянии
ответ отправил Крейг Уайт, имеет большой штраф за производительность
SELECT * FROM `table` WHERE BINARY `column` = 'value'потому что он не использует индексы. Итак, либо вам нужно изменить параметры сортировки таблицы, как указано здесь https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html.
или
самое простое исправление, вы должны использовать двоичный код значения.
SELECT * FROM `table` WHERE `column` = BINARY 'value'например.
mysql> EXPLAIN SELECT * FROM temp1 WHERE BINARY col1 = "ABC" AND col2 = "DEF" ; +----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ | 1 | SIMPLE | temp1 | ALL | NULL | NULL | NULL | NULL | 190543 | Using where | +----+-------------+--------+------+---------------+------+---------+------+--------+-------------+VS
mysql> EXPLAIN SELECT * FROM temp1 WHERE col1 = BINARY "ABC" AND col2 = "DEF" ; +----+-------------+-------+-------+---------------+---------------+---------+------+------+------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------------+---------+------+------+------------------------------------+ | 1 | SIMPLE | temp1 | range | col1_2e9e898e | col1_2e9e898e | 93 | NULL | 2 | Using index condition; Using where | +----+-------------+-------+-------+---------------+---------------+---------+------+------+------------------------------------+ enter code here1 строка в наборе (0.00 сек)
чтобы использовать индекс перед использованием двоичного файла, вы можете сделать что-то вроде этого, если у вас есть большие таблицы.
SELECT * FROM (SELECT * FROM `table` WHERE `column` = 'value') as firstresult WHERE BINARY `column` = 'value'подзапрос приведет к очень маленькому нечувствительному к регистру подмножеству, из которого вы затем выберете единственное совпадение с учетом регистра.
ниже Для версий MySQL, равных или выше 5.5.
добавить в /etc / mysql / my.cnf
[mysqld] ... character-set-server=utf8 collation-server=utf8_bin ...все другие параметры сортировки, которые я пробовал, казались нечувствительными к регистру, работал только "utf8_bin".
Не забудьте перезапустить MySQL после этого:
sudo service mysql restartсогласно http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html Есть также"latin1_bin".
" utf8_general_cs " не был принят mysql запуск. (Я читал " _cs " как "чувствительный к регистру" - ???).
вы можете использовать двоичный с учетом регистра, как это
select * from tb_app where BINARY android_package='com.Mtime';к сожалению, этот sql не может использовать индекс, вы будете страдать от снижения производительности запросов, зависящих от этого индекса
mysql> explain select * from tb_app where BINARY android_package='com.Mtime'; +----+-------------+--------+------------+------+---------------+------+---------+------+---------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+--------+------------+------+---------------+------+---------+------+---------+----------+-------------+ | 1 | SIMPLE | tb_app | NULL | ALL | NULL | NULL | NULL | NULL | 1590351 | 100.00 | Using where | +----+-------------+--------+------------+------+---------------+------+---------+------+---------+----------+-------------+к счастью, у меня есть несколько трюков, чтобы решить эту проблему
mysql> explain select * from tb_app where android_package='com.Mtime' and BINARY android_package='com.Mtime'; +----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+ | 1 | SIMPLE | tb_app | NULL | ref | idx_android_pkg | idx_android_pkg | 771 | const | 1 | 100.00 | Using index condition | +----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+
отлично!
я делюсь с вами кодом из функции, которая сравнивает пароли:
SET pSignal = (SELECT DECODE(r.usignal,'YOURSTRINGKEY') FROM rsw_uds r WHERE r.uname = in_usdname AND r.uvige = 1); SET pSuccess =(SELECT in_usdsignal LIKE BINARY pSignal); IF pSuccess = 1 THEN /*Your code if match*/ ELSE /*Your code if don't match*/ END IF;
Не нужно ничего менять на уровне БД, просто у вас есть изменения в SQL-запросе, он будет работать.
пример
"SELECT * FROM <TABLE> where userId = '" + iv_userId + "' AND password = BINARY '" + iv_password + "'";двоичный сайта позволит сделать чувствительным к регистру.
MySQL не чувствительны к регистру по умолчанию, попробуйте изменить параметры сортировки языке
latin1_general_cs
Comments