Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql utf8mb4_unicode_ci provoque une collision de clé unique

Vous manquez le point sur CHARACTER SET et COLLATION . Un CHARACTER SET est une collection de personnages différents. Un COLLATION dit s'il faut traiter les caractères comme égaux -- pensez A et a -- caractères différents, mais traités pour ORDER BY et WHERE = , etc. comme étant identiques.

mysql> SELECT 'K'='K' COLLATE utf8_unicode_ci;
+-----------------------------------+
| 'K'='K' COLLATE utf8_unicode_ci  |
+-----------------------------------+
|                                 1 |
+-----------------------------------+

Ainsi, dans utf8_unicode_ci (ou utf8mb4_unicode_ci), ces deux caractères sont considérés comme "égaux".

"Equal" est le test pour UNIQUE clés.

Définissez le COLLATION pour la colonne selon ce qui a du sens pour vous.

  • utf8mb4_unicode_ci pour de bonnes comparaisons "dans la vraie vie", y compris apparemment celle-ci. K=k=Ķ=ķ
  • utf8mb4_unicode_ci pour des comparaisons plus simples. En particulier, aucune combinaison à 2 caractères ne correspond aux encodages à 1 caractère. Le pliage de caisse et le décapage des accents se produisent. K=k=Ķ=ķ
  • utf8mb4_bin vérifie aveuglément les bits. Pas de pliage de cas, etc. K k Ķ ķ sont tous inégaux.

utf8mb4_latvian_ci est un peu différent :K=k mais pas égal à Ķ=ķ . Il existe d'autres classements spécialisés pour d'autres langues (principalement d'Europe occidentale).

Votre s'appelle "LETTRE MAJUSCULE LATINE PLEINE CHASSE K", il est donc tout à fait raisonnable qu'elle soit égale au latin K .