Quello che hai è EXTRATERRESTRIAL ALIEN (U+1F47D)
eBROKEN HEART (U+1F494)
che non sono nel piano multilingue di base. Non possono essere anche rappresentati in Java come un char, "👽💔".length() == 4
. Non sono sicuramente caratteri nulli e si vedranno dei quadrati se non si utilizzano caratteri che li supportano.
MySQL utf8
supporta solo il piano multilingue di base e devi usare utf8mb4
invece :
Per un carattere supplementare, utf8 non può memorizzare affatto il carattere, mentre utf8mb4 richiede quattro byte per memorizzarlo. Poiché utf8 non è in grado di memorizzare affatto il carattere, non sono presenti caratteri supplementari nelle colonne utf8 e non è necessario preoccuparsi di convertire i caratteri o perdere dati quando si aggiornano i dati utf8 da versioni precedenti di MySQL.
Quindi, per supportare questi caratteri, il tuo MySQL deve essere 5.5+ e devi usarlo utf8mb4
ovunque. La codifica della connessione deve essere utf8mb4
, il set di caratteri deve essere utf8mb4
e la collazione deve essere utf8mb4
. Per Java è ancora solo "utf-8"
, ma MySQL ha bisogno di una distinzione.
Non so quale driver stai utilizzando, ma un modo indipendente dal driver per impostare il set di caratteri di connessione è inviare la query:
SET NAMES 'utf8mb4'
Subito dopo aver effettuato la connessione.
Vedi anche questo per Connector / J :
14.14: Come posso usare UTF8 a 4 byte, utf8mb4 con Connector / J?
Per utilizzare UTF8 a 4 byte con Connector / J, configurare il server MySQL con character_set_server = utf8mb4. Connector / J utilizzerà quindi tale impostazione
fintanto che characterEncoding non è stato impostato nella stringa di connessione . Ciò equivale al rilevamento automatico del set di caratteri.
Modifica anche le colonne e il database:
var1 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL
Ancora una volta, la tua versione di MySQL deve essere relativamente aggiornata per il supporto di utf8mb4.