sql >> Database >  >> RDS >> Mysql

java.sql.SQLException:Onjuiste tekenreekswaarde:'\xF0\x9F\x91\xBD\xF0\x9F...'

Wat je hebt is EXTRATERRESTRIAL ALIEN (U+1F47D) en BROKEN HEART (U+1F494) die niet in het meertalige basisvlak liggen. Ze kunnen zelfs niet in Java worden weergegeven als één teken, "👽💔".length() == 4 . Het zijn zeker geen null-tekens en je zult vierkanten zien als je geen lettertypen gebruikt die ze ondersteunen.

MySQL's utf8 ondersteunt alleen basis meertalig vliegtuig, en je moet utf8mb4 . gebruiken in plaats daarvan :

Voor een aanvullend teken kan utf8 het teken helemaal niet opslaan, terwijl utf8mb4 vier bytes nodig heeft om het op te slaan. Aangezien utf8 het teken helemaal niet kan opslaan, hebt u geen aanvullende tekens in de utf8-kolommen en hoeft u zich geen zorgen te maken over het converteren van tekens of het verliezen van gegevens bij het upgraden van utf8-gegevens van oudere versies van MySQL.

Dus om deze karakters te ondersteunen, moet je MySQL 5.5+ zijn en moet je utf8mb4 gebruiken overal. Verbindingscodering moet utf8mb4 zijn , tekenset moet utf8mb4 . zijn en verzameling moet utf8mb4 . zijn . Voor Java is het nog steeds gewoon "utf-8" , maar MySQL heeft een onderscheid nodig.

Ik weet niet welk stuurprogramma u gebruikt, maar een stuurprogramma-onafhankelijke manier om de verbindingstekenset in te stellen, is door de vraag te verzenden:

SET NAMES 'utf8mb4'

Direct na het maken van de verbinding.

Zie ook dit voor Connector/J :

14.14:Hoe kan ik 4-byte UTF8, utf8mb4 met Connector/J gebruiken?

Om 4-byte UTF8 met Connector/J te gebruiken, configureert u de MySQL-server withcharacter_set_server=utf8mb4. Connector/J zal die instelling dan gebruikenzolang characterEncoding niet . heeft ingesteld in de verbindingsreeks . Dit komt overeen met automatische detectie van de tekenset.

Pas ook uw kolommen en database aan:

var1 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL

Nogmaals, uw MySQL-versie moet relatief up-to-date zijn voor utf8mb4-ondersteuning.



  1. Datums vergelijken in SQL Server

  2. Hoe csv-strings het beste te splitsen in oracle 9i

  3. LISTAGG() Functie in Oracle

  4. Nieuwe gegevens blijven niet behouden in de Rails-arraykolom op Postgres