Chcę wyszukiwania z rozróżnianiem wielkości liter w zapytaniu SQL. Ale domyślnie MySQL nie bierze pod uwagę wielkości ciągów.
Masz pomysł, jak przeprowadzić wyszukiwanie z rozróżnianiem wielkości liter w zapytaniu SQL?
źródło
Chcę wyszukiwania z rozróżnianiem wielkości liter w zapytaniu SQL. Ale domyślnie MySQL nie bierze pod uwagę wielkości ciągów.
Masz pomysł, jak przeprowadzić wyszukiwanie z rozróżnianiem wielkości liter w zapytaniu SQL?
domyślnie MySQL nie bierze pod uwagę wielkości ciągów
To nie do końca prawda. Ilekroć jesteś create database
w MySQL, baza danych / schemat ma zestaw znaków i zestawienie. Każdy zestaw znaków ma domyślne sortowanie; zobacz tutaj, aby uzyskać więcej informacji.
Domyślne sortowanie zestawu znaków latin1
, którym jest latin1_swedish_ci
, nie rozróżnia wielkości liter.
Możesz wybrać sortowanie z rozróżnianiem wielkości liter, na przykład latin1_general_cs
( gramatyka MySQL ):
CREATE SCHEMA IF NOT EXISTS `myschema`
DEFAULT CHARACTER SET latin1
COLLATE latin1_general_cs ;
Ma to wpływ na takie rzeczy jak grupowanie i równość. Na przykład,
create table casetable (
id int primary key,
thing varchar(50)
);
select * from casetable;
+----+-------+
| id | thing |
+----+-------+
| 3 | abc |
| 4 | ABC |
| 5 | aBc |
| 6 | abC |
+----+-------+
W bazie danych z rozróżnianiem wielkości liter otrzymujemy:
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 |
+----+-------+
W bazie danych bez rozróżniania wielkości liter otrzymujemy:
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 |
+----+-------+
Pamiętaj, że możesz również zmienić sortowanie w obrębie zapytania . Na przykład, w nictwo wrażliwych danych, co mogę zrobić
select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
| 3 | abc |
| 4 | ABC |
| 5 | aBc |
| 6 | abC |
+----+-------+
Zawsze powinieneś podać w pytaniu, jakiej wersji MySQL używasz, ponieważ MySQL jest w ciągłym rozwoju.
OK, wracając do twojego pytania:
Funkcje ciągów w MySQL są zawsze z uwzględnieniem wielkości liter, więc można użyć dowolnej funkcji LOCATE
, POSITION
lub INSTR
.
Na przykład:
SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;
W dopasowaniu wzorca z wyrażeniem regularnym ( RLIKE
lub REGEXP
) zawsze rozróżniana jest wielkość liter we wszystkich wersjach MySQL, z wyjątkiem najnowszej wersji 3.23.4.
Na przykład:
SELECT phone FROM user WHERE user_name REGEXP 'term';
Zarówno w przypadku zwykłego porównania (=), jak i dopasowania wzorca SQL ( LIKE
) zachowanie zależy od zaangażowanych pól:
za. CHAR
, VARCHAR
i wszystkie warianty pól TEXT porównują wielkość liter bez rozróżniania wielkości liter.
b. CHAR BINARY
, VARCHAR BINARY
a wszystkie warianty pól BLOB porównują wielkość liter.
Jeśli porównasz pole z (a) z polem z (b), wówczas porównanie rozróżni wielkość liter (wygrywa rozróżnianie wielkości liter). Zobacz rozdział „7.2.7 Typy ciągów” Podręcznika MySQL i poszukaj instrukcji dotyczących sortowania i porównań.
Począwszy od wersji 3.23.0 można również wymusić porównanie wrażliwości na wielkość liter za pomocą operatora rzutowania BINARY
, niezależnie od typów zaangażowanych pól. Patrz rozdział „7.3.7 Operatory przesyłania” w Podręczniku MySQL.
Możesz także zmienić typ nazwy użytkownika lub w wersji 3.23.x wypróbuj coś takiego:
SELECT phone FROM user WHERE BINARY username LIKE '%term%';
W mojej sytuacji korzystam z programu Access 2010, ale miałem ten sam problem, ale rozwiązanie jest inne: użyj StrComp()
funkcji i przetestuj jej wartość powrotu na zero.
StrComp( thing, 'abc', 0) = 0
Ponieważ StrComp()
zwraca, -1
jeśli pierwszy argument jest „mniejszy”, 1
jeśli jest „większy”, a 0
jeśli jest „równy”, to kiedy StrComp()=0
rozróżniana jest wielkość liter.
Działa to w MySQL bez względu na zestaw znaków. WYBIERZ „test” REGEXP BINARNY „TEST” JAKO WYNIK; Ustawienie „BINARY” wymusza porównanie binarne.
Wypróbuj to dla niewrażliwego wyszukiwania, działa dobrze z doskonałą wydajnością:
"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);