La syntaxe SQL est-elle sensible à la casse?

Est sensible à la casse SQL. J’ai utilisé MySQL et SQL Server qui semblent tous deux sensibles à la casse. Est-ce toujours le cas? La norme définit-elle la sensibilité à la casse?

Related of "La syntaxe SQL est-elle sensible à la casse?"

Les mots-clés SQL sont insensibles à la casse ( SELECT , FROM , WHERE , etc.), mais sont souvent écrits en majuscules. Cependant, dans certaines configurations, les noms de table et de colonne sont sensibles à la casse. MySQL a une option de configuration pour l’activer / la désactiver. Habituellement, les noms de tables et de colonnes sensibles à la casse sont les noms par défaut sous Linux. MySQL et la casse sans respect de la casse étaient les parameters par défaut sous Windows, mais à présent, le programme d’installation a posé des questions lors de l’installation. Pour MSSQL, cela dépend du paramètre de classement de la firebase database.

Voici la page MySQL sur la sensibilité à la casse des noms

Voici l’ article dans MSDN sur les classements pour MSSQL

Ce n’est pas ssortingctement un langage SQL, mais dans SQL Server, si votre classement de firebase database est sensible à la casse, tous les noms de table sont sensibles à la casse.

Les identificateurs et les mots réservés ne doivent pas être sensibles à la casse, bien que beaucoup utilisent une convention pour utiliser des majuscules pour les mots réservés et des casques Pascal pour les identificateurs.

Voir SQL-92 Sec. 5.2

Dans Sql Server, c’est une option . Allumer ça suce.

Je ne suis pas sûr de MySQL.

D’après ce que je comprends, le standard SQL appelle une insensibilité à la casse. Je ne crois pas que les bases de données suivent complètement la norme.

MySQL a un paramètre de configuration dans le cadre de son «mode ssortingct» (un jeu de saisie de plusieurs parameters rendant MySQL plus conforme aux normes) pour les noms de tableaux sensibles à la casse ou insensibles. Indépendamment de ce paramètre, les noms de colonne restnt insensibles à la casse, même si je pense que cela affecte la façon dont les noms de colonne sont affichés. Je pense que ce paramètre est appliqué à l’ensemble de l’instance, dans toutes les bases de données de l’instance du SGBDR, bien que je recherche aujourd’hui pour le confirmer (en espérant que la réponse soit non).

J’aime comment Oracle gère cela beaucoup mieux. En SQL, les identificateurs tels que les noms de table et de colonne sont insensibles à la casse. Cependant, si pour une raison quelconque vous souhaitez vraiment obtenir un casse explicite, vous pouvez inclure l’identifiant entre guillemets (qui sont assez différents dans Oracle SQL des guillemets simples utilisés pour inclure des données de chaîne). Alors:

 SELECT fieldName FROM tableName; 

interrogera fieldname à partir de nomtable , mais

 SELECT "fieldName" FROM "tableName"; 

interrogera fieldName de tableName .

Je suis 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.

Dans cette situation, si pour une raison quelconque, vous avez trouvé des noms de tables et de colonnes explicitement contenus dans des cas, cela était à votre disposition, mais je vous déconseille fortement de le faire.

Ma convention lorsque j’ai utilisé Oracle quotidiennement était que dans le code, je mettais tous les mots-clés Oracle SQL en majuscules et tous les identificateurs en minuscules. Dans la documentation, je mettrais tous les noms de tables et de colonnes en majuscules. C’était très pratique et lisible de pouvoir faire cela (bien que parfois il soit difficile de taper autant de capitales dans le code – je suis sûr que j’aurais pu trouver une fonctionnalité d’édition pour vous aider, ici).

À mon avis, MySQL est particulièrement mauvais en ce qui concerne les différentes plates-formes. Nous devons pouvoir vider les bases de données sous Windows et les charger dans UNIX, ce qui est désastreux si le programme d’installation de Windows a oublié de mettre le SGBDR en mode sensible à la casse. (Pour être honnête, une partie de la raison pour laquelle c’est un désastre, c’est que nos codeurs ont pris la mauvaise décision, il y a longtemps, de faire confiance à la casse de MySQL sous UNIX). Windows-like, et c’était génial de passer à donner aux gens une case à cocher pour dire “Voulez-vous activer le mode ssortingct et rendre MySQL plus conforme aux normes?” Cependant, il est très pratique pour MySQL de se démarquer de la norme et d’aggraver la situation en modifiant et en se différenciant de son standard de facto sur différentes plates-formes. Je suis sûr que sur les différentes dissortingbutions Linux, cela peut être aggravé, car les packagers de différentes dissortingbutions ont parfois incorporé leurs propres parameters de configuration MySQL préférés.

Voici une autre question SO qui discute si la sensibilité à la casse est souhaitable dans un SGBDR.

La spécification SQL92 indique que les identificateurs peuvent être cités ou non. Si les deux côtés ne sont pas indiqués, ils sont toujours insensibles à la casse, par exemple table_name == TAble_nAmE .

Cependant, les identificateurs entre guillemets sont sensibles à la casse, par exemple "table_name" != "TAble_naME" . Toujours en fonction de la spécification si vous souhaitez comparer des identifiants non exécutés avec des identifiants cités, les identificateurs non cotés et entre guillemets peuvent être considérés comme identiques, si les caractères non cotés sont en majuscule, par exemple TABLE_NAME == "TABLE_NAME" ou TABLE_NAME != "table_name" TABLE_NAME != "TAble_NaMe" .

Voici la partie pertinente de la spécification (section 5.2.13):

  13)A  and a  are equiva- lent if the  of the  (with every letter that is a lower-case letter replaced by the equiva- lent upper-case letter or letters) and the  of the  (with all occurrences of  replaced by  and all occurrences of  replaced by ), considered as the repetition of a  that specifies a  of SQL_TEXT and an implementation- defined collation that is sensitive to case, compare equally according to the comparison rules in Subclause 8.2, "". 

Notez que, comme avec d’autres parties du standard SQL, toutes les bases de données ne suivent pas complètement cette section. PostgreSQL stocke par exemple tous les identifiants non cotés en minuscules au lieu de majuscules, donc table_name == "table_name" (ce qui est exactement le contraire de la norme). De plus, certaines bases de données sont insensibles à la casse en permanence, ou la sensibilité à la casse dépend de certains parameters de la firebase database ou dépend de certaines propriétés du système, généralement si le système de fichiers est sensible à la casse ou non.

Notez que certains outils de firebase database peuvent envoyer des identifiants à tout moment, donc dans les cas où vous mélangez des requêtes générées par un outil (comme une requête CREATE TABLE générée par Liquibase ou un autre outil de migration), comme une simple sélection JDBC dans votre application) vous devez vous assurer que les cas sont cohérents, en particulier sur les bases de données où les identifiants entre guillemets et non cotés sont différents (DB2, PostgreSQL, etc.)

J’ai trouvé cet article de blog très utile (je ne suis pas l’auteur). En résumé (veuillez lire, cependant):

… les identificateurs délimités sont sensibles à la casse (“nom_table”! = “Nom_Table”), tandis que les identifiants non cotés ne le sont pas et sont transformés en majuscules (nom_table => NOM_TABLISSEMENT).

Il a constaté que DB2, Oracle et Interbase / Firebird étaient 100% conformes:

PostgreSQL ™ met en minuscule chaque identifiant non coté, au lieu de le mettre en majuscule. MySQL … dépend du système de fichiers. SQLite et SQL Server … la casse de la table et les noms de champs sont préservés lors de la création, mais ils sont complètement ignorés par la suite.

Non, MySQL n’est pas sensible à la casse, pas plus que le standard SQL. Il est juste pratique d’écrire les commandes majuscules.

Maintenant, si vous parlez de noms de tables / colonnes, alors oui, mais pas les commandes elles-mêmes.

Alors

 SELECT * FROM foo; 

est le même que

 select * from foo; 

mais pas le même que

 select * from FOO; 

Les mots-clés SQL sont insensibles à la casse eux-mêmes.

Les noms des tables, des colonnes, etc. ont une sensibilité à la casse dépendant de la firebase database – vous devez supposer qu’ils sont sensibles à la casse, sauf indication contraire (dans les bases de données MySQL sont sensibles à la casse mais la plupart des autres les noms ne sont pas).

La comparaison des données à l’aide de =,>,

Je ne pense pas que SQL Server est sensible à la casse, du moins pas par défaut.

Lorsque j’interroge manuellement via Management Studio, je me trompe tout le temps et l’accepte joyeusement:

 select cOL1, col2 FrOM taBLeName WheRE ...