Begrenzte Namen in SQL (MySQL )
Zeichenfolgen, welche normalerweise nicht als Name verwendet werden dürfen, können doch verwendet werden, wenn sie in Anführungszeichen »"« eingeschlossen werden.
- Konsole
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA S; CREATE SCHEMA S; USE S;CREATE TABLE " 0!" ( "0/1" VARCHAR ( 255 ));
INSERT INTO " 0!" ( "0/1" ) VALUES ( '5' );SELECT "0/1" FROM " 0!";
+------+
| 0/1 |
+------+
| 5 |
+------+
Betrachtet man nur die ausgegebene Tabelle, könnte man denken, daß hier ein Rechenfehler vorliegt!
Der Name der Tabelle ist nun » 0!« (drei Zeichen: Leerzeichen, Null, Ausrufezeichen), und der Name der Spalte ist »0/1«.
Einen Namen ohne Anführungszeichen nennt man einen regulären Namen, einen Namen mit Anführungszeichen einen begrenzten Namen.
Hier noch ein anderes Beispiel, in dem Namen verwendet werden, die als reguläre Namen nicht erlaubt wären.
- Konsole
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA S; CREATE SCHEMA S; USE S;CREATE TABLE "FROM" ( "SELECT" VARCHAR ( 255 ));
INSERT INTO "FROM" ( "SELECT" ) VALUES ( '0' );SELECT "SELECT" FROM "FROM";
+--------+
| SELECT |
+--------+
| 0 |
+--------+
Man kann sich auf einen regulären Namen auch durch einen begrenzten Namen beziehen, der den regulären Namen in Anführungszeichen enthält.
- Konsole
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA S; CREATE SCHEMA S; USE S;CREATE TABLE ANTON ( BERTA VARCHAR ( 255 ));
INSERT INTO ANTON ( BERTA ) VALUES ( '0' );SELECT "BERTA" FROM "ANTON";
+-------+
| BERTA |
+-------+
| 0 |
+-------+
Zitieren ohne »ANSI_QUOTES«
Das Zeichen »`« wird Gravis genannt.
Falls der Modus »ANSI_QUOTES« nicht aktiv ist, verwendet MySQL eine nicht-standardkonforme Notation, bei welche zum Zitieren Gravis »`« verwendet werden, während die Anführungszeichen »"« wie Apostrophe »'« zum Schreiben von Zeichenfolgenliteralen verwendet werden können.
- Konsole
WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
SET div_precision_increment = 4;
DROP SCHEMA S; CREATE SCHEMA S; USE S;CREATE TABLE ` 0!` ( `0/1` VARCHAR ( 255 ));
INSERT INTO ` 0!` ( `0/1` ) VALUES ( "5" );SELECT `0/1` FROM ` 0!`;
+------+
| 0/1 |
+------+
| 5 |
+------+
Der Modus »ANSI« schließt den Modus »ANSI_QUOTES« ein.
Zitieren in Skripten
In MySQL-Skripten werden von manchen Programmierern alle Name sicherheitshalber in Gravis eingeschlossen. Dies ist aber meistens nicht nötig. Verschiedene Datenbanksysteme verwenden verschiedene Schreibweisen für das Zitieren. Wenn man in Skripten unnötig viele Gravis verwendet, dann wird dadurch das Übertragen des Skripts auf ein anderes Datenbanksystem erschwert.
Es empfiehlt sich für Namen (beispielsweise von Schemata, Tabellen und Spalten) nur Buchstaben zu verwenden. Wenn man dann noch in SQL und vielen Datenbanksystemen reservierte Schlüsselwörter und reservierte Namen vermeidet, sollte das Begrenzen selten nötig sein.
Zitat *
- 9075-2 7.12 (Entwurf 2010, vereinfacht)
- <factor> ::= [ <sign> ] <numeric primary>
- <numeric primary> ::= <value expression primary>
- <value expression primary> = <column reference>
- <column reference> ::= <basic identifier chain>
- <basic identifier chain> ::= <identifier chain>
- <identifier chain> ::= <identifier> [ { <period> <identifier> }... ]
- 9075-2 5.2 (Entwurf 2010, vereinfacht)
- <identifier> ::= <actual identifier>
- <actual identifier> ::= <regular identifier> | <delimited identifier> | <Unicode delimited identifier>
- <regular identifier> ::= <identifier body>
- <identifier body> ::= <identifier start> [ <identifier part>... ]
- <identifier part> ::= <identifier start> | <identifier extend>
- An <identifier start> is any character in the Unicode General Category classes “Lu” (upper-case letter), “Ll” (lower-case letter), “Lt” (title-case letter), “Lm” (modifier letter), “Lo” (other letter), or “Nl” (letter number).
- An <identifier extend> is U+00B7, “Middle Dot”, or any character in the Unicode General Category classes “Mn” (nonspacing marks), “Mc” (spacing combining marks), “Nd” (decimal numbers), “Pc” (connector punctuations [this includes the underscore »_«]), or “Cf” (formatting codes).
- 9075-2 5.4 (Entwurf 2010, vereinfacht)
- NOTE 111 — It is the intention that no <key word> specified in ISO/IEC 9075 or revisions thereto shall end with an <underscore>.