Mam funkcję, która zwraca pięć znaków wielkimi literami. Jeśli wykonam zapytanie na tym ciągu, zwróci ono wartość bez względu na wielkość liter.
Jak ustawić rozróżnianie wielkości liter w zapytaniach MySQL?
mysql
sql
interop
case-sensitive
string-comparison
StevenB
źródło
źródło
Odpowiedzi:
http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
źródło
SELECT 'email' COLLATE utf8_bin = 'Email'
Dobrą wiadomością jest to, że jeśli chcesz wykonać rozróżnianie wielkości liter, bardzo łatwo jest zrobić:
źródło
convert(char(0x65,0xcc,0x88) using utf8)
(tj.e
Z¨
dodanym) iconvert(char(0xc3,0xab) using utf8)
(tj.ë
), Ale dodanieBINARY
spowoduje, że będą nierówne.Odpowiedź wysłana przez Craiga White'a ma wysoką karę wydajności
ponieważ nie używa indeksów. Więc albo musisz zmienić układ tabeli, jak wspomniano tutaj https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html .
LUB
Najłatwiejsza poprawka, powinieneś użyć BINARNEJ wartości.
Na przykład.
VS
1 rząd w zestawie (0,00 s)
źródło
Zamiast operatora = możesz użyć LIKE lub LIKE BINARY
W swoim stanie zajmie „a”, a nie „A”
źródło
Aby skorzystać z indeksu przed użyciem BINARY, możesz zrobić coś takiego, jeśli masz duże tabele.
Podkwerenda spowodowałoby naprawdę mały podzbiór bez rozróżniania wielkości liter, którego następnie wybrałeś jedyne dopasowanie z rozróżnianiem wielkości liter.
źródło
Najodpowiedniejszym sposobem przeprowadzenia porównania łańcucha z rozróżnianiem wielkości liter bez zmiany sortowania kolumny, której dotyczy zapytanie, jest jawne określenie zestawu znaków i zestawienia dla wartości, z którą porównywana jest kolumna.
Dlaczego nie użyć
binary
?Korzystanie z
binary
operatora jest niewskazane, ponieważ porównuje rzeczywiste bajty zakodowanych ciągów. Jeśli porównasz rzeczywiste bajty dwóch ciągów kodowanych przy użyciu różnych zestawów znaków, dwa ciągi, które należy uznać za takie same, mogą nie być równe. Na przykład, jeśli masz kolumnę korzystającą zlatin1
zestawu znaków, a zestaw znaków serwer / sesja toutf8mb4
, to kiedy porównasz kolumnę z ciągiem zawierającym akcent, taki jak „kawiarnia”, nie będzie pasować do wierszy zawierających ten sam ciąg! To dlatego, że wlatin1
E jest kodowane jako bajt0xE9
, ale wutf8
to dwa bajty:0xC3A9
.Dlaczego warto korzystać
convert
równie dobrzecollate
?Sortowanie musi pasować do zestawu znaków. Więc jeśli twój serwer lub sesja jest ustawiona na używanie
latin1
zestawu znaków, musisz użyć,collate latin1_bin
ale jeśli twój zestaw znaków jest takiutf8mb4
, musisz użyćcollate utf8mb4_bin
. Dlatego najbardziej niezawodnym rozwiązaniem jest zawsze przekształcenie wartości w najbardziej elastyczny zestaw znaków i użycie binarnego zestawienia dla tego zestawu znaków.Po co stosować wartość
convert
icollate
do wartości, a nie do kolumny?Zastosowanie dowolnej funkcji transformacji do kolumny przed porównaniem uniemożliwia silnikowi zapytań użycie indeksu, jeśli taki istnieje dla kolumny, co może znacznie spowolnić zapytanie. Dlatego zawsze lepiej jest, jeśli to możliwe, przekształcić wartość. Po przeprowadzeniu porównania dwóch wartości ciągów, a jedna z nich ma jawnie określone sortowanie, aparat zapytań użyje jawnego sortowania, niezależnie od tego, do której wartości zostanie zastosowane.
Czułość akcentu
Należy zauważyć, że MySql nie tylko nie rozróżnia wielkości liter w kolumnach korzystających z
_ci
sortowania (co zwykle jest ustawieniem domyślnym), ale także nie uwzględnia rozróżniania akcentów . To znaczy że'é' = 'e'
. Użycie binarnego sortowania (lubbinary
operatora) sprawi, że porównania ciągów będą rozróżniać zarówno akcent, jak i wielkość liter.Co to jest
utf8mb4
?Zestaw
utf8
znaków w MySql to alias,utf8mb3
który został przestarzały w najnowszych wersjach, ponieważ nie obsługuje 4 bajtów znaków (co jest ważne przy kodowaniu ciągów takich jak 🐈). Jeśli chcesz używać kodowania znaków UTF8 z MySql, powinieneś używaćutf8mb4
zestawu znaków.źródło
Poniżej podano wersje MySQL równe lub wyższe niż 5,5.
Dodaj do /etc/mysql/my.cnf
Wszystkie inne zestawienia, które próbowałem, wydawały się nie uwzględniać wielkości liter, działało tylko „utf8_bin”.
Nie zapomnij ponownie uruchomić mysql po tym:
Według http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html istnieje również „latin1_bin”.
„Utf8_general_cs” nie został zaakceptowany podczas uruchamiania mysql. (Czytam „_cs” jako „rozróżnia małe i wielkie litery” - ???).
źródło
Możesz użyć BINARY do rozróżniania wielkości liter w ten sposób
niestety ten sql nie może używać indeksu, będziesz odczuwał spadek wydajności zapytań zależnych od tego indeksu
Na szczęście mam kilka sztuczek, aby rozwiązać ten problem
źródło
Doskonały!
Udostępniam Ci kod z funkcji porównującej hasła:
źródło
declare pSuccess BINARY;
na początkuNie trzeba nic zmieniać na poziomie DB, wystarczy zmienić zapytanie SQL, to zadziała.
Przykład -
"SELECT * FROM <TABLE> where userId = '" + iv_userId + "' AND password = BINARY '" + iv_password + "'";
Binarne słowo kluczowe rozróżnia małe i wielkie litery.
źródło
Domyślnie mysql nie rozróżnia wielkości liter, spróbuj zmienić sortowanie językowe na
latin1_general_cs
źródło