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

mysql utf8mb4_unicode_ci forårsager unik nøglekollision

Du mangler pointen med CHARACTER SET og COLLATION . Et CHARACTER SET er en samling af forskellige karakterer. En COLLATION siger, om tegnene skal behandles som lige -- tænk A og a -- forskellige tegn, men behandlet for ORDER BY og WHERE = osv. som værende det samme.

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

Så i utf8_unicode_ci (eller utf8mb4_unicode_ci), anses disse to tegn for at være "lige".

"Lige" er testen for UNIQUE nøgler.

Indstil COLLATION for kolonnen til hvad der giver mening for dig.

  • utf8mb4_unicode_ci til gode sammenligninger fra det virkelige liv, tilsyneladende også denne. K=k=Ķ=ķ
  • utf8mb4_unicode_ci for mere enkeltsindede sammenligninger. Især ingen 2-tegnskombinationer matcher 1-tegns-kodninger. Sagsfoldning og accentstribning forekommer. K=k=Ķ=ķ
  • utf8mb4_bin tjekker blindt bitsene. Ingen kassefoldning osv. K k Ķ ķ er alle ulige.

utf8mb4_latvian_ci er lidt anderledes:K=k men ikke lig med Ķ=ķ . Der er andre specialiserede sammenstillinger for andre sprog (for det meste vesteuropæiske).

Din kaldes "FULLWIDTH LATIN CAPITAL LETTER K", så det er ret rimeligt, at det sammenlignes med latinsk K .




  1. Manipulering af utf8mb4 data fra MySQL med PHP

  2. Laravel rækkefølge efter mange forhold

  3. Find alle de kolonner, der kun har nulværdier, i en MySQL-tabel

  4. hvordan erstatte bogstaver med accent i en varchar2 kolonne i oracle