顺晟科技
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编码的昵称,也就是说对昵称没有做过任何操作。以上问题还是会出现。
04
2022-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06