Sensibilité à la casse des noms de colonnes SQL Server

case-insensitive case-sensitive collation sqlbulkcopy sql-server

Question

La base de données que j'utilise a un classement French_CI_AS (le terme CI doit correspondre à la casse), mais elle est sensible à la casse. J'essaie de comprendre pourquoi.

La raison pour laquelle j'affirme cela est que les insertions en bloc avec une configuration de cas «GIVEN» échouent, mais qu'elles réussissent avec une autre configuration de cas «Étant donné».

Par exemple:

  • INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES ("value1", "value2") échoue, mais
  • INSERT INTO SomeTable([Given],[ColName]) VALUES ("value1", "value2") fonctionne.

EDIT vient de voir ceci:

http://msdn.microsoft.com/en-us/library/ms190920.aspx

cela signifie-t-il qu'il devrait être possible de modifier le classement d'une colonne sans vider toutes les données et recréer la table associée?

Réponse populaire

Compte tenu de cette information essentielle (c’est dans un commentaire sur la question et non dans la question):

En fait, j’utilise la méthode d’insertion en bloc de Microsoft .Net, je ne connais donc pas exactement la requête qu’elle envoie au serveur de base de données.

Il est donc logique que les noms de colonne soient traités comme sensibles à la casse, même dans une base de données ne la SqlBulkCopy , car c'est ainsi que fonctionne la classe SqlBulkCopy . Veuillez consulter les mappages de colonnes dans SqlBulkCopy sont sensibles à la casse .

NOTES COMPLÉMENTAIRES

  1. Lorsque vous posez une question sur une erreur, veuillez toujours inclure le message d'erreur réel et complet dans la question. Le simple fait de dire qu’il ya eu une erreur conduit à beaucoup de devinettes et à des poursuites extravagantes qui aboutissent à des réponses hors sujet.
  2. Lorsque vous posez une question, veuillez ne pas changer les circonstances. Par exemple, la question dit (soulignement ajouté):

    les insertions en bloc avec une configuration de cas 'GIVEN' échouent, mais elles réussissent avec une autre configuration de cas 'Étant donné'.

    Pourtant, les exemples suivants sont des INSERT s uniques. En outre, un commentaire sur la question indique:

    En fait, j’utilise la méthode d’insertion en bloc de Microsoft .Net, je ne connais donc pas exactement la requête qu’elle envoie au serveur de base de données.

    L'utilisation de .NET et SqlBulkCopy est différente de l'utilisation de BULK INSERT ou INSERT , ce qui rend la question actuelle trompeuse et rend difficile (voire impossible) la réponse correcte. Cette nouvelle information entraîne également d'autres questions, car lorsque vous utilisez SqlBulkCopy , vous n'écrivez aucune instruction INSERT : vous écrivez simplement une SELECT et spécifiez le nom de la table de destination. Si vous spécifiez des noms de colonne pour la table de destination, cela se trouve dans les mappages de colonnes facultatifs. Est-ce là le problème?

  3. En ce qui concerne la section "EDIT" de la question:

    Non, changer le classement de la colonne ne vous aidera pas du tout, même si vous n'utilisiez pas SqlBulkCopy . Le classement d'une colonne détermine le comportement des données stockées dans la colonne , et non le comportement des noms de colonne (c'est-à-dire les métadonnées de la table). C'est le classement de la base de données lui-même qui détermine le comportement des métadonnées d'objet de niveau base de données. Et dans ce cas, vous prétendez que la DB utilise un Collation insensible à la casse (correcte, la _CI_ partie du nom de Collation ne signifie « C Asel nsensitive »).

  4. En ce qui concerne les déclarations suivantes de Jonathan Leffler sur la question:

    qui pénètre dans une zone très délicate de l’interaction entre identifiants délimités (normalement sensibles à la casse) et classements (celui-ci n’étant pas sensible à la casse).

    Non, les identificateurs délimités ne sont normalement pas sensibles à la casse. Les sensibilités (cas, accent, type de kana, largeur et début dans le sélecteur de variation de SQL Server 2017) des identificateurs délimités sont les mêmes que pour les identificateurs non délimités de ce même niveau. "Même niveau" signifie que les noms de niveau instance (bases de données, connexions, etc.) sont contrôlés par le classement au niveau instance, tandis que les noms de niveau base de données (schémas, objets - tables, vues, fonctions, procédures stockées, etc.), Les utilisateurs, etc.) sont contrôlés par le classement au niveau de la base de données. Et ces deux niveaux peuvent avoir des collations différentes.

    vous devez rechercher si les noms de colonne SQL dans une base de données sont sensibles à la casse lorsqu'ils sont délimités. Cela peut également dépendre de la manière dont l'instruction CREATE TABLE est écrite (les noms ont-ils été délimités dans celle-ci?). Normalement, SQL ne respecte pas la casse pour les noms de colonne et de table; vous pouvez écrire INSERT INTO SoMeTaBlE(GiVeN, cOlNaMe) VALUES("v1", "v2") et si les noms ne sont jamais délimités, ce serait OK.

    Peu importe que les noms de colonnes aient été délimités ou non lors de la création de la table, du moins en ce qui concerne la gestion de leur résolution. Les noms de colonnes sont des métadonnées au niveau de la base de données, contrôlées par le classement par défaut de la base de données. Et il en va de même pour toutes les métadonnées au niveau de la base de données dans chaque base de données. Certains noms de colonne ne peuvent pas être sensibles à la casse, d'autres ne le sont pas.

    De plus, les noms de table et de colonne n'ont rien de spécial. Ce sont des méta-données au niveau de la base de données, tout comme les noms d'utilisateur, les noms de schéma, les noms d'index, etc. Toutes ces méta-données sont contrôlées par le classement par défaut de la base de données.

    Les méta-données (au niveau instance et au niveau base de données) ne sont "normalement" pas sensibles à la casse en raison de la collation par défaut suggérée lors de l'installation comme étant une collation respectant la casse.

    un 'identificateur délimité' est un nom de colonne, un nom de table ou un élément similaire placé entre guillemets, tel que CREATE TABLE "table" (...)

    Il est plus exact de dire qu’un identificateur délimité est un identificateur inclus dans le ou les caractères que le SGBD en question a défini comme délimiteurs. Et les caractères particuliers utilisés pour les délimiteurs varient entre les différents SGBD.

    Dans SQL Server, les identificateurs délimités sont placés entre crochets: [GIVEN]

    Bien que les crochets fonctionnent toujours comme délimiteurs d'identificateurs, il est possible d'utiliser des guillemets doubles comme séparateurs SI la propriété de niveau session de QUOTED_IDENTIFIER définie sur ON (il est préférable de le faire de toute façon).

    Il existe des pièces mystérieuses en SQL (et la gestion des identificateurs délimités en fait partie)

    Eh bien, les identifiants délimités sont en réalité assez simples. La délimitation d’un identifiant a pour but d’ignorer efficacement les règles des identifiants classiques (c’est-à-dire non délimités). Mais, en termes d'identifiants réguliers, oui, ces règles sont plutôt obscures (principalement en raison de la documentation officielle incomplète et incorrecte). Ainsi, afin d'élucider le fonctionnement réel des identificateurs dans SQL Server, j'ai effectué plusieurs recherches et publié les résultats ici (avec des liens vers la recherche elle-même):

    Liste complète des règles pour les identificateurs T-SQL

Pour plus d'informations sur les classements / codages / Unicode / ASCII, en particulier en ce qui concerne Microsoft SQL Server, consultez la page suivante:

Collations.Info



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi