Wie kann in der WHERE-Klausel zwischen Groß- und Kleinschreibung unterschieden werden?


21

Ich möchte bei SQL-Abfragen zwischen Groß- und Kleinschreibung unterscheiden. Standardmäßig berücksichtigt MySQL jedoch nicht den Fall der Zeichenfolgen.

Haben Sie eine Idee, wie Sie bei SQL-Abfragen zwischen Groß- und Kleinschreibung unterscheiden können?

Antworten:


22

Standardmäßig berücksichtigt MySQL den Fall der Zeichenfolgen nicht

Das ist nicht ganz richtig. Wann immer Sie create databasein MySQL sind, hat die Datenbank / das Schema einen Zeichensatz und eine Kollatierung. Jeder Zeichensatz hat eine Standardkollatierung. siehe hier für weitere Informationen.

Bei der Standardkollatierung für den Zeichensatz latin1wird latin1_swedish_cinicht zwischen Groß- und Kleinschreibung unterschieden.

Sie können beispielsweise eine Sortierung wählen, bei der die Groß- und Kleinschreibung berücksichtigt wird latin1_general_cs( MySQL-Grammatik ):

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;

Dies wirkt sich auf Dinge wie Gruppierung und Gleichheit aus. Beispielsweise,

create table casetable (
  id int primary key, 
  thing varchar(50)
);

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

In einer Datenbank mit Groß- und Kleinschreibung erhalten wir:

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   |
+----+-------+

In einer Datenbank, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird, erhalten wir:

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   |
+----+-------+

Beachten Sie, dass Sie die Sortierung auch innerhalb einer Abfrage ändern können . In der Datenbank kann ich zum Beispiel zwischen Groß- und Kleinschreibung unterscheiden

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

13

Sie sollten bei Ihrer Frage immer angeben, welche Version von MySQL Sie verwenden, da sich MySQL in ständiger Entwicklung befindet.

Okay, zurück zu deiner Frage:

Die String - Funktionen in MySQL sind immer Groß- und Kleinschreibung, so dass Sie alle Funktionen nutzen können LOCATE, POSITIONoder INSTR.

Beispielsweise:

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

Die Mustererkennung mit regulärem Ausdruck ( RLIKEoder REGEXP) unterscheidet bei allen Versionen von MySQL immer zwischen Groß- und Kleinschreibung, mit Ausnahme der neuesten Version 3.23.4.

Beispielsweise:

SELECT phone FROM user WHERE user_name REGEXP 'term';

Sowohl für den normalen Vergleich (=) als auch für den SQL-Mustervergleich ( LIKE) hängt das Verhalten von den betroffenen Feldern ab:

ein. CHARBei VARCHARallen Varianten von TEXT-Feldern wird die Groß- und Kleinschreibung nicht berücksichtigt.

b. CHAR BINARY, VARCHAR BINARY Und alle Varianten von BLOB - Feldern keine Groß- und Kleinschreibung vergleichen.

Wenn Sie ein Feld aus (a) mit einem Feld aus (b) vergleichen, unterscheidet der Vergleich zwischen Groß- und Kleinschreibung (Groß- und Kleinschreibung gewinnt). Siehe Kapitel "7.2.7 String-Typen" im MySQL-Referenzhandbuch und suchen Sie nach den Anweisungen zum Sortieren und Vergleichen.

Ab V3.23.0 ist es auch möglich, einen Vergleich der Groß- und Kleinschreibung mit dem Besetzungsoperator zu erzwingen BINARY, unabhängig von den Typen der betroffenen Felder. Siehe Kapitel "7.3.7 Cast-Operatoren" im MySQL-Referenzhandbuch.

Sie können also auch den Typ des Benutzernamens ändern oder mit V3.23.x Folgendes versuchen:

SELECT phone FROM user WHERE BINARY username LIKE '%term%';

1

In meiner Situation verwende ich Access 2010, aber ich hatte das gleiche Problem, die Lösung ist jedoch anders: Verwenden Sie die StrComp()Funktion und testen Sie ihre Rückgabe auf Null.

StrComp( thing, 'abc', 0) = 0

Da wird StrComp()zurückgegeben, -1wenn das erste Argument "kleiner", 1wenn es "größer" und 0wenn es "gleich" ist, wenn StrComp()=0Sie eine Übereinstimmung zwischen Groß- und Kleinschreibung haben.

Sehen Sie hier , hier oder hier .


0

Dies funktioniert in MySQL unabhängig vom Zeichensatz. WÄHLEN SIE 'test' REGEXP BINARY 'TEST' ALS ERGEBNIS; Durch Setzen von 'BINARY' wird ein binärer Vergleich erzwungen.


-2

Versuchen Sie dies für unempfindliche Suche, es funktioniert gut mit großer Leistung:

"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.