>  기사  >  위챗 애플릿  >  mysql은 이모티콘 표현(WeChat 개발 사용자 닉네임..)을 저장합니다.

mysql은 이모티콘 표현(WeChat 개발 사용자 닉네임..)을 저장합니다.

高洛峰
高洛峰원래의
2017-02-15 10:47:282410검색

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)

위 오류가 보고되면 Java 코드 및 데이터베이스의 필드 유형이나 인코딩일 수 있습니다. . 일치하지 않는 경우에는 형식이나 인코딩을 통일하면 됩니다.

이모지 이미지를 데이터베이스에 삽입할 때 발생하는 오류와 해결 방법을 주로 소개합니다.


mysql 데이터베이스 사용 시 문자 집합이 UTF-8인 경우 그리고 java에서는 서버에서 이모티콘 표현을 저장할 때 위의 예외가 발생합니다. (예를 들어 WeChat이 사용자 닉네임을 얻기 위해 개발할 때 일부 사용자의 닉네임은 이모티콘 이미지를 사용합니다.)

이는 예외입니다. UTF-8 인코딩은 2바이트, 3바이트 또는 4바이트일 수 있으며 그 중 Emoji 표현은 4바이트이고 MySQL의 UTF-8 인코딩은 최대 3바이트이므로 데이터를 삽입할 수 없습니다. .
해결책:
1. 데이터베이스 수준에서 해결하세요(MySQL은 utf8mb4 버전 5.5.3 이상을 지원하므로 최신 버전으로 업그레이드해야 함)
참고:
(1. 데이터베이스, 테이블 수정 , 열 문자 집합

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. mysql 구성 파일 my.cnf 수정(창은 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. Java 서버를 사용하는 경우 업그레이드하거나 mysql 연결 버전이 5.1.13 이상인지 확인하세요. 그렇지 않으면 여전히 utf8mb4를 시도할 수 없습니다
(4. 서버측 db 구성 파일

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


mysql-connector를 업그레이드하면 CharacterEncoding=utf8을 사용할 수 있습니다. utf8mb4(원래 utf8과 호환)로 자동 인식되며
autoReconnection(데이터베이스 연결이 비정상적으로 중단되면 자동으로 다시 연결됩니까? 기본값은 false입니다) 이 속성을 무시하면 캐싱 이유가 발생할 수 있습니다. 🎜> 최신 DB를 읽지 못하여 utf8mb4 문자 집합을 사용할 수 없습니다.


2. 데이터를 얻은 후, 데이터 인벤토리로 이동하기 전에 인코딩하세요.


URLEncoder.encode(nickName, "utf-8");

데이터베이스에서 검색하여 표시할 준비가 되면 디코딩됩니다.

URLDecoder.decode(nickname, "utf-8");

애플리케이션 레이어에서 문제를 해결할 때 객체 getter, setter 메소드에서 직접 인코딩하지 않는 것이 좋습니다. 왜냐하면 setter 메소드는 객체가 있을 때 닉네임을 인코딩하기 때문입니다. 데이터베이스에 삽입할 때 개체에서 getter 메서드를 호출하여 자신을 참조하는 것과 같습니다. 이를 제거하면 이전 setter에서 인코딩된 Nickname이 다시 디코딩되므로 위의 문제가 계속 발생합니다. 🎜>

더 많은 mysql 저장 이모티콘 표현(WeChat 개발 사용자 별명..) 기사를 보려면 PHP 중국어 웹사이트를 따르세요

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.