Jak przeprowadzić wyszukiwanie z rozróżnianiem wielkości liter w klauzuli WHERE?

21

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?

Somnath Muluk
źródło

Odpowiedzi:

22

domyślnie MySQL nie bierze pod uwagę wielkości ciągów

To nie do końca prawda. Ilekroć jesteś create databasew 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   |
+----+-------+
Matt Fenwick
źródło
13

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, POSITIONlub INSTR.

Na przykład:

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;

W dopasowaniu wzorca z wyrażeniem regularnym ( RLIKElub 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, VARCHARi 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%';
Turgut
źródło
1

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, -1jeśli pierwszy argument jest „mniejszy”, 1jeśli jest „większy”, a 0jeśli jest „równy”, to kiedy StrComp()=0rozróżniana jest wielkość liter.

Zobacz tutaj , tutaj lub tutaj .

Martin F.
źródło
0

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.

użytkownik2288580
źródło
-2

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);
ganji
źródło