none
case sensibilité de SQL Server RRS feed

  • Question

  • bonjour

    Il semble que SQL server soit plus ou moins insensible a la case

    Ainsi il reconnait le mot The comme existant face au mot the

    or ces deux termes ne sont pas sémantiquement égaux.

    Quel qu'un aurait il des informations sur ce problème?


    Jean Noël Martin

    lundi 1 septembre 2014 06:27

Réponses

  • je ne sais pas quoi dire de plus. Il faut la collation des colonnes de la tables T_Word, je vous ai donné la requête pour répondre à cette demande.
    • Marqué comme réponse JeanNoel53 mardi 2 septembre 2014 14:00
    mardi 2 septembre 2014 08:02

Toutes les réponses

  • Il y a différentes granularités de collation dans SQL Server.

    La granularité Instance : 

    SELECT SERVERPROPERTY('Collation') AS [Collation]

    La granularité Base de données :

    SELECT name, collation_name FROM sys.databases

    La ganularité Colonne :

    SELECT o.name AS [Obj], c.name [Col], collation_name 
    FROM sys.objects o
    INNER JOIN sys.columns c
    	ON o.object_id = c.object_id

    Dans votre cas, il est peut nécessaire que vous changiez la collation de la colonne en question en étant case sensitive (CS) et accent sensitive (AS). Si votre besoin est au dela, il est nécessaire de reconfigurer la base ou l'instance.

    • Proposé comme réponse Ahmed KASMI lundi 1 septembre 2014 08:52
    lundi 1 septembre 2014 08:38
  • Voici un lien (en anglais) qui pourra vous aidez à comprendre la collation.

    Lien

    lundi 1 septembre 2014 08:45
  • merci de l'info: Je vous propose de passer ensemble à l'implémentation:

    "SELECT siIdPOS, nuIdWord FROM T_WORD WHERE vcString = @Text AND siIdPOS = @POS AND siIdLang = @idLang"

    Dans ce cas le mot sensible a la case est contenu dans Text

    Je dois donc y mettre de terme CS, mais ou?


    Jean Noël Martin

    lundi 1 septembre 2014 09:30
  • Pour votre requête, je pense que l'écriture suivante devrait suffir : 

    SELECT siIdPOS, nuIdWord FROM T_WORD WHERE vcString COLLATE FRENCH_CS_AS = @Text AND siIdPOS = @POS AND siIdLang = @idLang

    CS = Case sensitive (opposé de CI = Case Insensitive)

    AS = Accent Sensitive (opposé de AI = Accent Insensitive)

    Dans mon exemple, j'ai mis FRENCH car c'est comme ça que je travaille, je vous invite plutôt à vérifier la collation de la colonne vcString via la requête suivante : 

    USE [MaBase]
    GO
    SELECT o.name AS [Obj], c.name [Col], collation_name 
    FROM sys.objects o
    INNER JOIN sys.columns c
    	ON o.object_id = c.object_id
    WHERE o.name = 'T_WORD'
    AND c.name = 'vcString'

    Mais dans le cas d'une généralité, il est préférable de changer directement la collation au niveau de la colonne lors de la création de la table.


    lundi 1 septembre 2014 09:49
  • Merci, je l'ai fait:

    J'ai un problème à l'exécution dans une autre requète:

    INSERT INTO T_WORD ( nuIDWord, vcString, siOccurrence, siIdPOS, siIdLang, nuIdLemma) VALUES ( @ID, @Text, @Ocurr, @POS, @Lang, @Lemma);

    "Impossible d'insérer une ligne de clé en double dans l'objet « dbo.T_WORD » avec un index unique « T_WORD_uniqueness_IDX ». La valeur de clé dupliquée est ('the', 2, 2).
    L'instruction a été arrêtée."

    peut on continuer l'implémentation?


    Jean Noël Martin


    • Modifié JeanNoel53 lundi 1 septembre 2014 14:47
    lundi 1 septembre 2014 14:42
  • Vous essayé d'insérer une ligne avec une combinaison des valeurs qui repose sur la contrainte unique (T_WORD_uniqueness_IDX). 

    Il faut donc que vous cherchiez pourquoi, vous avez déjà cette ligne. Il est peut-être possible que ça soit à cause de la collation. 

    Pour aller plus loin, il faut avoir la structure de la table T_WORD (avec les indexs et collation des colonnes)

    mardi 2 septembre 2014 06:48
  • Je vous donne ci joint le script de T_WORD:

    CREATE TABLE T_WORD (
      nuIdWord NUMERIC(18,0) NOT NULL identity,
      vcString VARCHAR(128) NOT NULL,
      siIdPOS SMALLINT NOT NULL,
      siOccurrence SMALLINT constraint T_WORDsiOccurrence_Chk CHECK ( (siOccurrence >= 1)  OR (siOccurrence IS NULL) ) ,
      siIdLang SMALLINT NOT NULL,
      nuIdLemma NUMERIC(18,0) NOT NULL,
      constraint T_WORD_PK PRIMARY KEY (nuIdWord));

    et merci pour votre aide


    Jean Noël Martin

    mardi 2 septembre 2014 07:03
  • Il manque la collation des colonnes et il manque l'index unique "T_WORD_uniqueness_IDX"
    mardi 2 septembre 2014 07:05
  • c'est ci dessous:

    /* Ajouter les clés, les contraintes et les index restant pour la table T_WORD.               */
    create unique index T_WORD_uniqueness_IDX on T_WORD (
      vcString,
      siIdPos,
      siIdLang)
    alter table T_SEG_WORD
      add constraint T_WORD_FK1 foreign key (
        nuIdWord)
       references T_WORD (
        nuIdWord);
    /* Ajouter des contraintes de clé étrangère à la table T_WORD.                                */
    alter table T_WORD
      add constraint T_LANGUAGE_FK6 foreign key (
        siIdLang)
       references T_LANGUAGE (
        siIdLang);


    Jean Noël Martin

    mardi 2 septembre 2014 07:25
  • et la collation des colonnes de la table ?

    USE [MaBase]
    GO
    SELECT o.name AS [Obj], c.name [Col], collation_name 
    FROM sys.objects o
    INNER JOIN sys.columns c
    	ON o.object_id = c.object_id
    WHERE o.name = 'T_WORD'

    mardi 2 septembre 2014 07:28
  • Je ne comprend pas le contenu de votre post

    Jean Noël Martin

    mardi 2 septembre 2014 07:59
  • je ne sais pas quoi dire de plus. Il faut la collation des colonnes de la tables T_Word, je vous ai donné la requête pour répondre à cette demande.
    • Marqué comme réponse JeanNoel53 mardi 2 septembre 2014 14:00
    mardi 2 septembre 2014 08:02