webentwicklung-frage-antwort-db.com.de

Ist bei der SQL-Syntax die Groß- und Kleinschreibung zu beachten?

Unterscheidet SQL zwischen Groß- und Kleinschreibung. Ich habe MySQL und SQL Server verwendet, bei denen beide die Groß- und Kleinschreibung zu berücksichtigen scheinen. Ist das immer so? Definiert der Standard die Groß- und Kleinschreibung?

189
Steve Tranby

Bei den SQL-Schlüsselwörtern wird die Groß- und Kleinschreibung nicht berücksichtigt (SELECT, FROM, WHERE usw.), sie werden jedoch häufig in Groß- und Kleinschreibung geschrieben. Bei einigen Setups wird bei Tabellen- und Spaltennamen jedoch zwischen Groß- und Kleinschreibung unterschieden. MySQL verfügt über eine Konfigurationsoption zum Aktivieren/Deaktivieren. Normalerweise wird unter Linux MySQL standardmäßig zwischen Groß- und Kleinschreibung unterschieden. Unter Windows wird standardmäßig zwischen Groß- und Kleinschreibung unterschieden. Das Installationsprogramm hat dies jedoch während des Setups abgefragt. Für MSSQL ist dies eine Funktion der Kollatierungseinstellung der Datenbank.

Hier ist die MySQL-Seite über Groß- und Kleinschreibung

Hier ist der Artikel in MSDN über Kollatierungen für MSSQL

173
Stefan Rusek

Dies ist keine reine SQL-Sprache. In SQL Server wird bei der Sortierung der Datenbanken jedoch zwischen Groß- und Kleinschreibung unterschieden. In allen Tabellennamen wird jedoch zwischen Groß- und Kleinschreibung unterschieden.

21
Cade Roux

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

Ich bin nicht sicher über MySQL.

15
JosephStyons

Bei Bezeichnern und reservierten Wörtern sollte nicht zwischen Groß- und Kleinschreibung unterschieden werden, obwohl viele der Konvention folgen, Groß- und Kleinschreibung für reservierte Wörter und Pascal-Groß- und Kleinschreibung für Bezeichner zu verwenden.

Siehe SQL-92 Sek. 5.2

14
Turnkey

Die SQL92-Spezifikation gibt an, dass Bezeichner in Anführungszeichen oder nicht in Anführungszeichen gesetzt sein können. Wenn beide Seiten nicht in Anführungszeichen gesetzt sind, wird die Groß- und Kleinschreibung nicht berücksichtigt, z. table_name == TAble_nAmE.

Angeführte Identifikatoren unterscheiden jedoch zwischen Groß- und Kleinschreibung, z. "table_name" != "TAble_naME". Auch basierend auf der Spezifikation können, wenn Sie nicht zitierte Bezeichner mit zitierten vergleichen möchten, nicht zitierte und zitierte Bezeichner als gleich angesehen werden, wenn die nicht zitierten Zeichen groß geschrieben werden, z. 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 in Anführungszeichen gesetzten Bezeichner in Großbuchstaben, also table_name == "table_name" (was genau das Gegenteil des Standards ist). Einige Datenbanken sind die ganze Zeit unabhängig von Groß- und Kleinschreibung, oder die Berücksichtigung der 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 Datenbanktools möglicherweise ständig in Anführungszeichen gesetzte Bezeichner senden. In solchen Fällen mischen Sie also von einem Tool generierte Abfragen (z. B. eine von Liquibase oder einem anderen DB-Migrationstool generierte CREATE TABLE-Abfrage) mit handgefertigten Abfragen (z. B. eine einfache JDBC-Auswahl) in Ihrer Anwendung) müssen Sie sicherstellen, dass die Fälle konsistent sind, insbesondere bei Datenbanken, bei denen die Bezeichner in Anführungszeichen und nicht in Anführungszeichen gesetzt sind (DB2, PostgreSQL usw.).

11
SztupY

Ich verstehe, dass der SQL-Standard Groß- und Kleinschreibung nicht berücksichtigt. Ich glaube jedoch nicht, dass Datenbanken vollständig dem Standard entsprechen.

MySQL verfügt über eine Konfigurationseinstellung als Teil seines "strikten 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 den Spaltennamen nach wie vor die Groß- und Kleinschreibung nicht berücksichtigt, obwohl meiner Meinung nach die Anzeige der Spaltennamen davon abhängt. Ich glaube, dass diese Einstellung für alle Datenbanken innerhalb der RDBMS-Instanz instanzweit gilt, obwohl ich heute nachforsche, um dies zu bestätigen (und hoffe, dass die Antwort Nein lautet).

Mir gefällt, wie Oracle dies weitaus besser handhabt. In direktem SQL wird bei Bezeichnern wie Tabellen- und Spaltennamen die Groß- und Kleinschreibung nicht berücksichtigt. Wenn Sie jedoch aus irgendeinem Grund 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 zum Einschließen von Zeichenfolgendaten unterscheiden). So:

SELECT fieldName
FROM tableName;

fragt Feldname von Tabellenname ab, aber

SELECT "fieldName"
FROM "tableName";

fragt fieldName von tableName ab.

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, wenn Sie aus irgendeinem Grund explizit umschlossene Tabellen- und Spaltennamen für wünschenswert erachteten, war dies für Sie verfügbar, aber ich würde dennoch dringend davor warnen.

Als ich Oracle täglich verwendete, war meine Konvention, dass ich im Code alle Oracle SQL-Schlüsselwörter in Großbuchstaben und alle Bezeichner in Kleinbuchstaben setzte. In der Dokumentation würde ich alle Tabellen- und Spaltennamen in Großbuchstaben schreiben. Es war sehr praktisch und lesbar, dies zu tun (obwohl es manchmal schwierig ist, so viele Großbuchstaben in Code einzugeben - ich bin sicher, ich hätte hier eine Editor-Funktion finden können).

Meiner Meinung nach ist MySQL besonders schlecht, wenn es darum geht, auf verschiedenen Plattformen zu differenzieren. 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 case-sensitive 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.) Windows-ähnlich, und es war großartig, den Leuten ein Kontrollkästchen zu geben, mit dem sie sagen können: "Möchten Sie den Strict-Modus aktivieren und MySQL standardkonformer machen?" Es ist jedoch sehr praktisch für MySQL, sich so deutlich vom Standard zu unterscheiden und die Situation dann noch zu verschlimmern, indem es sich auf verschiedenen Plattformen umdreht und von seinem eigenen De-facto-Standard abweicht. Ich bin mir sicher, dass dies auf verschiedenen Linux-Distributionen noch weiter verschärft werden kann, da Packager für verschiedene Distributionen möglicherweise zuweilen ihre eigenen bevorzugten MySQL-Konfigurationseinstellungen integriert haben.

Hier ist eine weitere SO=) Frage, mit der diskutiert wird, ob Groß- und Kleinschreibung in einem RDBMS wünschenswert ist.

10
skiphoppy

Ich fand dieser Blog-Beitrag sehr hilfreich (ich bin nicht der Autor). Zusammenfassend (bitte lesen):

... durch Trennzeichen getrennte Bezeichner unterscheiden zwischen Groß- und Kleinschreibung ("table_name"! = "Table_Name"), nicht in Anführungszeichen gesetzte Bezeichner jedoch nicht und werden in Großbuchstaben umgewandelt (table_name => TABLE_NAME).

Er stellte fest, dass DB2, Oracle und Interbase/Firebird 100% kompatibel sind:

PostgreSQL ... setzt jeden nicht zitierten Bezeichner herab, anstatt ihn in Großbuchstaben zu setzen. MySQL ... abhängig vom Dateisystem. Die Groß- und Kleinschreibung von SQLite und SQL Server ... für die Tabellen- und Feldnamen wird bei der Erstellung beibehalten, danach jedoch vollständig ignoriert.

4
Matthew Cornell

Nein. Bei MySQL wird nicht zwischen Groß- und Kleinschreibung unterschieden, ebenso wenig wie beim SQL-Standard. Es ist nur übliche Praxis, die Befehle in Großbuchstaben zu schreiben.

Wenn Sie nun über Tabellen-/Spaltennamen sprechen, dann sind es diese, aber nicht die Befehle selbst.

So

SELECT * FROM foo;

ist das gleiche wie

select * from foo;

aber nicht dasselbe wie

select * from FOO;
4
cmcculloh

Bei SQL-Schlüsselwörtern wird die Groß- und Kleinschreibung nicht berücksichtigt.

Namen von Tabellen, Spalten usw. unterscheiden zwischen Groß- und Kleinschreibung, was von der jeweiligen Datenbank abhängt. Sie sollten wahrscheinlich davon ausgehen, dass bei ihnen die Groß- und Kleinschreibung beachtet wird, sofern Sie nichts anderes wissen Namen sind nicht).

Das Vergleichen von Daten mit =,>, <etc hat eine Groß-/Kleinschreibung, die von den Sortierungseinstellungen 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. In einigen Spalten müssen case-sensitive Werte gespeichert werden. Sie haben eine speziell festgelegte Zusammenstellung.

2
MarkR

Ich denke nicht, dass bei SQL Server die Groß- und Kleinschreibung beachtet wird, zumindest nicht standardmäßig.

Wenn ich manuell über Management Studio eine Anfrage stelle, stelle ich die ganze Zeit die Groß- und Kleinschreibung durcheinander und es akzeptiert sie fröhlich:

select cOL1, col2 FrOM taBLeName WheRE ...
1
Dana