web-dev-qa-db-fra.com

Question sur la sensibilité à la casse varchar unique SQL

J'essaie de remplir 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 ("Entrée dupliquée 'seth' pour la clé 'Word'").

Comment obtenir que la contrainte UNIQUE sur Word soit sensible à la casse?

52
Seth

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

Vous devez probablement créer la colonne avec un classement 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)
);
81
Bill Brasky

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

Si vous souhaitez que la table soit sensible à la casse, vous pouvez modifier la table pour qu'elle 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 et être sensible à la casse, utilisez varbinary au lieu de varchar.

6
George Bailey

J'ai fabriqué ma clé UNIQUE varchar (1000). Ça a marché.

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

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

J'espère que cela t'aides.

0
suleman