Mysql
 sql >> база данни >  >> RDS >> Mysql

3 начина за намиране на редове, които съдържат малки букви в MySQL

Ето три опции за връщане на редове, които съдържат малки букви в MySQL.

Примерни данни

Да предположим, че имаме таблица със следните данни:

SELECT c1 FROM t1;

Резултат:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| JB 007         |
| 007            |
| NULL           |
|                |
| É              |
| É 123          |
| é              |
| é 123          |
| ø              |
| Ø              |
+----------------+

Можем да използваме следните методи, за да върнем редовете, които съдържат малки букви.

Опция 1:Сравнете с UPPER() Низ

Можем да използваме UPPER() функция за сравняване на оригиналната стойност с нейния еквивалент с главни букви:

SELECT c1 FROM t1
WHERE CAST(UPPER(c1) AS BINARY) <> CAST(c1 AS BINARY);

Резултат:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| é              |
| é 123          |
| ø              |
+----------------+

Чрез използване на не е равно на (<> ) оператор (алтернативно можете да използвате != вместо <> ако предпочитате), ние връщаме само онези редове, които са различни от техните еквиваленти с главни букви. Причината да правим това е, че ако стойността е същата като нейния еквивалент с главни букви, тогава тя вече е била с главни букви (и не искаме да я връщаме).

По подразбиране MySQL извършва търсене без значение на малки и големи букви и затова използвам CAST() функция за прехвърляне на стойностите към двоичен файл, за да получите търсене, чувствително към малки и големи букви.

Възможно е също да използвате BINARY оператор за прехвърляне на стойността към двоичен, но този оператор е остарял от MySQL 8.0.27 и може да бъде премахнат в бъдеща версия.

Във всеки случай, така изглежда кодът при използване на BINARY оператор:

SELECT c1 FROM t1
WHERE BINARY UPPER(c1) <> BINARY c1;

Може да се направи и така:

SELECT c1 FROM t1
WHERE BINARY(UPPER(c1)) <> BINARY(c1);

Ето резултатите, които получавам и от двете, когато изпълнявам кода в MySQL 8.0.27:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| é              |
| é 123          |
| ø              |
+----------------+

И когато покажа предупрежденията:

SHOW WARNINGS;

Резултат:

+---------+------+----------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                      |
+---------+------+----------------------------------------------------------------------------------------------+
| Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
| Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
+---------+------+----------------------------------------------------------------------------------------------+

Вариант 2:Сравнете с действителните знаци

Друга възможност е да използвате REGEXP оператор с модел на регулярен израз, който изрично включва всеки символ с малка буква, който искаме да съпоставим:

SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[abcdefghijklmnopqrstuvwxyz]' AS BINARY);

Резултат:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

Този път се връщат по-малко редове, отколкото в предишните примери. Това е, защото не съм посочил знаци като é и ø , които бяха върнати в тези примери. Нашият резултат съдържа é но този ред беше върнат само защото съдържа и други малки букви, които правят съвпадение.

Следователно, ако използвате тази опция, ще трябва да се уверите, че имате всички валидни знаци.

Опция 3:Сравнете с набор от знаци

Друг начин да го направите е да посочите диапазона от знаци, които искаме да съпоставим:

SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[a-z]' AS BINARY);

Резултат:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете блог в PHP и MySQL база данни - DB дизайн

  2. Вземете идентификатора на вмъкнатия ред с помощта на C#

  3. Как мога да намеря всички таблици в MySQL с конкретни имена на колони в тях?

  4. Как да архивирате вашата Moodle MySQL база данни

  5. Защо mysqli дава грешка при несинхронизиране на команди?