Bei SQL wird zwischen Groß- und Kleinschreibung unterschieden. Ich habe MySQL und SQL Server verwendet, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird. Ist das immer so? Definiert der Standard die Groß- und Kleinschreibung?
Bei SQL wird zwischen Groß- und Kleinschreibung unterschieden. Ich habe MySQL und SQL Server verwendet, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird. Ist das immer so? Definiert der Standard die Groß- und Kleinschreibung?
Antworten:
Die SQL - Schlüsselwörter sind Groß- und Kleinschreibung ( SELECT
, FROM
, WHERE
, usw.), sind aber in allen Caps oft geschrieben. In einigen Setups wird bei Tabellen- und Spaltennamen jedoch zwischen Groß- und Kleinschreibung unterschieden. MySQL verfügt über eine Konfigurationsoption zum Aktivieren / Deaktivieren. Normalerweise werden Tabellen- und Spaltennamen unter Linux MySQL standardmäßig zwischen Groß- und Kleinschreibung unterschieden, und unter Windows wurde die Groß- und Kleinschreibung nicht berücksichtigt. Jetzt hat das Installationsprogramm dies während des Setups abgefragt. Für MSSQL ist dies eine Funktion der Sortiereinstellung der Datenbank.
Hier ist die MySQL-Seite über die Groß- und Kleinschreibung von Namen
Hier ist der Artikel in MSDN über Kollatierungen für MSSQL
In SQL Server ist dies eine Option . Das Einschalten ist zum Kotzen.
Ich bin mir bei MySQL nicht sicher.
Bezeichner und reservierte Wörter sollten nicht zwischen Groß- und Kleinschreibung unterscheiden, obwohl viele einer Konvention folgen, Großbuchstaben für reservierte Wörter und Groß- und Kleinschreibung für Bezeichner zu verwenden.
Siehe SQL-92 Sec. 5.2
Die SQL92-Spezifikation besagt, dass Bezeichner möglicherweise in Anführungszeichen oder nicht in Anführungszeichen gesetzt werden. Wenn beide Seiten nicht zitiert sind, wird immer zwischen Groß- und Kleinschreibung unterschieden, z table_name == TAble_nAmE
.
Bei zitierten Bezeichnern wird jedoch zwischen Groß- und Kleinschreibung unterschieden, z "table_name" != "TAble_naME"
. Basierend auf der Spezifikation können nicht zitierte und zitierte Bezeichner als gleich angesehen werden, wenn die nicht zitierten Zeichen in Großbuchstaben geschrieben sind, z . B. TABLE_NAME == "TABLE_NAME"
aber TABLE_NAME != "table_name"
oder TABLE_NAME != "TAble_NaMe"
.
Hier ist der relevante Teil der Spezifikation (Abschnitt 5.2.13):
13)A <regular identifier> and a <delimited identifier> are equiva-
lent if the <identifier body> of the <regular identifier> (with
every letter that is a lower-case letter replaced by the equiva-
lent upper-case letter or letters) and the <delimited identifier
body> of the <delimited identifier> (with all occurrences of
<quote> replaced by <quote symbol> and all occurrences of <dou-
blequote symbol> replaced by <double quote>), considered as
the repetition of a <character string literal> that specifies a
<character set specification> of SQL_TEXT and an implementation-
defined collation that is sensitive to case, compare equally
according to the comparison rules in Subclause 8.2, "<comparison
predicate>".
Beachten Sie, dass genau wie bei anderen Teilen des SQL-Standards nicht alle Datenbanken diesem Abschnitt vollständig folgen. PostgreSQL speichert beispielsweise alle nicht zitierten Bezeichner in Kleinbuchstaben statt in Großbuchstaben table_name == "table_name"
(was genau das Gegenteil des Standards ist). Außerdem unterscheiden einige Datenbanken ständig zwischen Groß- und Kleinschreibung, oder die Groß- und Kleinschreibung hängt von bestimmten Einstellungen in der Datenbank ab oder von einigen Eigenschaften des Systems, normalerweise davon, ob das Dateisystem zwischen Groß- und Kleinschreibung unterscheidet oder nicht.
Beachten Sie, dass einige Datenbank-Tools möglicherweise ständig zitierte Bezeichner senden. In Fällen, in denen Sie von einem Tool generierte Abfragen (z. B. eine von Liquibase oder einem anderen DB-Migrationstool generierte CREATE TABLE-Abfrage) mit handgefertigten Abfragen (z. B. einer einfachen JDBC-Auswahl) mischen in Ihrer Anwendung) müssen Sie sicherstellen, dass die Fälle konsistent sind, insbesondere in Datenbanken, in denen zitierte und nicht zitierte Bezeichner unterschiedlich sind (DB2, PostgreSQL usw.)
Nach meinem Verständnis erfordert der SQL-Standard die Berücksichtigung der Groß- und Kleinschreibung. Ich glaube jedoch nicht, dass Datenbanken vollständig dem Standard entsprechen.
MySQL verfügt über eine Konfigurationseinstellung als Teil seines "strengen Modus" (eine Sammlung verschiedener Einstellungen, die MySQL standardkonformer machen) für Tabellennamen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird. Unabhängig von dieser Einstellung wird bei Spaltennamen immer noch nicht zwischen Groß- und Kleinschreibung unterschieden, obwohl dies meiner Meinung nach die Anzeige der Spaltennamen beeinflusst. Ich glaube, diese Einstellung ist in allen Datenbanken innerhalb der RDBMS-Instanz instanzweit, obwohl ich heute nachforsche, um dies zu bestätigen (und hoffe, dass die Antwort Nein lautet).
Mir gefällt, wie Oracle damit weitaus besser umgeht. In Straight SQL wird bei Bezeichnern wie Tabellen- und Spaltennamen die Groß- und Kleinschreibung nicht berücksichtigt. Wenn Sie jedoch aus irgendeinem Grund wirklich eine explizite Groß- und Kleinschreibung wünschen, können Sie den Bezeichner in doppelte Anführungszeichen setzen (die sich in Oracle SQL erheblich von den einfachen Anführungszeichen unterscheiden, die zum Einschließen von Zeichenfolgendaten verwendet werden). So:
SELECT fieldName
FROM tableName;
abfragt Feldname von Tabellennamen , aber
SELECT "fieldName"
FROM "tableName";
wird abgefragt Feldname von Tabellennamen .
Ich bin mir ziemlich sicher, dass Sie diesen Mechanismus sogar verwenden können, um Leerzeichen oder andere nicht standardmäßige Zeichen in einen Bezeichner einzufügen.
In dieser Situation stand es Ihnen zur Verfügung, wenn Sie aus irgendeinem Grund explizit umschlossene Tabellen- und Spaltennamen wünschenswert fanden, aber es war immer noch etwas, vor dem ich sehr warnen würde.
Meine Konvention, wenn ich Oracle täglich verwendete, war, dass ich im Code alle Oracle SQL-Schlüsselwörter in Großbuchstaben und alle Bezeichner in Kleinbuchstaben schreibe. In der Dokumentation würde ich alle Tabellen- und Spaltennamen in Großbuchstaben setzen. Es war sehr praktisch und lesbar, dies tun zu können (obwohl es manchmal schwierig ist, so viele Großbuchstaben in Code einzugeben - ich bin sicher, ich hätte hier eine Editorfunktion finden können, die mir hilft).
Meiner Meinung nach ist MySQL besonders schlecht, wenn es darum geht, sich auf verschiedenen Plattformen zu unterscheiden. Wir müssen in der Lage sein, Datenbanken unter Windows zu sichern und in UNIX zu laden. Dies ist eine Katastrophe, wenn das Installationsprogramm unter Windows vergessen hat, das RDBMS in den Groß- und Kleinschreibung-Modus zu versetzen. (Um fair zu sein, ein Teil des Grundes, warum dies eine Katastrophe ist, ist, dass unsere Programmierer vor langer Zeit die schlechte Entscheidung getroffen haben, sich auf die Groß- und Kleinschreibung von MySQL unter UNIX zu verlassen.) Die Leute, die das Windows MySQL-Installationsprogramm geschrieben haben, haben es wirklich bequem und bequem gemacht Windows-ähnlich, und es war großartig, den Leuten ein Kontrollkästchen zu geben, mit dem sie sagen können: "Möchten Sie den strengen Modus aktivieren und MySQL standardkonformer machen?" Aber es ist sehr praktisch für MySQL, sich so deutlich vom Standard zu unterscheiden. und dann die Sache noch schlimmer machen, indem man sich auf verschiedenen Plattformen umdreht und von seinem eigenen De-facto-Standard abweicht. Ich bin mir sicher, dass dies bei unterschiedlichen Linux-Distributionen noch weiter verschärft werden kann, da Packager für verschiedene Distributionen wahrscheinlich zeitweise ihre eigenen bevorzugten MySQL-Konfigurationseinstellungen integriert haben.
Hier ist eine weitere SO-Frage, mit der diskutiert wird, ob in einem RDBMS Groß- und Kleinschreibung erwünscht ist.
Nein. MySQL unterscheidet nicht zwischen Groß- und Kleinschreibung und der SQL-Standard auch nicht. Es ist nur üblich, die Befehle in Großbuchstaben zu schreiben.
Wenn Sie jetzt über Tabellen- / Spaltennamen sprechen, dann ja, aber nicht die Befehle selbst.
So
SELECT * FROM foo;
ist das gleiche wie
select * from foo;
aber nicht das gleiche wie
select * from FOO;
Ich fand diesen Blog-Beitrag sehr hilfreich (ich bin nicht der Autor). Zusammenfassend (bitte lesen Sie jedoch):
... Begrenzte Bezeichner unterscheiden zwischen Groß- und Kleinschreibung ("Tabellenname"! = "Tabellenname"), nicht zitierte Bezeichner nicht und werden in Großbuchstaben umgewandelt (Tabellenname => TABLE_NAME).
Er fand, dass DB2, Oracle und Interbase / Firebird 100% kompatibel sind:
PostgreSQL ... setzt jeden nicht zitierten Bezeichner in Kleinbuchstaben, anstatt ihn in Großbuchstaben zu setzen. MySQL ... Dateisystemabhängig. SQLite- und SQL Server-Groß- / Kleinschreibung der Tabellen- und Feldnamen bleiben bei der Erstellung erhalten, werden jedoch anschließend vollständig ignoriert.
Bei SQL-Schlüsselwörtern wird die Groß- und Kleinschreibung nicht berücksichtigt.
Namen von Tabellen, Spalten usw. haben eine datenbankabhängige Groß- und Kleinschreibung. Sie sollten wahrscheinlich davon ausgehen, dass sie zwischen Groß- und Kleinschreibung unterscheiden, sofern Sie nichts anderes wissen Namen sind nicht).
Der Vergleich von Daten mit =,>, <usw. hat eine Fallerkennung, die von den Sortiereinstellungen abhängt, die für die jeweilige Datenbank, Tabelle oder sogar Spalte verwendet werden. Es ist jedoch normal, die Sortierung innerhalb einer Datenbank ziemlich konsistent zu halten. Wir haben einige Spalten, in denen Werte zwischen Groß- und Kleinschreibung gespeichert werden müssen. Sie haben eine speziell festgelegte Zusammenstellung.
Habe das Beste aus beiden Welten
Heutzutage können Sie einfach alle Ihre SQL-Anweisungen in Kleinbuchstaben schreiben. Wenn Sie sie jemals formatieren müssen, installieren Sie einfach ein Plugin, das dies für Sie erledigt. Dies gilt nur, wenn Ihr Code-Editor über diese Plugins verfügt. VSCode verfügt über viele Erweiterungen, die dies tun können.