Як зробити пошук з урахуванням регістру у пункті WHERE?


21

Я хочу врахувати регістр пошуку в SQL-запиті. Але за замовчуванням MySQL не враховує випадок рядків.

Будь-яка ідея про те, як зробити регістр пошуку в регістрі SQL?

Відповіді:


22

за замовчуванням MySQL не враховує регістр рядків

Це не зовсім так. Щоразу, коли ви create databaseзнаходитесь у MySQL, база даних / схема має набір символів та зіставлення. Кожен набір символів має зіставлення за замовчуванням; дивіться тут для отримання додаткової інформації.

Співставлення за замовчуванням для набору символів latin1, яке latin1_swedish_ci, мабуть, не залежно від регістру.

Ви можете вибрати порівняння з урахуванням регістру, наприклад latin1_general_cs( MySQL граматика ):

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;

Це впливає на такі речі, як групування та рівність. Наприклад,

create table casetable (
  id int primary key, 
  thing varchar(50)
);

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

У базі даних, що враховує регістри, ми отримуємо:

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| ABC   |        1 |
| aBc   |        1 |
| abC   |        1 |
| abc   |        1 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
+----+-------+

Перебуваючи в базі даних, що не враховує регістри, ми отримуємо:

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| abc   |        4 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

Зауважте, що ви також можете змінити порівняння в межах запиту . Наприклад, у базі даних, що відрізняються від регістру , я можу це зробити

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

13

Ви завжди маєте зазначити своє запитання, яку версію MySQL ви використовуєте, оскільки MySQL постійно розвивається.

Добре, повернемось до вашого питання:

Строкові функції в MySQL завжди чутливий до регістру, так що ви можете використовувати будь-якого з функцій LOCATE, POSITIONабо INSTR.

Наприклад:

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;

Зображення шаблону з регулярним виразом ( RLIKEабо REGEXP) завжди чутливе до регістру для всіх версій MySQL, за винятком найновішої 3.23.4.

Наприклад:

SELECT phone FROM user WHERE user_name REGEXP 'term';

Як для звичайного порівняння (=), так і для відповідності шаблону SQL ( LIKE) поведінка залежить від полів, які беруть участь:

а. CHAR, VARCHARі всі варіанти полів TEXT порівнюють регістри, що не враховують регістр.

б. CHAR BINARY, VARCHAR BINARY а всі варіанти полів BLOB порівнюють регістр.

Якщо ви порівнюєте поле з (а) з полем з (b), то порівняння буде залежно від регістру (виграє чутливість регістру). Дивіться розділ "7.2.7 Типи рядків" у довідковому посібнику MySQL та шукайте твердження про сортування та порівняння.

Починаючи з V3.23.0, можна також змусити порівняти чутливість до регістру з оператором лиття BINARY, незалежно від типів задіяних полів. Дивіться розділ "7.3.7 Оператори лиття" Посібника з посилання MySQL.

Тож ви також можете змінити тип імені користувача або за допомогою V3.23.x спробувати щось на кшталт:

SELECT phone FROM user WHERE BINARY username LIKE '%term%';

1

У моїй ситуації я використовую Access 2010, але у мене була та сама проблема, але рішення інше: Використовуйте StrComp()функцію та перевіряйте її повернення на нуль.

StrComp( thing, 'abc', 0) = 0

Тому що StrComp()повертається, -1якщо перший аргумент "менший", 1якщо він "більший", і 0якщо він "рівний", коли StrComp()=0, у вас є відповідність регістру.

Дивіться тут , тут або тут .


0

Це буде працювати в MySQL незалежно від набору символів. ВИБІРТЕ "тест" РЕГЕКС ДВІНАРОДНИЙ "ТЕСТ" як результат Якщо встановити "BINARY", це змушує двійкове порівняння.


-2

Спробуйте це для нечутливого пошуку, це чудово працює з чудовою продуктивністю:

"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.