Ето три опции за връщане на редове, които съдържат главни букви в MySQL.
Примерни данни
Да предположим, че имаме таблица със следните данни:
SELECT c1 FROM t1;
Резултат:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | café | | 1café | | eCafé | | James Bond 007 | | JB 007 | | 007 | | NULL | | | | É | | É 123 | | é | | é 123 | | ø | | Ø | +----------------+
Можем да използваме следните методи, за да върнем редовете, които съдържат главни букви.
Опция 1:Сравнете с LOWER()
Низ
Можем да използваме LOWER()
функция за сравняване на оригиналната стойност с нейния еквивалент с малки букви:
SELECT c1 FROM t1
WHERE CAST(LOWER(c1) AS BINARY) <> CAST(c1 AS BINARY);
Резултат:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +----------------+
Чрез използване на не е равно на (<>
) оператор (алтернативно можете да използвате !=
вместо <>
ако предпочитате), ние връщаме само онези редове, които са различни от техните еквиваленти с малки букви. Причината да правим това е, че ако дадена стойност е същата като нейния еквивалент с малки букви, тогава тя вече е била с малки букви (и не искаме да я връщаме).
По подразбиране MySQL извършва търсене без значение на малки и големи букви и затова използвам CAST()
функция за прехвърляне на стойностите към двоичен файл, за да получите търсене, чувствително към малки и големи букви.
Възможно е също да използвате BINARY
оператор за прехвърляне на стойността към двоичен, но този оператор е остарял от MySQL 8.0.27 и може да бъде премахнат в бъдеща версия.
Във всеки случай, така изглежда кодът при използване на BINARY
оператор:
SELECT c1 FROM t1
WHERE BINARY LOWER(c1) <> BINARY c1;
Може да се направи и така:
SELECT c1 FROM t1
WHERE BINARY(LOWER(c1)) <> BINARY(c1);
Ето резултатите, които получавам и от двете, когато изпълнявам кода в MySQL 8.0.27:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +----------------+ 8 rows in set, 2 warnings (0.00 sec)
И когато покажа предупрежденията:
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é | | eCafé | | James Bond 007 | | JB 007 | +----------------+
Този път се връщат по-малко редове, отколкото в предишните примери. Това е, защото не съм посочил знаци като É
и Ø
, които бяха върнати в тези примери. Нашият резултат съдържа É
но този ред беше върнат само защото съдържа и други главни букви, които правят съвпадение.
Следователно, ако използвате тази опция, ще трябва да се уверите, че имате всички валидни знаци.
Опция 3:Сравнете с набор от знаци
Друг начин да го направите е да посочите диапазона от главни букви, които искаме да съпоставим:
SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[A-Z]' AS BINARY);
Резултат:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +----------------+