Я хочу врахувати регістр пошуку в SQL-запиті. Але за замовчуванням MySQL не враховує випадок рядків.
Будь-яка ідея про те, як зробити регістр пошуку в регістрі SQL?
Я хочу врахувати регістр пошуку в SQL-запиті. Але за замовчуванням MySQL не враховує випадок рядків.
Будь-яка ідея про те, як зробити регістр пошуку в регістрі SQL?
Відповіді:
за замовчуванням 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 |
+----+-------+
Ви завжди маєте зазначити своє запитання, яку версію 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%';
У моїй ситуації я використовую Access 2010, але у мене була та сама проблема, але рішення інше: Використовуйте StrComp()
функцію та перевіряйте її повернення на нуль.
StrComp( thing, 'abc', 0) = 0
Тому що StrComp()
повертається, -1
якщо перший аргумент "менший", 1
якщо він "більший", і 0
якщо він "рівний", коли StrComp()=0
, у вас є відповідність регістру.
Це буде працювати в MySQL незалежно від набору символів. ВИБІРТЕ "тест" РЕГЕКС ДВІНАРОДНИЙ "ТЕСТ" як результат Якщо встановити "BINARY", це змушує двійкове порівняння.