it-swarm-eu.dev

Wie führe ich eine Suche nach Groß- und Kleinschreibung in der WHERE-Klausel durch?

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?

22
Somnath Muluk

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   |
+----+-------+
23
Matt Fenwick

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%';
15
Turgut

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.

Siehe hier , hier oder hier .

1
Martin F

Dies funktioniert in MySQL unabhängig vom Zeichensatz.

SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;

Putting 'BINARY' erzwingt einen binären Vergleich.

1
user2288580