Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql utf8mb4_unicode_ci verursacht eindeutige Schlüsselkollision

Sie vermissen den Punkt über CHARACTER SET und COLLATION . Ein CHARACTER SET ist eine Sammlung verschiedener Charaktere. Eine COLLATION gibt an, ob die Zeichen als gleich behandelt werden sollen – denken Sie an A und a -- andere Zeichen, aber für ORDER BY behandelt und WHERE = , usw. als gleich.

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

In utf8_unicode_ci (oder utf8mb4_unicode_ci) werden diese beiden Zeichen also als "gleich" betrachtet.

"Gleich" ist der Test für UNIQUE Tasten.

Legen Sie die COLLATION fest für die Spalte, was für Sie sinnvoll ist.

  • utf8mb4_unicode_ci für gute Vergleiche im "echten Leben", einschließlich dieses anscheinend. K=k=Ķ=ķ
  • utf8mb4_unicode_ci für einfachere Vergleiche. Insbesondere stimmen keine 2-Zeichen-Kombinationen mit 1-Zeichen-Kodierungen überein. Fallfaltung und Akzententfernung treten auf. K=k=Ķ=ķ
  • utf8mb4_bin prüft die Bits blind. Keine Fallfaltung usw. K k Ķ ķ sind alle ungleich.

utf8mb4_latvian_ci ist etwas anders:K=k aber nicht gleich Ķ=ķ . Es gibt andere spezialisierte Sortierungen für andere Sprachen (hauptsächlich westeuropäisch).

Ihr heißt "VOLLWEITER LATEINISCHER GROSSBUCHSTABE K", daher ist es ziemlich vernünftig, dass er mit dem lateinischen K verglichen wird .