Как мне заставить мой запрос возвращать только имена с определенной строчной буквой?

#mysql #sql

#mysql #sql

Вопрос:

 SELECT *
FROM County
WHERE LOWER(Name) LIKE "%u%";
 

Я пытаюсь возвращать только строки, в которых названия округов содержат строчную букву «u» где-то в его названии. По какой-то причине с приведенным выше запросом я возвращаю несколько строк, где имя содержит только заглавную букву «U», что не то, что я хочу. Я не понимаю…
Заранее спасибо!

Комментарии:

1. Вероятно, потому, что у вас в этом столбце сопоставление без учета регистра

2. Начните SQL-вопрос, показав схему для всех соответствующих таблиц. Пример данных, содержащихся в этих таблицах, также очень полезен. Если это вообще возможно, создайте SQLFiddle с определенной схемой и предоставленными некоторыми тестовыми данными

3. Это может быть связано с тем, что вы используете LOWER только во время фильтрации (т. Е. USA Будет рассматриваться как usa и Louisiana будет рассматриваться как louisiana ). Однако в операторе select он будет печатать имя как есть (т. Е. США, Луизиана …). Теперь вам может быть интересно, как фильтруется USA.

4. @Henry Ecker: Спасибо за редактирование исходного вопроса. nostrad0muz, пожалуйста, не искажайте свой запрос. Если вы хотите пометить его как решаемый, примите один из ответов, нажав галочку / галочку рядом с ответом.

Ответ №1:

Попробуйте :

 SELECT * 
FROM County 
WHERE 
    BINARY name like '%u%' ;
 

Демонстрация: https://dbfiddle.uk/?rdbms=mysql_8.0amp;fiddle=44048a2d080036ce9905340d6ebbf3e3

 CREATE TABLE County (
Name varchar(30 ) 
 );

insert into County values
('Test1'),
('Test2'),
('Tust3'),
('TeAt4'),
('TeAt5'),
('TUst6'),
('Tust7');
 

Результат:

 Name
Tust3
Tust7
 

Ответ №2:

 mysql> show variables like '%character%';
 -------------------------- --------------------------------------------------------- 
| Variable_name            | Value                                                   |
 -------------------------- --------------------------------------------------------- 
| character_set_client     | cp850                                                   |
| character_set_connection | cp850                                                   |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | cp850                                                   |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8mb3                                                 |
| character_sets_dir       | C:Program FilesMySQLMySQL Server 8.0sharecharsets |
 -------------------------- --------------------------------------------------------- 
8 rows in set (0.00 sec)
 

Поскольку мой character_set_client есть cp850 , я могу использовать соответствующую последовательность сортировки latin1_general_cs . Более подробная информация об этом сопоставлении последовательностей, если она найдена в документации

 SELECT *
FROM County
WHERE Name COLLATE latin1_general_cs LIKE "%u%"
 

Приведенный выше запрос должен найти все записи с маленькой буквы u .

Последовательность сопоставления latin1_bin также работает (как указано в других ответах):

 SELECT *
FROM County
WHERE Name COLLATE latin1_bin LIKE "%u%"