Mysql
 sql >> Database >  >> RDS >> Mysql

mysql utf8mb4_unicode_ci causa una collisione di chiavi univoche

Ti manca il punto su CHARACTER SET e COLLATION . Un CHARACTER SET è una raccolta di diversi personaggi. Una COLLATION dice se trattare i caratteri come uguali -- pensa a A e a -- caratteri diversi, ma trattati per ORDER BY e WHERE = , ecc come lo stesso.

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

Quindi in utf8_unicode_ci (o utf8mb4_unicode_ci), quei due caratteri sono considerati "uguali".

"Uguale" è il test per UNIQUE chiavi.

Imposta il COLLATION per la colonna a tutto ciò che ha senso per te.

  • utf8mb4_unicode_ci per buoni confronti "nella vita reale", apparentemente incluso questo. K=k=Ķ=ķ
  • utf8mb4_unicode_ci per confronti più semplici. In particolare nessuna combinazione di 2 caratteri corrisponde a codifiche a 1 carattere. Si verifica la piegatura della custodia e lo stripping dell'accento. K=k=Ķ=ķ
  • utf8mb4_bin controlla ciecamente i bit. Nessuna piegatura del caso, ecc. K k Ķ ķ sono tutti disuguali.

utf8mb4_latvian_ci è leggermente diverso:K=k ma non uguale a Ķ=ķ . Esistono altre regole di confronto specializzate per altre lingue (principalmente dell'Europa occidentale).

Il tuo è chiamato "LETTERA MAIUSCOLA LATINA A LARGHEZZA COMPLETA K", quindi è abbastanza ragionevole che sia uguale al latino K .