66 votes

Question sur la sensibilité à la casse de SQL unique varchar

J'essaie d'alimenter une table SQL avec une liste de mots. La table elle-même est assez simple :

CREATE TABLE WORDS(
  ID BIGINT AUTO_INCREMENT, 
  WORD VARCHAR(128) NOT NULL UNIQUE, 
  PRIMARY KEY(ID)
);

Le problème que je rencontre est le suivant : lorsque je fais les insertions suivantes dos à dos

INSERT INTO WORDS(WORD) VALUES('Seth');
INSERT INTO WORDS(WORD) VALUES('seth');

La deuxième insertion échoue avec une violation de contrainte ("Duplicate entry 'seth' for key 'WORD'").

Comment puis-je obtenir le UNIQUE contrainte sur WORD pour être sensible à la casse ?

105voto

Bill Brasky Points 1172

On dirait que mysql est insensible à la casse par défaut :

Vous devez probablement créer la colonne avec une collation sensible à la casse (par exemple, utf8_bin) :

CREATE TABLE WORDS (
    ID BIGINT AUTO_INCREMENT, 
    WORD VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL UNIQUE, 
    PRIMARY KEY(ID)
);

30 votes

C'est fait. Merci. Pour ceux qui trouveront cette question plus tard, j'ai dû utiliser la collation 'utf8_bin' parce que mysql n'avait pas 'utf8_cs'.

0 votes

Merci @Seth, cela m'a été utile ainsi que les informations de Bill, utf8_bin s'appliquait également à ma situation.

1 votes

1273 - Collation inconnue : 'utf8_cs'.

8voto

George Bailey Points 13735

Par défaut, MySQL ignore les différences de casse et les espaces de fin de ligne sur les fichiers varchar .

Si vous avez besoin qu'il soit sensible à la casse, vous pouvez modifier le tableau pour qu'il soit varchar(...) binary .

Utilisez show create table pour mieux comprendre comment MySQL convertit cela en notation complète.

Si vous devez faire attention aux espaces de fin de ligne et respecter la casse, utilisez l'option varbinary au lieu de varchar .

1voto

Khubaib Raza Points 174

Essayez ça :

ALTER TABLE WORDS CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-3voto

suleman Points 70

J'ai fait en sorte que ma clé UNIQUE soit de type varchar(1000). Cela a fonctionné.

Après quelques essais et erreurs, j'ai constaté que tout ce qui est supérieur ou égal à 1100 varchar échoue.

Pour clarifier, je n'ai pas essayé entre 1001 et 1099.

J'espère que cela vous aidera.

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