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

So stellen Sie nginx mit Docker bereit und ändern die Konfigurationsdatei

Nginx mit Docker bereitstellen, so einfach ist da...

Tutorial zur Installation der entpackten Version von mysql5.7 auf CentOS 7

1. Entpacken Sie das komprimierte MySQL-Paket in ...

MySQL-Datenbank Shell import_table Datenimport

Inhaltsverzeichnis MySQL Shell import_table Daten...

Tutorial zur MySQL-SQL-Optimierung: IN- und RANGE-Abfragen

Lassen Sie uns zunächst über die in()-Abfrage spr...

Verwenden Sie js in html, um die lokale Systemzeit abzurufen

Code kopieren Der Code lautet wie folgt: <div ...

Grundlegende Anwendungsbeispiele für benannte Slots in Vue

Vorwort Benannte Slots werden mithilfe des Attrib...

Eine kurze Analyse zum Festlegen des Anfangswerts des Linux-Roots

Ubuntu erlaubt standardmäßig keine Root-Anmeldung...

Detailliertes Tutorial zur Installation und Bereitstellung von Nginx Linux

1. Einführung in Nginx Nginx ist ein Webserver, d...

Eine kurze Diskussion über die binäre Familie von JS

Inhaltsverzeichnis Überblick Klecks Blob in Aktio...

Prinzip des Ladens von Docker-Images

Inhaltsverzeichnis Docker-Images Was ist ein Spie...

React verwendet Routing, um zur Anmeldeoberfläche umzuleiten

Im vorherigen Artikel haben wir nach der Konfigur...

Beispiele für dl-, dt- und dd-Listenbezeichnungen

Die Tags dd und dt werden für Listen verwendet. N...