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

java.sql.SQLException:valore stringa errato:'\xF0\x9F\x91\xBD\xF0\x9F...'

Quello che hai è EXTRATERRESTRIAL ALIEN (U+1F47D) e BROKEN HEART (U+1F494) che non sono nel piano multilingue di base. Non possono nemmeno essere rappresentati in Java come un carattere, "👽💔".length() == 4 . Non sono assolutamente caratteri nulli e si vedranno dei quadrati se non si utilizzano caratteri che li supportano.

utf8 di MySQL supporta solo il piano multilingue di base e devi usare utf8mb4 invece :

Per un carattere supplementare, utf8 non può affatto memorizzare il carattere, mentre utf8mb4 richiede quattro byte per memorizzarlo. Poiché utf8 non può memorizzare affatto il carattere, non hai caratteri supplementari nelle colonne inutf8 e non devi preoccuparti di convertire i caratteri o di perdere dati quando aggiorni i dati utf8 da versioni precedenti di MySQL.

Quindi, per supportare questi caratteri, il tuo MySQL deve essere 5.5+ e devi usare utf8mb4 ovunque. La codifica della connessione deve essere utf8mb4 , il set di caratteri deve essere utf8mb4 e la raccolta 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 utilizzare UTF8 a 4 byte, utf8mb4 con Connector/J?

Per utilizzare UTF8 a 4 byte con Connector/J, configurare il server MySQL concharacter_set_server=utf8mb4. Connector/J utilizzerà quindi tale impostazionefinché characterEncoding ha 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.