18910140161

微信用户昵称包含emoji表情 使用mysql保存emoji表情

顺晟科技

2021-06-16 10:53:01

197

java.sql.SQLException:第1行第n列“name”的字符串值: '\xF0\x9F\x92\x94 '不正确

at.com . MySQL . JDBC . SQLError . CreateSQL Exception(SQLError . Java :1073)

at.com . MySQL . JDBC . MySQL io . Checker RorPacket(MySQL io . Java :3593)

at.com . MySQL . JDBC . MySQL io . Checker RorPacket(MySQL io . Java :3525)

at.com . MySQL . JDBC . MySQL io . SendCommand(MySQL io . Java :1986)

at.com . MySQL . JDBC . MySQL io . SqlqueryDirect(MySQL io . Java 33602140)

at.com . MySQL . JDBC . ConnectionImpl . ExecSqL(ConnectionImpl . Java :2620)

at.com . MySQL . JDBC . statementmmpl . execute update(Statementmmpl . Java :1662)

at.com . MySQL . JDBC . statementmmpl . execute update(Statementmmpl . Java :1581)

复制代码

当报告上述错误时,可能是java代码中的字段与数据库中的字段类型或代码不匹配。在这种情况下,只需要统一格式或代码。

本文主要介绍表情符号图像插入数据库的错误及解决方法

使用mysql数据库时,如果字符集是UTF-8,在java服务器上,存储表情表情时会抛出上述异常(比如微信开发获取用户昵称,部分用户昵称使用表情图片)

这是因为字符集不支持异常,因为utf-8编码可能有两个、三个、四个字节,其中Emoji表达式是四个字节,而mysql utf-8编码最多三个字节,所以不能插入数据。

解决方法:

1.从数据库层面解决(mysql支持utf8mb4版本是5.5.3,必须升级到更新的版本)

注意:

(1.修改数据库、表、列字符集

ALTER DatabaSe _ name CHARTER SET=utf 8 MB 4 COLLATE=utf 8 MB 4 _ unicode _ ci;

ALTER TABLE TABLE _ name CONVERT TO CHARACTER SET utf 8 MB 4 COLLATE utf 8 MB 4 _ unicode _ ci;

ALTER TABLE _ NAmE CHANGE _ column _ NAmE VARCHAR(191)CHARTER SET utf 8 MB 4 COLLATE utf 8 MB 4 _ unicode _ ci;

(2)修改mysql配置文件my.cnf(窗口是my.ini)

复制代码

[客户]

默认字符集=utf8mb4

[mysql]

默认字符集=utf8mb4

[mysqld]

字符集客户握手=假

字符集服务器=utf8mb4

排序规则-服务器=utf8mb4_unicode_ci

init_connect='SET NAMES utf8mb4 '

复制代码

(3.使用java服务器,升级或者确保mysql连接版本高于5.1.13,否则还是不能尝试utf8mb4。

(4.服务器端的数据库配置文件

JDBC . driverclassname=com . MySQL . JDBC . driver

JDBC . URL=JDBC : my SQL ://localhost :3306/database?useUnicode=TRUE character encoding=utf8 autoreconnect=TrueRewrittebatchedstatements=TRUE

jdbc.username=root

jdbc.password=password

如果mysql-connector升级,characterEncoding=utf8可以自动识别为utf8mb4(与原来的utf8兼容),并且

自动重新连接(当数据库连接异常中断时自动重新连接?默认值为false。强烈建议搭配。忽略此属性,这可能会导致缓存。

DB最新配置未读取,无法尝试utf8mb4字符集;

细节可见:

http://segmentfault.com/a/1190000000616820

第二,从应用层方面解决

获取数据后,数据盘点前代码:

URLEncoder.encode(昵称,' utf-8 ');

从数据库中取出显示时进行解码,

URLDecoder.decode(昵称,' utf-8 ');

建议从应用层求解时不要直接在对象的getter和setter方法中对昵称进行编码,因为setter方法在插入对象时对昵称进行编码,而在插入到数据库中时,相当于从对象中调用getter方法取出你的引用,这就重新解码了之前setter编码的昵称,也就是说对昵称没有做过任何操作。以上问题还是会出现。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航