Qual è la differenza tra i set di caratteri utf8mb4 e utf8 in MySQL?


341

Qual è la differenza tra utf8mb4e utf8set di caratteri in MySQL ?

Conosco già codifiche ASCII , UTF-8 , UTF-16 e UTF-32 ; ma sono curioso di sapere qual è la differenza del utf8mb4gruppo di codifiche con altri tipi di codifica definiti in MySQL Server .

Ci sono speciali vantaggi / proposte di utilizzo utf8mb4piuttosto che utf8?

Risposte:


392

UTF-8 è una codifica di lunghezza variabile. Nel caso di UTF-8, ciò significa che la memorizzazione di un punto di codice richiede da uno a quattro byte. Tuttavia, la codifica di MySQL chiamata "utf8" (alias di "utf8mb3") memorizza solo un massimo di tre byte per punto di codice.

Quindi il set di caratteri "utf8" / "utf8mb3" non può memorizzare tutti i punti di codice Unicode: supporta solo l'intervallo da 0x000 a 0xFFFF, chiamato " Piano multilingue di base ". Vedi anche Confronto di codifiche Unicode .

Ecco cosa (una versione precedente della stessa pagina in) la documentazione di MySQL ha da dire al riguardo:

Il set di caratteri denominato utf8 [/ utf8mb3] utilizza un massimo di tre byte per carattere e contiene solo caratteri BMP. A partire da MySQL 5.5.3, il set di caratteri utf8mb4 utilizza un massimo di quattro byte per carattere e supporta caratteri supplementari:

  • Per un personaggio BMP, utf8 [/ utf8mb3] e utf8mb4 hanno caratteristiche di memorizzazione identiche: stessi valori di codice, stessa codifica, stessa lunghezza.

  • Per un carattere supplementare, utf8 [/ utf8mb3] non può affatto memorizzare il carattere , mentre utf8mb4 richiede quattro byte per memorizzarlo. Poiché utf8 [/ utf8mb3] non è in grado di memorizzare affatto il carattere, non si dispone di caratteri supplementari nelle colonne utf8 [/ utf8mb3] e non è necessario preoccuparsi di convertire caratteri o perdere dati durante l'aggiornamento dei dati utf8 [/ utf8mb3] da versioni precedenti di MySQL.

Quindi, se vuoi che la tua colonna supporti l'archiviazione di personaggi che si trovano al di fuori del BMP (e di solito lo desideri), come le emoji , usa "utf8mb4". Vedi anche Quali sono i caratteri Unicode non BMP più comuni attualmente in uso? .


10
Gli unici casi che ho riscontrato (finora) in cui utf8mb4 era "richiesto" sono cinesi ed emoticon. Ci sono alfabeti oscuri che ne hanno bisogno.
Rick James,

10
È inoltre necessario se si utilizza per conservare password e dati crittografati nel database. Stavo mantenendo la password crittografata in mysql usando il normale formato utf8 che mi ha causato molti problemi con alcune password in modo casuale e molto difficile da eseguire il debug, quindi finalmente ho provato a usare la codifica base64 e risolto il problema temporaneamente. Ma ora conosco il motivo.
Mojtaba Rezaeian,

38
I dati crittografati di @idealidea sono binari e non è necessario archiviare i dati binari in una colonna varchar. :)
CodeCaster

8
@thomasrutter Prova questo carattere (𡞰) per salvare con UTF-8. :)
502_Geek

2
@MojtabaRezaeian dipende in qualche modo dall'algoritmo della password - bcrypt2 produrrà ASCII.
Jasen,


47

Tratto dal manuale di riferimento di MySQL 8.0 :

  • utf8mb4: Una codifica UTF-8 del set di caratteri Unicode che utilizza da uno a quattro byte per carattere.

  • utf8mb3: Una codifica UTF-8 del set di caratteri Unicode che utilizza da uno a tre byte per carattere.

In MySQL utf8 è attualmente un alias per il utf8mb3quale è obsoleto e verrà rimosso in una futura versione di MySQL . A quel punto utf8 diventerà un riferimento a utf8mb4 .

Quindi, indipendentemente da questo alias, puoi impostare consapevolmente te stesso una utf8mb4codifica.

Per completare la risposta, vorrei aggiungere il commento di @ WilliamEntriken di seguito (anche preso dal manuale):

Per evitare ambiguità sul significato di utf8, considerare di specificare utf8mb4esplicitamente i riferimenti al set di caratteri anziché utf8.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.