Heim >WeChat-Applet >WeChat-Entwicklung >MySQL speichert Emoji-Ausdrücke (Spitzname des WeChat-Entwicklungsbenutzers.)
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for colum n 'name' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)
Wenn der obige Fehler gemeldet wird, kann es sich um den Feldtyp im Java-Code und das Feld handeln Geben Sie in der Datenbank ein. Oder die Kodierung stimmt nicht überein. In diesem Fall vereinheitlichen Sie einfach das Format oder die Kodierung.
Hier stellen wir hauptsächlich den Fehler beim Einfügen von Emoji-Bildern in die Datenbank und die Lösungen vor
Bei Verwendung einer MySQL-Datenbank, wenn der Zeichensatz UTF-8 ist und in Java Auf dem Server wird beim Speichern von Emoji-Ausdrücken die obige Ausnahme ausgelöst (wenn sich beispielsweise WeChat entwickelt, um Benutzer-Spitznamen zu erhalten, verwenden die Spitznamen einiger Benutzer Emoji-Bilder)
Dies ist eine Ausnahme aufgrund von Der Zeichensatz wird nicht unterstützt, da die UTF-8-Kodierung zwei, drei oder vier Bytes umfassen kann, wobei Emoji-Ausdrücke vier Bytes umfassen können und die UTF-8-Kodierung von MySQL bis zu drei Bytes umfassen kann, sodass die Daten nicht eingefügt werden können .
Lösung:
1. Lösen Sie das Problem auf Datenbankebene (MySQL unterstützt utf8mb4 Version 5.5.3+, die auf eine neuere Version aktualisiert werden muss)
Hinweis:
(1. Datenbank, Tabelle ändern , Spaltenzeichensatz
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
(2. Ändern Sie die MySQL-Konfigurationsdatei my.cnf (Fenster ist my.ini)
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'
(3. Wenn Sie einen Java-Server verwenden, aktualisieren Sie oder stellen Sie sicher, dass die MySQL-Verbindungsversion höher als 5.1.13 ist, andernfalls können Sie immer noch nicht Versuchen Sie es mit utf8mb4
(4. Serverseitige Datenbankkonfigurationsdatei
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE jdbc.username=root jdbc.password=password
Wenn MySQL-Connector aktualisiert wird , CharacterEncoding=utf8 kann automatisch ersetzt werden. Identifiziert als utf8mb4 (kompatibel mit dem ursprünglichen utf8) und
autoReconnection (wird die Verbindung automatisch wiederhergestellt, wenn sie ungewöhnlich unterbrochen wird? Der Standardwert ist falsch). Es wird dringend empfohlen, dieses Attribut zu ignorieren kann zu Caching führen.
Keine Die neueste Konfiguration der Datenbank wurde gelesen, was dazu führt, dass der utf8mb4-Zeichensatz nicht ausprobiert werden kann
2. Lösen Sie das Problem von der Anwendungsebene aus
Nachdem Sie die Daten erhalten haben, führen Sie dies aus, bevor Sie mit der Dateninventur fortfahren. Kodierung:
URLEncoder.encode(nickName, "utf-8");
Dekodiert, wenn aus der Datenbank abgerufen für Anzeige,
URLDecoder.decode(nickname, "utf-8");
Bei der Lösung des Problems aus der Anwendungsschicht wird empfohlen, es nicht direkt in den Objekt-Getter- und Setter-Methoden zu codieren, da die Die Setter-Methode kodiert den Spitznamen, wenn das Objekt eingefügt wird, was beim Einfügen in die Datenbank ziemlich kompliziert ist. Durch Aufrufen der Getter-Methode aus dem Objekt, um Ihre Referenz zu entnehmen, wird der vom Setter kodierte Spitzname neu dekodiert, was bedeutet, dass Es wird keine Operation für den Spitznamen ausgeführt.
Weitere MySQL-Emojis (Spitzname des WeChat-Entwicklungsbenutzers) finden Sie auf der chinesischen PHP-Website