La syntaxe SQL est-elle sensible à la casse?
est sensible à la casse SQL. J'ai utilisé MySQL et SQL Server qui semblent tous deux être sensibles à la casse. Est-ce toujours le cas? La norme définit-elle la sensibilité au cas?
10 réponses
les mots-clés SQL sont insensibles à la casse ( SELECT
, FROM
, WHERE
, etc), mais sont souvent écrits dans tous les casquettes. Cependant, dans certaines configurations, les noms de table et de colonne sont sensibles à la casse. MySQL a une option de configuration pour l'activer / le désactiver. Habituellement, les noms de table et de colonne sensibles à la casse sont les noms par défaut sur MySQL Linux et les noms non sensibles à la casse étaient les noms par défaut sur Windows, mais maintenant l'installateur a posé des questions à ce sujet pendant la configuration. Pour MSSQL, c'est une fonction de la base de données paramètre de classement.
Voici la page MySQL à propos de la sensibilité du nom
Voici l'article dans MSDN à propos des collations pour MSSQL
ce n'est pas strictement du langage SQL, mais dans SQL Server si la compilation de votre base de données est sensible à la casse, alors tous les noms de table sont sensibles à la casse.
Dans Sql Server c'est une option . Allumer le suce.
Je ne suis pas sûr de MySql.
ma compréhension est que la norme SQL appelle à l'insensibilité au cas. Je ne crois pas que les bases de données suivent la norme.
MySQL a un paramètre de configuration dans le cadre de son "mode strict" (un sac grab de plusieurs paramètres qui rendent MySQL plus conforme aux normes) pour les noms de table sensibles à la casse ou insensibles. Indépendamment de ce réglage, les noms de colonne sont toujours insensibles à la casse, bien que je pense qu'il affecte la façon dont les noms de colonne sont afficher. Je crois que ce cadre est à l'échelle de l'instance, dans toutes les bases de données de L'instance RDBMS, bien que je fasse des recherches aujourd'hui pour confirmer cela (et j'espère que la réponse est non).
J'aime comment Oracle gère cela bien mieux. Dans le SQL droit, les identificateurs comme les noms de table et de colonne sont insensibles à la casse. Cependant, si, pour une raison quelconque, vous souhaitez vraiment obtenir un boîtier explicite, vous pouvez inclure l'identifiant dans les guillemets (qui sont très différents dans Oracle SQL de la simple-guillemets utilisés pour enfermer des données de chaîne). So:
SELECT fieldName
FROM tableName;
interrogera nom de champ de nom de table , mais
SELECT "fieldName"
FROM "tableName";
interrogera nom de champ de nom de table .
je suis presque sûr que vous pourriez même utiliser ce mécanisme pour insérer des espaces ou d'autres caractères non standard dans un identifiant.
In cette situation si, pour une raison quelconque, vous avez trouvé les noms de table et de colonne explicitement-cased souhaitable il était à votre disposition, mais c'était encore quelque chose que je voudrais mettre en garde contre.
ma convention quand J'ai utilisé Oracle sur une base quotidienne était que dans le code je mettrais tous les mots-clés SQL Oracle en majuscules et tous les identificateurs en minuscules. Dans la documentation je mettrais tous les noms de table et de colonne en majuscule. Il était très pratique et lisible de pouvoir le faire (bien que parfois une douleur de taper autant de majuscules dans le code -- je suis sûr que j'aurais pu trouver une fonctionnalité d'éditeur pour aider, ici).
à mon avis MySQL est particulièrement mauvais pour diverger à ce sujet sur différentes plates-formes. Nous devons être capables de décharger des bases de données sur Windows et de les charger dans UNIX, et cela est un désastre si L'installateur sur Windows a oublié de mettre le RDBMS en mode sensible à la casse. (Pour être juste, une partie de la raison que c'est une catastrophe, nos codeurs pris la mauvaise décision, il y a longtemps, de s'en remettre à la sensibilité de MySQL sur UNIX.) Les personnes qui ont écrit L'installateur Windows MySQL l'ont rendu vraiment pratique et Windows-like, Et il était génial de passer à donner aux gens une case à cocher pour dire "voulez-vous activer le mode strict et rendre MySQL plus conforme aux normes?"Mais il est très commode pour MySQL de se démarquer de manière si significative de la norme, et d'empirer les choses en se retournant et en se démarquant de sa propre norme de facto sur différentes plateformes. Je suis sûr que sur des distributions Linux différentes, cela peut être encore plus compliqué, car les emballeurs pour différentes distributions ont probablement parfois incorporé leurs propres paramètres de configuration MySQL préférés.
ici est une autre question qui entre en discussion si la sensibilité de cas est souhaitable dans un RDBMS.
la spécification SQL92 stipule que les identificateurs peuvent être cités ou non cités. Si les deux côtés ne sont pas cotés, ils sont toujours insensibles à la casse, par exemple table_name == TAble_nAmE
.
toutefois, les identificateurs cités sont sensibles à la casse, par exemple "table_name" != "TAble_naME"
. Aussi basé sur la spécification si vous souhaitez comparer des identificateurs non-cotés avec des identificateurs Cités, alors les identificateurs non-cotés et cités peuvent être considérés comme les mêmes, si les caractères non-cotés sont majuscules, par exemple TABLE_NAME == "TABLE_NAME"
, mais TABLE_NAME != "table_name"
ou TABLE_NAME != "TAble_NaMe"
.
Voici la partie pertinente du spec (section 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>".
noter, que tout comme avec d'autres parties de la norme SQL, toutes les bases de données ne suivent pas entièrement cette section. PostgreSQL par exemple stocke tous les identificateurs non cotés en minuscules au lieu de majuscules, donc table_name == "table_name"
(qui est exactement le contraire de la norme). De plus, certaines bases de données sont toujours insensibles à la casse, ou la sensibilité au cas dépend d'un certain réglage dans le DB ou dépend de certaines propriétés du système, généralement si le système de fichiers est sensible au cas ou non.
notez que certains outils de base de données peuvent envoyer des identificateurs cités tout le temps, donc dans les cas où vous mélangez des requêtes générées par un outil (comme une requête de table de création générée par Liquibase ou un autre outil de migration de DB), avec des requêtes faites à la main (comme un simple JDBC select dans votre application), vous devez faire assurez - vous que les cas sont cohérents, en particulier dans les bases de données où les identificateurs cités et non cités sont différents (DB2, PostgreSQL, etc.)
j'ai trouvé ce billet de blog très utile (Je ne suis pas l'auteur). Résumant (s'il vous plaît lire, cependant):
...les identificateurs délimités sont sensibles à la casse ("table_name"!= "Table_Name"), alors que les identificateurs non cités ne le sont pas, et sont transformés en majuscules (table_name => TABLE_NAME).
il a trouvé DB2, Oracle et Interbase / Firebird sont 100% conforme:
PostgreSQL ... petit caractère de chaque identificateur non cotées, au lieu de uppercasing. MySQL ... système de fichiers dépendants. SQLite et SQL Server ... cas des noms de table et de champ sont préservés lors de la création, mais ils sont complètement ignorés par la suite.
Pas de. MySQL n'est pas sensible à la casse, et la norme SQL non plus. Il est juste pratique courante d'écrire les commandes en majuscules.
maintenant, si vous parlez des noms de table/colonne, alors oui ils le sont, mais pas les commandes elles-mêmes.
Donc
SELECT * FROM foo;
est le même que
select * from foo;
mais pas la même chose que
select * from FOO;
SQL sont eux-mêmes insensibles à la casse.
les noms de tables, colonnes, etc., ont une sensibilité de CAs qui dépend de la base de données - vous devriez probablement supposer qu'ils sont sensibles à la casse à moins que vous sachiez le contraire (dans de nombreuses bases de données ils ne le sont pas cependant; dans MySQL les noms de tables sont parfois sensibles à la casse mais la plupart des autres noms ne le sont pas).
comparer des données en utilisant =,>, < etc, a une conscience de CAs qui dépend de la collation les paramètres qui sont utilisés sur la base de données individuelle, la table ou même la colonne en question. Il est normal, Cependant, de garder la collecte assez cohérente dans une base de données. Nous avons quelques colonnes qui ont besoin de stocker la casse des valeurs; ils ont un classement spécifiquement définie.
Je ne pense pas que SQL Server soit sensible à la casse, du moins pas par défaut.
quand je pose des questions manuellement via le studio de gestion, je gâche cas tout le temps et il l'accepte joyeusement:
select cOL1, col2 FrOM taBLeName WheRE ...