Eine Saite ist eine Saite, Amirite?
Ja und Nein: Eine Zeichenfolge ist eine Zeichenfolge, aber Objekt- / Objektnamen sind keine Zeichenfolgen. Während diese Aussage wahr ist, ist sie auch nicht relevant für das Verhalten, das Sie sehen.
Ohne die konzeptionelle Begründung für die spezifischen Regeln zu beachten, lautet die technische Antwort auf "Warum eines funktioniert und nicht das andere", dass SQL Server (mit minimaler Anpassung) den Richtlinien des Unicode-Standards für Bezeichner folgt. Die Unicode-Dokumentation finden Sie hier:
Unicode®-Standardanhang Nr. 31: UNICODE IDENTIFIER UND MUSTERSYNTAX
Bezeichner, die weder enthalten [...]
noch "..."
"reguläre" Bezeichner sind, während die eingeschlossenen Bezeichner "begrenzte" Bezeichner sind. Reguläre Bezeichner sind Namen, die in allen Kontexten gültig sind (dh dies sind die Regeln für die Benennung von Dingen in dieser Sprache, Software usw.). Begrenzte Bezeichner sind alles andere: Namen, die nicht gültig sind und nicht funktionieren sollten. Sie erhalten jedoch eine Ausnahme, wenn Sie sie in eines dieser Begrenzer einschließen. Die meisten Bezeichner können abgegrenzt werden. Es ist nurGOTO
Beschriftungen und Variablen (einschließlich Tabellenvariablen) / Parameter, die nicht begrenzt werden können. Der Unterschied scheint darin zu bestehen, dass Bezeichner, die nur zur Verwendung in der T-SQL-Sprache existieren (dh kein Name, der jemals in einer Datendatei oder Protokolldatei als Metadaten gespeichert wird), nicht abgegrenzt werden können (so wie Sie es erwarten würden) jede Sprache).
Jetzt ist die SQL Server-Dokumentation nicht genau vollständig / korrekt, aber sie ist korrekt in Bezug auf die Klassifizierung eines gültigen "Bezeichners" (sowohl beginnend als auch fortlaufend) aus Unicode 3.2. Wenn Sie die tatsächliche Liste der Regeln für reguläre und begrenzte Bezeichner möchten, habe ich sie hier dokumentiert:
Vollständig vollständige Liste der Regeln für T-SQL-Kennungen
Besuchen Sie:
- Der Uni-Code: Die Suche nach der wahren Liste gültiger Zeichen für reguläre T-SQL-Kennungen, Teil 1
- Der Uni-Code: Die Suche nach der wahren Liste gültiger Zeichen für reguläre T-SQL-Kennungen, Teil 2
Behebung von Bedenken, die in Kommentaren zu dieser Antwort vermerkt sind:
- Ja, selbst wenn man nicht begrenzter Bezeichner mit zu beginnen
_
, #
und @
wird in der Unicode - Spezifikation berücksichtigt. Abschnitt 1.2 Adressen Anpassungen an die Basisregeln und bietet sogar vier Beispiel Anpassungen: _
, #
, @
, und $
. Diese 4 vier "möglichen" Anpassungen sind genau die gleichen 4, die SQL Server verwendet. Daher lässt SQL Server dieses Unicode-Dokument als Quelle der Regeln zu @Variable
und #TempTable
verweist nicht darauf.
- Wie oben erwähnt, wird in der SQL Server-Dokumentation angegeben, dass die verwendeten Kategorisierungen aus Version 3.2 der Unicode- Zeichendatenbank stammen und sich derzeit in Version 10 befinden. Sie können die aktuellen Definitionen von Ident_ * , wie sie auf der Unicode-Website zu finden sind, nicht verwenden Anzeige gültiger / ungültiger Zeichen. In
Ident_Start
und Ident_Continue
in jeder neuen Version des Unicode-Standards werden Zeichen hinzugefügt . Der einzige Weg, um den richtigen Zeichensatz zu sehen, der diesen Eigenschaften entspricht, ist das Herunterladen von Unicode Version 3.2.
- Die beiden oben genannten Punkte werden in den beiden direkt oben genannten Blog-Posts behandelt (mit dem Namen "Der Uni-Code: Die Suche nach der wahren Liste gültiger Zeichen für reguläre T-SQL-Kennungen"). Bitte lesen Sie diese beiden Beiträge, bevor Sie diese Antwort als falsch abtun. Hinter dem, was hier tatsächlich vor sich geht, steckt eine Menge Nuancen, die ich in diesen beiden Beiträgen anspreche und die Schritt für Schritt zeigen, wie die Liste der gültigen Zeichen abgeglichen wird.
AUCH in Bezug auf die im Titel angegebene Frage hängt es davon ab, wie locker Sie "Nummer" definieren. Das heißt, wenn Sie die in den beiden oben genannten Beiträgen gezeigten Forschungsschritte befolgen, sodass Sie eine Tabelle für die Unicode-Zeichendatenbank v3.2 und einige zusätzliche Eigenschaften erstellt haben, können Sie eine Liste mit 52 Nicht-Daten erhalten -Buchstaben (meistens "Zahlen"), die gültige Zeichen zum Starten eines Bezeichners über die folgende Abfrage sind:
SELECT ucd.*
FROM [v3-2].UnicodeCharacterDatabase ucd
WHERE ucd.[IDStart] = 1
AND ucd.[GeneralCategory] NOT LIKE 'L%';
Wenn wir einige dieser Charaktere zum Testen auswählen, können wir sehen, dass sie tatsächlich funktionieren:
USE [tempdb];
CREATE TABLE dbo.Ⅳaii ([Col1] INT); -- ROMAN NUMERAL FOUR (U+2163)
CREATE TABLE dbo.ↂaii ([Col1] INT); -- ROMAN NUMERAL TEN THOUSAND (U+2182)
CREATE TABLE dbo.〤aii ([Col1] INT); -- HANGZHOU NUMERAL FOUR (U+3024)
Um zu zeigen, dass es sich bei ihnen nicht nur um Namen, sondern um "Zahlen" handelt, zeigt die folgende Abfrage, dass ihnen ein numerischer Wert zugewiesen wurde (wie in der NumericValue
Spalte der [v3-2].UnicodeCharacterDatabase
Tabelle gezeigt):
SELECT 1 WHERE N'〤' LIKE N'[3-5]'; -- HANGZHOU NUMERAL FOUR (U+3024)
-- 1
Es handelt sich jedoch nicht um Zahlen, die für numerische Operationen verwendet werden können:
SELECT 〤 + 0;
/*
Msg 207, Level 16, State 1, Line 23
Invalid column name '〤'.
*/
In Bezug auf das Problem des Parsens und der Notwendigkeit, feststellen zu können, ob 3e2
es sich um eine Zahl oder einen Bezeichner handelt: Dies ist zwar eine Überlegung und möglicherweise der Grund, warum Zahlen aus der allgemeinen Unicode-Kategorie "Ident_start" ausgeschlossen sind, aber nicht universell und nicht unbedingt der Grund SQL Server schließt sie aus. Drei Punkte zu beachten:
- Obwohl es
3e2
an sich nicht eindeutig ist, wäre es nicht: Wenn es mit mindestens einem Schemanamen qualifiziert wäre:dbo.3e2
- Der Name
4aii
ist überhaupt nicht mehrdeutig. Internes Parsen könnte dies leicht genug als keine potenzielle Zahl identifizieren
MySQL / MariaDB Sie nicht haben diese Einschränkung. Sie ermöglichen nicht begrenzte Bezeichner wie 4aii
und 3e
, aber nicht 3e2
oder 300
. In MySQL konnte ich Folgendes erfolgreich ausführen:
create table 4aii (3e int);
Der Grund, warum Sie dies in SQL Server nicht tun können, liegt darin, dass SQL Server die Empfehlung des Unicode-Standards für Bezeichner einhält. Warum diese Charaktere vom Unicode-Konsortium ausgewählt wurden, ist nicht ausdrücklich angegeben, scheint aber zumindest "Best Practice" zu sein. Wie mit MySQL bewiesen, ist es dennoch möglich, Bezeichner zu analysieren, die mit einer Zahl beginnen.