50 votes

Quels sont les caractères valides dans un nom de base de données SQL Server ?

Nous allons fournir à nos clients un outil qui (entre autres choses) crée une nouvelle base de données SQL Server, et je veux pouvoir effectuer une validation de base sur le nom de la base de données qu'ils fournissent. La documentation de SQL Server explique quels caractères sont valides dans un nom de base de données. Cependant, la documentation est apparemment incorrecte, car je peux créer avec succès des bases de données dont les noms violent les règles documentées.

Selon la documentation du serveur SQL pour CRÉER UNE BASE DE DONNÉES Les noms des bases de données doivent être conformes aux règles relatives aux identificateurs et aux règles relatives à l'accès aux bases de données. identifiants dépendent du niveau de compatibilité de la base de données. Lorsque le niveau de compatibilité est 100 (ce qui, selon SQL Server Management Studio, signifie "SQL Server 2008"), le nom doit commencer par une lettre Unicode, _ , @ ou # ; suivi d'une ou plusieurs lettres, chiffres, @ , $ , # ou _ . La documentation indique clairement que les espaces ou les caractères spéciaux incorporés ne sont pas autorisés.

Cela va à l'encontre des preuves disponibles, car je peux utiliser SQL Server Management Studio pour créer une base de données dont le nom est This & That | "Other" -- qui non seulement contient des espaces intégrés (explicitement interdits), mais aussi des caractères spéciaux ( | , " ) qui ne sont même pas valables dans un nom de fichier. J'ai vérifié, et le niveau de compatibilité de la base de données est bien "SQL Server 2008 (100)", même si son nom est documenté comme étant invalide à ce niveau de compatibilité.

Heck, je peux même faire CREATE DATABASE " " (oui, c'est un seul espace), ce qui prouve que le premier caractère est bien pas doit être une lettre, un trait de soulignement, un signe "at" ou un signe "pound".

Donc je suppose que ma question est, quels personnages sont valide dans le nom d'une base de données SQL Server ? Existe-t-il des règles documentées qui sont cohérentes avec le comportement réel de SQL Server ?

28voto

marapet Points 19796

Le site règles pour les identificateurs à la fin :

Lorsque des identificateurs sont utilisés dans des instructions Transact-SQL, les identificateurs qui ne sont pas conformes à ces règles doivent être délimités par des des guillemets doubles ou des parenthèses.

En choisissant un nom de base de données qui n'est pas conforme à ces règles, vous doivent le mettre toujours entre guillemets ou entre parenthèses.

Si les règles relatives aux identificateurs réguliers sont respectées, vous pouvez utiliser le nom de votre base de données sans guillemets/parenthèses.

Les instructions suivantes sont correctes

CREATE DATABASE [conformingName]
CREATE DATABASE conformingName
CREATE DATABASE [This & That | "Other"]

mais pas

CREATE DATABASE This & That | "Other"

EDIT :

Je suis d'accord pour dire que ce n'est pas ainsi que l'on comprendrait la documentation liée : Que fait doit respecter les règles relatives aux identifiants signifie que les règles ne s'appliquent plus dès que l'identifiant est joint ? Le point concernant l'inclusion des identifiants non conformes devrait faire partie des règles.

11voto

Guffa Points 308133

Il existe une différence entre les identificateurs réguliers et les identificateurs délimités. Un identificateur régulier est lié par les limitations que vous mentionnez, tandis qu'un identificateur délimité peut contenir n'importe quels caractères (sauf le délimiteur).

Comme vous utilisez des guillemets autour de l'identifiant, il s'agit d'un identifiant délimité, et vous n'êtes pas limité par les règles des identifiants ordinaires.

Sans les délimiteurs, vous ne pouvez créer que des bases de données avec des identifiants qui suivent les règles des identifiants ordinaires :

create database db_name

Avec les délimiteurs, vous pouvez utiliser à peu près n'importe quoi :

create database "That's a funny name, isn't it?"

create database [)(/%Q)/#&%¤)Q/#)!]

6voto

HLGEM Points 54641

Personnellement, je les limiterais à l'alphabet et aux chiffres, et rien d'autre (éventuellement aussi un _). Pas d'espaces, pas de symboles bizarres, pas de retours chariot, etc. C'est le plus sûr que vous puissiez faire.

5voto

Scott Munro Points 4008

Noms délimités - entourés de crochets ou de guillemets doubles (si le nom de l'utilisateur est différent). IDENTIFIANT CITÉ est réglé sur ON) - peut contenir pratiquement n'importe quoi d'autre que les délimiteurs eux-mêmes. Il est même possible d'utiliser les délimiteurs dans le nom avec une certaine logique d'échappement. Notez cependant que seul le caractère d'échappement de fermeture doit être échappé. Dans le premier exemple ci-dessous, l'instance unique du caractère d'échappement d'ouverture dans le nom ne doit pas être échappée, alors que le caractère d'échappement de fermeture doit l'être (en remplaçant l'instance unique par deux). Je suppose que la logique ici est que le code qui analyse ces déclarations recherche un caractère d'échappement de fermeture et ne s'intéresse pas aux caractères d'échappement d'ouverture imbriqués.

  • [Test[Test] -> Test[Test
  • [Test]]Test] -> Test]Test

Ce qui suit est une description des règles entourant les noms d'identifiants non délimités (non cités) dans SQL Server 2012. Il s'agit d'un extrait du document Guide de la migration de MySQL vers SQL Server 2012 .

Noms des objets du schéma

Dans SQL Server 2012, le nom d'un objet peut comporter jusqu'à 128 caractères.

Les noms d'identifiants non cités doivent respecter ces règles :

  • Le premier caractère doit être alphanumérique, un trait de soulignement (_), un signe at (@) ou un signe numérique (#).
  • Les caractères suivants peuvent inclure des caractères alphanumériques, un trait de soulignement, un signe at (@), un signe numérique ou un signe dollar.
  • L'identifiant ne doit pas être un mot réservé Transact-SQL. Guide de la migration de MySQL vers SQL Server 2012 8
  • Les espaces incorporés ou les caractères spéciaux ne sont pas autorisés.

Les identifiants qui commencent par @ ou un signe numérique ont une signification particulière. Les identificateurs commençant par @ sont des noms de variables locales. Ceux qui commencent par un signe numérique sont des noms de tables temporaires.

Pour citer un nom d'identificateur dans Transact-SQL, vous devez utiliser des crochets ([]).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X