MySQL unterscheidet zwischen Groß- und Kleinschreibung Wer die Worte sieht, glaubt es, wer den Titel sieht, weiß, was darin steht. Sind Sie schon einmal hereingelegt worden, weil MySQL zwischen Groß- und Kleinschreibung unterscheidet? Ich habe zuvor das Alibaba Java Development Manual gelesen und in der Spezifikation zur MySql-Tabellenerstellung gesehen: [Obligatorisch] Tabellennamen und Feldnamen müssen Kleinbuchstaben oder Zahlen enthalten. Sie dürfen nicht mit Zahlen beginnen oder nur Zahlen zwischen zwei Unterstrichen enthalten. Das Ändern der Datenbankfeldnamen ist sehr kostspielig und da eine Vorabversion nicht möglich ist, müssen die Feldnamen sorgfältig überlegt werden. Hinweis: Bei MySQL wird unter Windows die Groß-/Kleinschreibung nicht beachtet, unter Linux hingegen standardmäßig. Um unnötige Komplikationen zu vermeiden, sind daher in Datenbanknamen, Tabellennamen und Feldnamen keine Großbuchstaben zulässig. Positives Beispiel: aliyun_admin, rdc_config, level 3_name Negatives Beispiel: AliyunAdmin, rdcConfig, level 3 name Wenn Sie noch nie tatsächlich auf ein ähnliches Problem gestoßen sind, kann es sein, dass Sie diese Vorschriften beim bloßen trockenen Lesen nicht vollständig erfassen können und sie nur vage verstehen und auswendig lernen. 01 Eine Geschichte über Briefgrößen Ich habe kürzlich an einem Projekt herumgebastelt. Während der Entwicklung und beim Testen auf meinem eigenen Rechner gab es keine Probleme, aber nach der Bereitstellung auf dem Linux-Server habe ich einen Fehler festgestellt. Die Protokollinformationen lauten ungefähr wie folgt: MySQLSyntaxErrorException: Tabelle ‚kytu.tb_sutyHo‘ existiert nicht Es gibt ein Problem, das mich ein wenig deprimiert. Die lokale Entwicklung ist in Ordnung, aber die Bereitstellung auf dem Server funktioniert nicht. Es gibt Geister ... aber keine Panik. Anhand der Fehlermeldung ist es offensichtlich, dass die Tabelle tb_sutyHo nicht existiert! ① Also habe ich in aller Ruhe nv (navicat) geöffnet, um zu prüfen, ob die Tabelle existiert. Sie existierte tatsächlich. In der Datenbank war sie tb_sutyho, aber das h war klein geschrieben. ② Nachdem ich den Code überprüft hatte, stellte ich fest, dass der Tabellenname tatsächlich als „tb_sutyHo“ geschrieben wurde, wobei das „h“ als großes „H“ geschrieben wurde. Das Problem wurde gefunden. Es stellte sich heraus, dass ich beim Schreiben von SQL versehentlich den falschen Tabellennamen geschrieben hatte. Ich habe es gelöst, indem ich den Tabellennamen geändert habe, und die Funktionen sind jetzt normal. Normalerweise sollte die Geschichte hier enden, oder? Das Problem wurde gefunden und behoben, alles ist in Ordnung und wir können später Hühnchen essen. Für mich, der nicht weiß, wie man PUBG spielt, ist das nicht das Ende. Es ist zwar wichtig, Probleme zu finden und zu lösen, aber es ist wichtiger, die Grundursache des Problems zu finden, damit Sie solche Probleme beim nächsten Mal vermeiden können. Fallen Sie als Programmierer nicht zweimal in dieselbe Falle. Ich habe über diese Frage nachgedacht: Warum wird diese Fehlermeldung nicht in der lokalen Windows-Umgebung angezeigt? Es muss warten, bis ich den Server bereitstelle, bevor es angezeigt wird. Was ist das Problem? (Wenn Sie mit der Größensensitivität von MySQL vertraut sind, können Sie den folgenden Inhalt überspringen.) Also habe ich eine Suchmaschine verwendet und herausgefunden, dass die Groß-/Kleinschreibung von Datenbank- und Tabellennamen in MySQL durch den Parameter lower_case_table_names gesteuert wird. In der lokalen Windows-Umgebung wie folgt anzeigen: mysql> Variablen wie „%case%“ anzeigen; +------------------------+----------+ | Variablenname | Wert | +------------------------+----------+ | Dateisystem in Kleinbuchstaben | EIN | | Tabellennamen in Kleinbuchstaben | 1 | +------------------------+----------+ Überprüfen Sie auf dem Linux-Server Folgendes: mysql> Variablen wie „%case%“ anzeigen; +------------------------+----------+ | Variablenname | Wert | +------------------------+----------+ | Dateisystem in Kleinbuchstaben | AUS | | Tabellennamen in Kleinbuchstaben | 0 | +------------------------+----------+ Anhand der obigen Ergebnisse ist der Unterschied zu erkennen, allerdings habe ich für diese beiden Parameter noch kein Gespür und weiß nicht, was sie konkret bedeuten. Wenn wir „lower_case_table_names“ einführen, sprechen wir auch über „lower_case_file_system“. Kleinbuchstabendateisystem Diese Variable beschreibt die Groß-/Kleinschreibung von Dateinamen im Dateisystem, in dem sich das Datenverzeichnis befindet. AUS bedeutet, dass bei Dateinamen die Groß-/Kleinschreibung beachtet wird, EIN bedeutet, dass die Groß-/Kleinschreibung nicht beachtet wird. Diese Variable ist schreibgeschützt, da sie eine Dateisystemeigenschaft widerspiegelt und ihre Festlegung keine Auswirkung auf das Dateisystem hat. Kleinbuchstabentabellennamen Dieser Parameter ist statisch und kann auf 0, 1 oder 2 gesetzt werden. 0 – Groß-/Kleinschreibung beachten. (Unix, Linux-Standard) Die erstellte Bibliothekstabelle wird unverändert auf der Festplatte gespeichert. Beispiel: „Datenbank TeSt erstellen“ erstellt ein TeSt-Verzeichnis, „Tabelle AbCCC erstellen“ … generiert AbCCC.frm unverändert. Die SQL-Anweisung wird ebenfalls unverändert analysiert. 1 – Groß-/Kleinschreibung wird nicht beachtet. (Windows-Standard) Beim Erstellen einer Bibliothekstabelle konvertiert MySQL alle Bibliothekstabellennamen in Kleinbuchstaben und speichert sie auf der Festplatte. SQL-Anweisungen konvertieren auch die Bibliotheks- und Tabellennamen in Kleinbuchstaben. Wenn Sie die zuvor erstellte Testtabelle abfragen müssen (die Datei Testtable.frm generieren), wird diese, selbst wenn Sie „select * from Testtable“ ausführen, in „select * from testtable“ konvertiert, wodurch die Fehlertabelle nicht existiert. 2 – Keine Berücksichtigung der Groß-/Kleinschreibung (OS X-Standard). Die erstellte Bibliothekstabelle wird unverändert auf der Festplatte gespeichert. Die SQL-Anweisung konvertiert den Namen der Bibliothekstabelle jedoch in Kleinbuchstaben. Unter Windows ist der Standardwert 1. Unter macOS ist der Standardwert 2. Unter Linux wird der Wert 2 nicht unterstützt; der Server erzwingt stattdessen den Wert 0. Unter Windows ist der Standardwert 1. Unter macOS ist der Standardwert 2. Der Wert 2 wird unter Linux nicht unterstützt; der Server erzwingt den Wert 0. Und auf der offiziellen Website heißt es außerdem: Wenn Sie MySQL auf einem System ausführen, bei dem sich das Datenverzeichnis auf einem Dateisystem befindet, bei dem die Groß-/Kleinschreibung nicht beachtet wird (wie etwa Windows oder macOS), sollten Sie lowercasetable_names nicht auf 0 setzen. Als ich in meiner Windows 10-Umgebung versucht habe, lower_case_table_names auf 0 zu setzen, konnte der MySQL-Dienst nicht gestartet werden und beim Starten des Dienstes wurde ein Fehler gemeldet. Das Windows-System unterscheidet nicht zwischen Groß- und Kleinschreibung, siehe folgende Abbildung: Hinweis: Wenn Sie den Wert von lower_case_table_names ändern möchten, ändern Sie die Konfigurationsdatei my.ini unter Windows und die Konfigurationsdatei my.cnf unter Linux. Sie müssen den Dienst neu starten. Informationen zu bestimmten Vorgängen finden Sie online. 02 Hinweise Häufige Risiken durch die Änderung von lowercasetable_names: Wenn eine Bibliothekstabelle mit Großbuchstaben erstellt wird, wenn lower_case_table_names=0 ist, wird sie nach der Änderung auf lower_case_table_names=1 nicht gefunden. Setzen Sie zuerst lower_case_table_names=0 CREATE TABLE `Student` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(25) NICHT NULL, PRIMÄRSCHLÜSSEL (`id`) )ENGINE=InnoDB STANDARD-CHARSET=utf8; Tabellen anzeigen; +----------------+ | Tabellen_in_aflyun | +----------------+ | Student | +----------------+ Setzen Sie dann lower_case_table_names=1 und führen Sie die Abfrage aus. Unabhängig davon, ob der Tabellenname groß oder klein geschrieben ist, wird angezeigt, dass die Tabelle nicht existiert. mysql> wähle * von Student; 1146 - Tabelle 'aflyun.Student' existiert nicht mysql> wähle * vom Studenten aus; 1146 - Tabelle 'aflyun.student' existiert nicht Lösung: Wenn Sie den Standardwert „lower_case_tables_name“ von 0 auf 1 setzen möchten, müssen Sie zunächst die vorhandenen Bibliothekstabellennamen in Kleinbuchstaben umwandeln. Für den Fall, dass der Tabellenname nur Großbuchstaben enthält: ①. Wenn lower_case_tables_name=0, führen Sie die Umbenennung der Tabelle in Kleinbuchstaben aus. ②. Setzen Sie lower_case_tables_name=1 und starten Sie neu, damit die Änderungen wirksam werden. Für den Fall, dass der Bibliotheksname Großbuchstaben enthält: ①. Wenn lower_case_tables_name=0 ist, verwenden Sie mysqldump, um die alte Datenbank zu exportieren und zu löschen. ②. Setzen Sie lower_case_tables_name=1 und starten Sie neu, damit die Änderungen wirksam werden. ③. Importieren Sie Daten in die Instanz. Zu diesem Zeitpunkt wurden die Bibliotheksnamen, die Großbuchstaben enthielten, in Kleinbuchstaben umgewandelt. 03 Fazit Durch die Erfahrung beim Betreten der Grube habe ich ein tieferes Verständnis der eingangs erwähnten Ali MySQL-Spezifikation. Unterschiedliche Betriebssysteme führen zu einer inkonsistenten Groß-/Kleinschreibung. Bei der Entwicklung sollten wir das Prinzip der Groß- und Kleinschreibung beachten, damit das entwickelte Programm mit verschiedenen Betriebssystemen kompatibel ist. Daher wird empfohlen, den Wert von lower_case_table_names in der Entwicklungs- und Testumgebung auf 0 zu setzen, um die Groß-/Kleinschreibung des Codes während der Entwicklung streng zu kontrollieren und die Kompatibilität und Genauigkeit des Codes zu verbessern. Das könnte Sie auch interessieren:
|
<<: Implementierung des iview-Berechtigungsmanagements
>>: So implementieren Sie Linux Deepin, um redundante Kernel zu löschen
Elastic Stack, allgemein bekannt als ELK Stack, i...
1. Befehlseinführung Der Befehl chkconfig wird zu...
Hier ist ein Fall des Ziehens einer modalen Box. ...
Im vorherigen Blog haben wir über die Verwendung ...
Es gibt zwei Versionen der MySQL-Datenbankverwalt...
Viele Leute haben mich auch gefragt, welche Büche...
Holen Sie sich das aktuelle Datum + die aktuelle ...
<br />Ich werde mit diesem Problem im Grunde...
Dies liegt daran, dass der Datenbankserver so ein...
Vorwort: In MySQL sind Ansichten wahrscheinlich e...
Da es zu mühsam ist, jedes Mal das Installationst...
Inhaltsverzeichnis Ergebnisse erzielen Vollständi...
Vorwort ActiveMQ ist der beliebteste und leistung...
Inhaltsverzeichnis Zeichensatz Vergleichsregeln V...
Inhaltsverzeichnis Vergleichen Sie die leere Zeic...