Detaillierte Analyse des Problems der Groß-/Kleinschreibung von Bezeichnern in MySQL

Detaillierte Analyse des Problems der Groß-/Kleinschreibung von Bezeichnern in MySQL

In MySQL kann das Problem der Groß- und Kleinschreibung von Tabellennamen auftreten. Tatsächlich hängt dies mit der Plattform (Betriebssystem) und der Systemvariable lower_case_table_names zusammen. Zusammenfassend können Sie sich bei Interesse das offizielle Dokument „Identifier Case Sensitivity“ ansehen.

In MySQL entsprechen Datenbanken Verzeichnissen innerhalb des Datenverzeichnisses. Jede Tabelle in einer Datenbank entspricht mindestens einer Datei innerhalb des Datenbankverzeichnisses (und möglicherweise mehr, abhängig von der Speicher-Engine). Trigger entsprechen ebenfalls Dateien. Folglich spielt die Groß-/Kleinschreibung des zugrunde liegenden Betriebssystems eine Rolle bei der Groß-/Kleinschreibung von Datenbank-, Tabellen- und Triggernamen. Das bedeutet, dass solche Namen unter Windows nicht zwischen Groß- und Kleinschreibung unterscheiden, in den meisten Unix-Varianten jedoch schon. Eine bemerkenswerte Ausnahme ist macOS, das auf Unix basiert, aber einen Standarddateisystemtyp (HFS+) verwendet, der nicht zwischen Groß- und Kleinschreibung unterscheidet. macOS unterstützt jedoch auch UFS-Volumes, die wie jedes Unix zwischen Groß- und Kleinschreibung unterscheiden. Weitere Informationen finden Sie unter Abschnitt 1.8.1, „MySQL-Erweiterungen zu Standard-SQL“. Die Systemvariable lower_case_table_names beeinflusst auch, wie der Server mit der Groß-/Kleinschreibung von Bezeichnern umgeht, wie später in diesem Abschnitt beschrieben wird.

In MySQL entsprechen Datenbanken Verzeichnissen innerhalb des Datenverzeichnisses. Jede Tabelle in einer Datenbank entspricht mindestens einer Datei (je nach Speicher-Engine möglicherweise mehr) im Datenbankverzeichnis. Trigger entsprechen auch Dateien. Daher spielt die Groß-/Kleinschreibung des zugrunde liegenden Betriebssystems eine wichtige Rolle bei der Groß-/Kleinschreibung von Datenbank-, Tabellen- und Triggernamen. Dies bedeutet, dass die Groß-/Kleinschreibung unter Windows nicht beachtet wird, in den meisten Unix-Varianten jedoch schon. Eine bemerkenswerte Ausnahme ist macOS, das auf Unix basiert, aber einen Groß-/Kleinschreibung nicht berücksichtigenden Standarddateisystemtyp (HFS+) verwendet. Allerdings unterstützt macOS auch UFS-Volumes, die wie jedes Unix zwischen Groß- und Kleinschreibung unterscheiden. Siehe Abschnitt 1.8.1, „MySQL-Erweiterungen zu Standard-SQL“. Die Systemvariable lower_case_table_names beeinflusst auch, wie der Server die Groß-/Kleinschreibung von Bezeichnern handhabt, wie später in diesem Abschnitt beschrieben.

Linux:

Bei Datenbanknamen und Tabellennamen muss die Groß-/Kleinschreibung streng beachtet werden.
Bei Tabellenaliasen wird streng zwischen Groß- und Kleinschreibung unterschieden.
Bei Spaltennamen und Spaltenaliasnamen wird in allen Fällen die Groß-/Kleinschreibung nicht beachtet.
Auch bei Variablennamen muss die Groß-/Kleinschreibung streng beachtet werden.

Windows:

Keine Groß-/Kleinschreibung beachten
Unter Mac OS (Nicht-UFS-Volume):
Keine Groß-/Kleinschreibung beachten

Hinweis: Bei Spaltennamen, Indizes, gespeicherten Prozeduren und Ereignisnamen wird auf keiner Plattform die Groß-/Kleinschreibung beachtet. Auch bei Spaltenaliasen wird die Groß-/Kleinschreibung nicht beachtet.

Hinweis: Bei Spalten-, Index-, gespeicherten Routine- und Ereignisnamen sowie bei Spaltenaliasnamen wird auf keiner Plattform die Groß-/Kleinschreibung beachtet.

Die folgende Testumgebung ist Red Hat Enterprise Linux Server Release 5.7, MySQL 5.6.20:

mysql> Variablen wie „lower_case_table_names“ anzeigen;
+------------------------+----------+
| Variablenname | Wert |
+------------------------+----------+
| Tabellennamen in Kleinbuchstaben | 0 |
+------------------------+----------+
1 Zeile im Satz (0,00 Sek.)
MySQL> 
mysql> verwende mydb;
Datenbank geändert
mysql> Tabelle erstellen Test (ID int);
Abfrage OK, 0 Zeilen betroffen (0,07 Sek.)
mysql> Tabelle erstellen TEST(id int);
Abfrage OK, 0 Zeilen betroffen (0,09 Sek.)
mysql> in Testwerte einfügen (1);
Abfrage OK, 1 Zeile betroffen (0,03 Sek.)
mysql> in TEST-Wert einfügen (2);
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
mysql> wähle * aus Test;
+------+
|Ich würde|
+------+
| 1 |
+------+
1 Zeile im Satz (0,00 Sek.)
mysql> wähle * aus TEST;
+------+
|Ich würde|
+------+
| 2 |
+------+
1 Zeile im Satz (0,00 Sek.)
MySQL>

Nachdem Sie lower_case_table_names=1 in der Konfigurationsdatei my.cnf festgelegt haben (1 bedeutet Groß-/Kleinschreibung wird nicht beachtet, 0 bedeutet Groß-/Kleinschreibung wird beachtet), starten Sie den MySQL-Dienst neu und führen Sie den folgenden Test durch:

mysql> verwende mydb;
Einlesen von Tabelleninformationen zur Vervollständigung von Tabellen- und Spaltennamen
Sie können diese Funktion deaktivieren, um einen schnelleren Start mit -A zu erhalten
Datenbank geändert
mysql> wähle * aus Test;
+------+
|Ich würde|
+------+
| 1 |
+------+
1 Zeile im Satz (0,00 Sek.)
mysql> wähle * aus TEST;
+------+
|Ich würde|
+------+
| 1 |
+------+
1 Zeile im Satz (0,00 Sek.)
MySQL> 

Sie können sehen, dass zu diesem Zeitpunkt, egal ob test, TEST oder Test, auf alle als test zugegriffen wird. Zu diesem Zeitpunkt kann auf die Tabelle „TEST“ nicht zugegriffen werden. Die Systemvariable lower_case_table_names ist eine schreibgeschützte Variable und kann in der aktuellen Sitzung nicht geändert werden. Unter dieser Einstellung tritt bei Verwendung von mysqldump zum Sichern der Datenbank der folgende Fehler auf, wenn derselbe Tabellenname vorhanden ist:

mysqldump: Habe Fehler erhalten: 1066: Nicht eindeutige Tabelle/Alias: „Test“ bei Verwendung von LOCK TABLES

Diese Situation ist ziemlich problematisch. Sie müssen die Variable lower_case_table_names=0 in der Konfigurationsdatei my.cnf festlegen und den MySQL-Dienst neu starten. Daher ist es sehr wichtig, vorauszuplanen und eine einheitliche Benennungsregel zu verwenden, um solche Probleme zu vermeiden. Darüber hinaus hat die Systemvariable lower_case_table_names drei Werte: 0, 1 und 2.

1. Auf 0 setzen: Tabellennamen werden in der gleichen Schreibweise wie das von Ihnen geschriebene SQL gespeichert, Großbuchstaben sind Großbuchstaben und Kleinbuchstaben sind Kleinbuchstaben, und beim Vergleich wird zwischen Groß- und Kleinschreibung unterschieden.

2. Auf 1 setzen: Tabellennamen werden in Kleinbuchstaben umgewandelt und auf der Festplatte gespeichert, und bei Vergleichen wird nicht zwischen Groß- und Kleinschreibung unterschieden.

3. Auf 2 setzen: Tabellennamen werden entsprechend der Groß-/Kleinschreibung des von Ihnen geschriebenen SQL gespeichert, Großbuchstaben sind Großbuchstaben und Kleinbuchstaben sind Kleinbuchstaben, und beim Vergleich werden sie alle in Kleinbuchstaben umgewandelt.


In Bezug auf die Groß- und Kleinschreibung von Datenbanknamen können folgende Probleme auftreten:

1: FEHLER 1010 (HY000): Fehler beim Löschen der Datenbank (rmdir „./xxxx“ nicht möglich, Fehlernummer: 39)

1: FEHLER 1010 (HY000): Fehler beim Löschen der Datenbank (rmdir „./xxxx“ nicht möglich, Fehlernummer: 39)

mysql> Datenbanken anzeigen;
+--------------------+
| Datenbank |
+--------------------+
| Informationsschema |
|MeineDatenbank|
| meinedb |
|mysql |
| Leistungsschema |
|tmonitor|
| xiangrun |
+--------------------+
7 Zeilen im Satz (0,01 Sek.)
mysql> Variablen wie „lower_case_table_names“ anzeigen;
+------------------------+----------+
| Variablenname | Wert |
+------------------------+----------+
| Tabellennamen in Kleinbuchstaben | 1 |
+------------------------+----------+
1 Zeile im Satz (0,00 Sek.)
mysql> Datenbank mydb löschen;
FEHLER 1010 (HY000): Fehler beim Löschen der Datenbank (RMDIR „./mydb“ nicht möglich, Fehlernummer: 39)
MySQL>

Lösung: Setzen Sie die Variable lower_case_table_names=0 in der Konfigurationsdatei my.cnf, starten Sie den MySQL-Dienst neu und löschen Sie anschließend die Datenbank.

2: FEHLER 1049 (42000): Unbekannte Datenbank 'xxx'

mysql> Variablen wie „lower_case_table_names“ anzeigen;
+------------------------+----------+
| Variablenname | Wert |
+------------------------+----------+
| Tabellennamen in Kleinbuchstaben | 1 |
+------------------------+----------+
1 Zeile im Satz (0,01 Sek.)
MySQL> 
mysql> Datenbanken anzeigen;
+--------------------+
| Datenbank |
+--------------------+
| Informationsschema |
|MeineDatenbank|
|mysql |
| Leistungsschema |
|tmonitor|
| xiangrun |
+--------------------+
6 Zeilen im Satz (0,01 Sek.)
mysql> MyDB verwenden;
FEHLER 1049 (42000): Unbekannte Datenbank „mydb“
MySQL>

Quellen:

https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html

Zusammenfassen

Oben habe ich Ihnen das Problem der Groß- und Kleinschreibung von Bezeichnern in MySQL vorgestellt. Ich hoffe, es wird Ihnen helfen. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!

Das könnte Sie auch interessieren:
  • MySQL-Fall bei der Verwendungsbeispielanalyse
  • Detailliertes Beispiel für die Verwendung der Case-Anweisung in einer gespeicherten MySQL-Prozedur
  • Beispiel für die Verwendung von CASE WHEN beim Sortieren in MySQL
  • MySQL-Fall beim Gruppieren nach Beispiel
  • Detaillierte Erklärung des Mysql-Falls und der Verwendung
  • MySQL-Update-Fall Update-Feldwert ist keine feste Operation

<<:  Implementierung der Änderung von Konfigurationsdateien im Docker-Container

>>:  Realisieren Sie einen super coolen Wasserlichteffekt auf Leinwandbasis

Artikel empfehlen

Verwendung und Prinzipien von Provide und Inject in Vue3

Vorwort: Beim Übergeben von Daten zwischen überge...

Detaillierte Erläuterung der gleichzeitigen Parameteranpassung von MySQL

Inhaltsverzeichnis Abfrage-Cache-Optimierung Über...

Spezifische Verwendung globaler Variablen von node.js

Globales Objekt Alle Module können aufgerufen wer...

Javascript zum Erzielen eines Trommeleffekts

In diesem Artikel wird der spezifische Code von J...

Zusammenfassung der 10 wichtigsten JavaScript-Interviewfragen (empfohlen)

1.Dies deutet auf 1. Wer ruft wen an? Beispiel: F...

CentOS 8 ist jetzt verfügbar

CentOS 8 ist jetzt verfügbar! Die Versionen von C...

Rendern im Vue-Scaffolding verstehen

Im Vue-Gerüst können wir sehen, dass im neuen Vue...

Zusammenfassung der MySQL-Sperrwissenspunkte

Das Konzept des Schlosses ①. Im wirklichen Leben ...

Anweisungen zur Verwendung der MySQL-Isolations-Leseansicht

Welche historische Version kann die aktuelle Tran...

Beispiel für eine einfache Operation einer MySQL-Abfrageanweisung

Dieser Artikel veranschaulicht anhand von Beispie...