Ich möchte in SQL-Abfragen zwischen Groß- und Kleinschreibung suchen. Standardmäßig berücksichtigt MySQL jedoch nicht den Fall der Zeichenfolgen.
Haben Sie eine Idee, wie Sie in SQL-Abfragen zwischen Groß- und Kleinschreibung suchen können?
standardmäßig berücksichtigt MySQL den Fall der Zeichenfolgen nicht
Das ist nicht ganz richtig. Wann immer du create database
In MySQL hat die Datenbank/das Schema einen Zeichensatz und eine Sortierung. Jeder Zeichensatz hat eine Standardkollatierung. siehe hier für weitere Informationen.
Die Standardkollatierung für den Zeichensatz latin1
, welches ist latin1_swedish_ci
unterscheidet zufällig zwischen Groß- und Kleinschreibung.
Sie können eine Sortierung auswählen, bei der zwischen Groß- und Kleinschreibung unterschieden wird, z. B. 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. Zum Beispiel,
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, bei der zwischen Groß- und Kleinschreibung unterschieden wird, 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, in 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 auch die Sortierung ändern können aus einer Abfrage heraus . Zum Beispiel kann ich in dem Fall - sensible Datenbank tun
select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
| 3 | abc |
| 4 | ABC |
| 5 | aBc |
| 6 | abC |
+----+-------+
Sie sollten immer mit Ihrer Frage angeben, welche Version von MySQL Sie verwenden, da sich MySQL ständig weiterentwickelt.
Okay, zurück zu deiner Frage:
Bei den Zeichenfolgenfunktionen in MySQL wird immer zwischen Groß- und Kleinschreibung unterschieden, sodass Sie eine der Funktionen LOCATE
, POSITION
oder INSTR
verwenden können.
Zum Beispiel:
SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;
Bei der Musterübereinstimmung mit regulären Ausdrücken (RLIKE
oder REGEXP
) wird bei allen Versionen von MySQL mit Ausnahme der neuesten Version 3.23.4 immer zwischen Groß- und Kleinschreibung unterschieden.
Zum Beispiel:
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 beteiligten Feldern ab:
ein. CHAR
, VARCHAR
und alle Varianten von TEXT-Feldern vergleichen die Groß- und Kleinschreibung nicht.
b. CHAR BINARY
, VARCHAR BINARY
und alle Varianten von BLOB-Feldern vergleichen die Groß- und Kleinschreibung.
Wenn Sie ein Feld aus (a) mit einem Feld aus (b) vergleichen, wird beim Vergleich zwischen Groß- und Kleinschreibung unterschieden (Groß- und Kleinschreibung gewinnt). Siehe Kapitel "7.2.7 Zeichenfolgentypen" 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 Cast-Operator BINARY
zu erzwingen, unabhängig von den Arten der beteiligten 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 ausprobieren:
SELECT phone FROM user WHERE BINARY username LIKE '%term%';
In meiner Situation verwende ich Access 2010, aber ich hatte das gleiche Problem, aber die Lösung ist anders: Verwenden Sie die StrComp()
Funktion und testen Sie seine Rückkehr auf Null.
StrComp( thing, 'abc', 0) = 0
Weil StrComp()
-1
zurückgibt, wenn das erste Argument "kleiner" ist, 1
wenn es "größer" ist und 0
wenn es ist "gleich", wenn StrComp()=0
, haben Sie eine Übereinstimmung zwischen Groß- und Kleinschreibung.
Dies funktioniert in MySQL unabhängig vom Zeichensatz.
SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;
Putting 'BINARY'
erzwingt einen binären Vergleich.