MySQL Groß- und Kleinschreibung beachten


242

Kann mir jemand sagen, ob bei einer MySQL- SELECTAbfrage standardmäßig zwischen Groß- und Kleinschreibung oder zwischen Groß- und Kleinschreibung unterschieden wird? Und wenn nicht, welche Anfrage müsste ich senden, damit ich so etwas tun kann:

SELECT * FROM `table` WHERE `Value` = "iaresavage"

Wo in Wirklichkeit der wahre Wert von Valueist IAreSavage.


44
Letztendlich hängt es von der eingereichten Kollatierung ab - ob es sich um '_ci' (ohne Berücksichtigung der Groß- und Kleinschreibung) oder '_cs' (ohne Berücksichtigung der Groß- und Kleinschreibung) handelt
Jovan Perovic

15
Dies ist eine schlecht formulierte Frage;). Die Hälfte der Antworten zeigt Ihnen, wie Sie einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung durchführen, die andere Hälfte zielt auf die Unterscheidung zwischen Groß- und Kleinschreibung ab. Und nur 1 sagt Ihnen, dass bei der Standardeinstellung die Groß- und Kleinschreibung nicht berücksichtigt wird. :) Es ist erwähnenswert, dass Groß- und Kleinschreibung auch dann funktioniert, wenn Sie einen Vergleich wie'value' in ('val1', 'val2', 'val3')
SaltyNuts

5
@SaltyNuts Mann, diese Frage 7 Jahre später zu lesen und zu erkennen, wie sehr ich ein Noob war, ist peinlich! Ich hätte einfach die Dokumentation lesen können und die Antwort ist wie im ersten Satz über SELECT-Anweisungen ...
NoodleOfDeath

Um das zu ergänzen, was @JovanPerovic gesagt hat, macht utf8_bin es auch zwischen Groß- und Kleinschreibung. Ich
bin

Antworten:


494

Sie unterscheiden nicht zwischen Groß- und Kleinschreibung , es sei denn, Sie führen einen binären Vergleich durch .


3
Ich stimme Tims Kommentar größtenteils zu. Ich denke nicht, dass ein "niedrigeres ()" für Ihre Werte überall der beste Weg ist, damit umzugehen. Es scheint eine Problemumgehung zu sein. Aber ich gebe zu, dass es manchmal Sinn macht und einfacher ist. (Colin erwähnte, dass das Sortieren besser war) Wir hatten historische Daten in die MySQL-Tabelle verschoben, die die Legacy-Logik aufgrund bestimmter Spaltenwerte mit unempfindlicher Groß- und Kleinschreibung brachen. Wir mussten den Unterschied zwischen "GE1234" und "ge1234" kennen, sie mussten eindeutig sein und auf diese Weise protokolliert bleiben. Wir setzen unsere Spalte in create table Anweisung stattdessen auf diese Weise: varchar (20) CHARACTER SET utf8 COLLATE utf8_bin
gregthegeek

19
Ich weiß nicht, warum so viele Leute dafür gestimmt haben. Hier heißt es eindeutig dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html, dass "... dies bedeutet, dass bei alphabetischen Zeichen bei Vergleichen zwischen Groß- und Kleinschreibung unterschieden wird." Wenn ich also nach 'DickSavagewood' suche, würde es NICHT 'Dicksavagewood' aufnehmen. Wenn Sie dasselbe mit LOWER () tun, wird es aufgenommen. Also meine Antwort auf die Frage: In Ihrem speziellen Fall unterscheidet SELECT tatsächlich zwischen Groß- und Kleinschreibung.
Luftwaffel

10
@ user1961753: Lesen Sie noch einmal: "Bei binären Zeichenfolgen (varbinary, blob) ... wird zwischen Groß- und Kleinschreibung unterschieden".
Marc B

1
@MarcB Dieser Link ist jetzt defekt. Könnten Sie es beheben? :)
Phiter

5
Wie Jovan sagte, hängt es von der Zusammenstellung ab, daher ist diese Antwort ziemlich falsch.
Phil294

117

Sie können den Wert und den übergebenen Parameter in Kleinbuchstaben schreiben:

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")

Eine andere (bessere) Möglichkeit wäre, den in der Dokumentation genanntenCOLLATE Operator zu verwenden


21
Wie würde diese SELECTAussage dann aussehen COLLATE?
Ja Barry

11
Auf der oben genannten Dokumentationsseite heißt es, dass "bei nicht-binären Zeichenfolgenvergleichen standardmäßig die Groß- und Kleinschreibung nicht berücksichtigt wird".
Per Quested Aronsson

9
Ein bisschen erschreckend, wie viele Leute diese Antwort positiv bewertet haben. Wie @Marc oben erklärt, wird bei Vergleichen die Groß- und Kleinschreibung nicht berücksichtigt . Sie müssen Kollatierungen und Indizes verstehen und diese richtig konfigurieren. Die Verwendung von Zeichenfolgentransformationen wie LOWER()oder einer beliebigen COLLATEKlausel kann einen Index vollständig umgehen. Mit der Zeit kann dies, wenn Ihre Tabelle wächst, drastische Auswirkungen auf die Leistung haben. Wahrscheinlich sind dies Benutzernamen, nach denen Sie suchen? Verwenden Sie eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung und fügen Sie der Spalte einen eindeutigen Index hinzu. Verwenden Sie EXPLAINdiese Option, um zu bestätigen, dass der Index verwendet wird.
mindplay.dk

1
Ich wollte das Gleiche sagen wie mindplay.dk ... Upper () und Lower () umgehen den Index und wirken sich direkt auf die Leistung großer Datenbanktabellen aus.
GTodorov

Ich stimme sowohl der Meinung von mindplay.dk als auch von GTodorov zu. Seien Sie vorsichtig, wenn Sie eine Methode für eine Zielspalte in der where-Klausel verwenden. Der Index der Spalte kann unbrauchbar sein. Verwenden Sie EXPLAIN!
Traeper

51

BINARY VERWENDEN

Dies ist eine einfache Auswahl

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

Dies ist eine Auswahl mit Binär

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

oder

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0


3
Wann ist es sinnvoll, BINARY nur auf einer Seite von = zu verwenden (SELECT * FROM myTable WHERE BINARY 'etwas' = 'Etwas')?
Jimmy

@ Jimmy Was meinst du genau? Der Code funktioniert. Wenn eine Seite des Vergleichs in binär umgewandelt wird, erfolgt der Vergleich binär.
Jori

@Jori Oh, ich glaube, ich habe falsch verstanden - ich dachte, eines der beiden Beispiele hätte BINARY auf beiden Seiten des Gleichen.
Jimmy

Ich habe gerade dafür gestimmt, weil dies wirklich die richtige Antwort ist. Laut der Dokumentation auf der MySQL-Website ist es besser, den Befehl BINARY zu verwenden, als zu versuchen, Ihre Wörter / Anfragen in eine bestimmte Sprache zu tippen, da der Befehl BINARY besagt, dass alles so bleibt, wie es ist, und es genau so verwendet, wie es ist es wird vorgestellt. Als ich nach einer Antwort suchte, führten mich die beiden Antworten hier zur MySQL-Website und schauten sich deren Dokumentation an. Die Verwendung von BINARY ist besser. Das Übersetzen kann andere Probleme verursachen.
Mark Manning

43

Vergleiche unterscheiden nicht zwischen Groß- und Kleinschreibung, wenn die Spalte eine Kollatierung verwendet, die mit endet _ci(z. B. die Standardkollatierung latin1_general_ci ), und sie unterscheiden zwischen Groß- und Kleinschreibung, wenn die Spalte eine Kollatierung verwendet, die mit _csoder endet _bin(z. B. die utf8_unicode_csund utf8_binKollatierungen).

Überprüfen Sie die Sortierung

Sie können Ihre Server- , Datenbank- und Verbindungskollatierungen überprüfen mit:

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

und Sie können Ihre Tabellensortierung überprüfen mit:

mysql> SELECT table_schema, table_name, table_collation 
       FROM information_schema.tables WHERE table_name = `mytable`;
+----------------------+------------+-------------------+
| table_schema         | table_name | table_collation   |
+----------------------+------------+-------------------+
| myschema             | mytable    | latin1_swedish_ci |

Sortierung ändern

Sie können Ihre Datenbank-, Tabellen- oder Spaltenkollatierung wie folgt in Groß- und Kleinschreibung ändern:

-- Change database collation
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- or change table collation
ALTER TABLE `table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- or change column collation
ALTER TABLE `table` CHANGE `Value` 
    `Value` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

Bei Ihren Vergleichen sollte jetzt zwischen Groß- und Kleinschreibung unterschieden werden.


25

Der Zeichenfolgenvergleich in der WHERE-Phrase unterscheidet nicht zwischen Groß- und Kleinschreibung. Sie könnten versuchen, mit zu vergleichen

WHERE `colname` = 'keyword'

oder

WHERE `colname` = 'KeyWord'

und Sie erhalten das gleiche Ergebnis . Das ist das Standardverhalten von MySQL.

Wenn der Vergleich zwischen Groß- und Kleinschreibung unterscheiden soll , können Sie Folgendes hinzufügen COLLATE:

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

Diese SQL würde bei diesem ein anderes Ergebnis colnameliefern : WHERE COLLATE latin1_general_cs = 'keyword'

latin1_general_cs ist eine gängige oder Standardkollatierung in den meisten Datenbanken.


16

Die von Ihnen ausgewählte Sortierung legt fest, ob Sie zwischen Groß- und Kleinschreibung unterscheiden oder nicht.


9

Bei der Standardeinstellung wird die Groß- und Kleinschreibung nicht berücksichtigt. Als Nächstes sollten Sie sich jedoch ansehen, wie die Tabelle ursprünglich erstellt wurde, da Sie beim Erstellen der Tabelle die Groß- und Kleinschreibung angeben können.

Das folgende Skript erstellt eine Tabelle. Beachten Sie unten unten "COLLATE latin1_general_cs". Das cs am Ende bedeutet Groß- und Kleinschreibung beachten. Wenn Sie möchten, dass Ihre Tabelle nicht zwischen Groß- und Kleinschreibung unterscheidet, lassen Sie diesen Teil entweder weg oder verwenden Sie "COLLATE latin1_general_ci".

   CREATE Table PEOPLE (

       USER_ID  INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

       FIRST_NAME  VARCHAR(50) NOT NULL,
       LAST_NAME  VARCHAR(50) NOT NULL,

       PRIMARY KEY (USER_ID)

   )

   ENGINE=MyISAM DEFAULT CHARACTER SET latin1
    COLLATE latin1_general_cs AUTO_INCREMENT=0;

Wenn Ihr Projekt so ist, dass Sie Ihre eigene Tabelle erstellen können, ist es sinnvoll, beim Erstellen der Tabelle Ihre Präferenz für die Groß- und Kleinschreibung anzugeben.




2

Beachten Sie auch, dass Tabellennamen unter Linux zwischen Groß- und Kleinschreibung unterscheiden, es sei denn, Sie setzen die lower_case_table_nameKonfigurationsanweisung auf 1 . Dies liegt daran, dass Tabellen durch Dateien dargestellt werden, bei denen unter Linux zwischen Groß- und Kleinschreibung unterschieden wird.

Achten Sie besonders auf die Entwicklung unter Windows, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird und die in der Produktion bereitgestellt wird, wo sie sich befindet. Beispielsweise:

"SELECT * from mytable" 

gegen Tabelle myTable wird unter Windows erfolgreich sein, aber unter Linux erneut fehlschlagen, es sei denn, die oben genannte Anweisung ist festgelegt.

Referenz hier: http://dev.mysql.com/doc/refman/5.0/de/identifier-case-sensitivity.html


1
+1 - Das Szenario, Groß- und Kleinschreibung nicht zu berücksichtigen und dann unter Linux fehlzuschlagen, ist in unserem Projekt häufig aufgetreten
Vic

@Vic Ich habe das gleiche Problem mit meinem Projekt. Würden Sie mir bitte sagen, wie Sie das Problem behoben haben?
Kamran Ahmed

@KamranAhmed, müssen Sie die Schreibweise von Tabellennamen genau so verwenden, wie sie in Erstellungsskripten erscheinen
Vic

@Vic das wäre der letzte Ausweg, da ich buchstäblich Tonnen von Abfragen ändern müsste. Ich fragte mich, ob es einen einfachen Weg geben würde, dies zu tun. Trotzdem danke!
Kamran Ahmed

@KamranAhmed, versuchen Sie, das zu ändern, lower_case_table_namewie in der Antwort angegeben, unter der wir kommentieren
Vic

1

Die derzeit akzeptierte Lösung ist größtenteils korrekt.

Wenn Sie eine nicht-binäre Zeichenfolge (CHAR, VARCHAR, TEXT) verwenden, wird bei Vergleichen gemäß der Standardkollatierung die Groß- und Kleinschreibung nicht berücksichtigt.

Wenn Sie eine Binärzeichenfolge (BINARY, VARBINARY, BLOB) verwenden, wird bei Vergleichen zwischen Groß- und Kleinschreibung unterschieden. Daher müssen Sie diese LOWERwie in anderen Antworten beschrieben verwenden.

Wenn Sie nicht die Standardkollatierung verwenden und eine nicht-binäre Zeichenfolge verwenden, wird die Groß- und Kleinschreibung durch die ausgewählte Kollatierung bestimmt.

Quelle: https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html . Lesen Sie genau. Einige andere haben es falsch verstanden zu sagen, dass Vergleiche notwendigerweise zwischen Groß- und Kleinschreibung unterscheiden oder nicht. Das ist nicht der Fall.


0

Du kannst es versuchen. hoffe, es wird nützlich sein.

SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "IAreSavage"

0

Bei Zeichenfolgenfeldern mit gesetztem Binärflag wird immer zwischen Groß- und Kleinschreibung unterschieden. Wenn Sie nach einem nicht-binären Textfeld suchen müssen, verwenden Sie Folgendes: SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;

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.