Bei der SQL-Syntax wird zwischen Groß- und Kleinschreibung unterschieden?

199

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?

Steve Tranby
quelle

Antworten:

181

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

Stefan Rusek
quelle
7
Einige Systeme (wie PostgreSQL) unterscheiden bei Tabellen- und Spaltennamen zwischen Groß- und Kleinschreibung. Versuchen Sie jedoch, alle Namen in Klein- oder Großbuchstaben auszublenden, bevor Sie sie nachschlagen. Auf diesen Systemen müssen Sie den Tabellennamen in doppelte Anführungszeichen setzen, um sicherzustellen, dass der genaue Name, den Sie eingegeben haben, nachgeschlagen wird.
Michael Ratanapintha
2
"aber oft in
Großbuchstaben
3
Wenn beispielsweise der MS SQL-Server mit einer Sortierung installiert wird, bei der zwischen Groß- und Kleinschreibung unterschieden wird, wird bei Tabellen-, Spalten- und Variablennamen zwischen Groß- und Kleinschreibung unterschieden, selbst wenn bei der Datenbank eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung erfolgt.
Vadym Stetsiak
3
@BlackTigerX - In den Oracle-Handbüchern sind alle SQL-Beispiele mit Schlüsselwörtern (SELECT, FROM, WHERE usw.) in Großbuchstaben, Tabellen- und Spaltennamen in Kleinbuchstaben angegeben.
J. Polfer
Hmmm, gilt das immer noch für MySQL? Ich dachte, ich hätte eine Standardinstallation von MySQL, und bei Spaltennamen wird die Groß- und Kleinschreibung nicht berücksichtigt.
Kzqai
22

Dies ist keine reine SQL-Sprache. In SQL Server wird jedoch bei allen Tabellennamen zwischen Groß- und Kleinschreibung unterschieden, wenn bei Ihrer Datenbanksortierung zwischen Groß- und Kleinschreibung unterschieden wird.

Cade Roux
quelle
16

In SQL Server ist dies eine Option . Das Einschalten ist zum Kotzen.

Ich bin mir bei MySQL nicht sicher.

JosephStyons
quelle
In MySql können Sie die Groß- und Kleinschreibung nicht berücksichtigen. Nur, dass die Unempfindlichkeit nicht so funktioniert, wie Sie es unter Linux annehmen würden, wenn das Dateisystem zwischen Groß- und Kleinschreibung unterscheidet (Standard). Sie müssen unter Linux ein Dateisystem erstellen, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, damit die Groß- und Kleinschreibung bei MySQL genauso funktioniert wie unter Windows (= ordnungsgemäß). Insbesondere das Ein- und Ausschalten nach einigen Arbeiten im anderen Modus kann schlimme Folgen haben.
Stefan Steiger
14

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

Schlüsselfertig
quelle
13

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.)

SztupY
quelle
10

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.

Skiphoppy
quelle
5

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;
cmcculloh
quelle
2
In den meisten RDBMS wird bei Tabellennamen auch nicht zwischen Groß- und Kleinschreibung unterschieden. Zumindest nicht standardmäßig. MySQL ist die bekannteste Ausnahme von dieser Regel.
4

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.

Matthew Cornell
quelle
2

Ich denke nicht, dass SQL Server zwischen Groß- und Kleinschreibung unterscheidet, zumindest nicht standardmäßig.

Wenn ich manuell über Management Studio abfrage, vermassle ich die ganze Zeit den Fall und er akzeptiert ihn fröhlich:

select cOL1, col2 FrOM taBLeName WheRE ...
Dana
quelle
2

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.

MarkR
quelle
0

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.

Isaac Pak
quelle