作者:mobiledu2502855037 | 来源:互联网 | 2023-09-10 13:24
utf8mb4是utf8的超集,mb4就是mostbytes4的意思,专门用来兼容四字节的Unicode,MySQL在5.5.3之后增加了utf8mb4的编码。MySQL支持的ut
00-1010在最近的项目中存储表情包时报告了一个错误:
###原因: Java . SQL . Sqlexception :第1行的列“column1”的字符串值: '\xF0\x9F\x98\x81 '不正确
;未分类的SQLExceptionSQL状态[HY000];错误代码[1366];第1行“column1”列的字符串值:“\ xF0 \ x9F \ x98 \ x81”不正确;嵌套异常为java.sql.sqlexception :错误的字符串值3360' \ xf0 \ x9f \ x98 \ x81 '位于第[现象]行的列“column1”此问题是由数据库的编码方法引起的。首先,让我们了解utf8和utf8mb4之间的区别:
Utf8通常指UTF-8,这是Unicode的可变长度字符编码。每个字符最多有三个字节,有时称为utf8mb3。
Utf8mb4是utf8的超集,mb4表示大部分字节4,专门用来兼容四个字节的Unicode。MySQL在5.5.3之后增加了utf8mb4编码。
MySQL支持的utf8编码最大字符长度为3字节。如果遇到4字节宽的字符,将会插入一个异常。三个字节的utf8可以编码的最大Unicode字符是0xffff。任何不在基本多文本平面的Unicode字符都不能被MySQL utf8字符集存储,包括表情符号和许多不常见的汉字,以及任何新的Unicode字符等。如果要在MySQL中保存4字节utf8字符,需要使用utf8mb4字符集。从上面我们可以看到,如果要存储表情符号,那么数据库的编码方式需要是utf8mb4。接下来,让我们看看数据库和数据库链接的配置:
查看数据库代码,可以看到数据库代码已经是utf8mb4了。
显示像“character_set_database”这样的变量;
查看项目中数据库链接的配置,我们可以看到设置了复杂的日落=utf8。
JDBC : my SQL :/$ { MySQL . host } : $ { MySQL . port }/$ { MySQL . db }?UseUnicode=true complex sunset=utf8 zero datetime behavior=convert toll注意:无论是使用utf8编码还是utf8mb4,数据库链接url中的complex sunset都设置为utf8(或UTF-8),没有complex sunset=utf8mb4这样的写法。
由于数据库代码是utf8mb4,并且在数据库链接url中设置了复杂的日落=utf8,为什么表情存储仍然会报告错误?
根据研究,原来pom.xml中的mysql-connector-java版本号在起作用。
mysql-connector-java版本支持utf8mb4字符集,如下所示:
项目中使用的mysql-connector-java版本号为5.1.45。从上表中,有必要设置mysql服务器配置文件:
vi /etc/my.cnf
[mysqld]
设置字符集-服务器=utf8mb4后,重启mysql服务,再次运行project服务,就可以将表情包写入数据库表中了。
有时候,我们没有权限修改mysql服务器配置文件,重启mysql服务。此时我们可以将mysql-connector-java版本号更改为5.1.47或以上或8.0.13或以上,然后就可以在不修改mysql服务配置文件的情况下存储表情符号了。
然而,mysql-connector-java的版本号并不是我们想要改变的。它与mysql版本和java版本有关:
Mysql-连接器-java和MySQL版本:
其中,官方推荐MySQL 5.6或以上版本使用connector/j 8.0。
MySQL-连接器-java和java版本:
其中,JRE 1.7要求连接器/J 5.1.21或以上。
至此,大家应该都知道如何解决表情存储的问题了:首先根据mysql版本和Java版本选择对应的mysql-connector-Java,然后根据mysql-connector-java版本选择对应的解决方案。
有时,我们的mysql-connector-java版本太低(可能是历史项目中的mysql或java版本太低)或者我们无法更改mysql服务器配置文件。我们也可以用第二种方案来存储表情符号:前端或后端在书写时对用户数据进行编码和解码,前端或后端在显示时对用户数据中的表情符号进行编码和解码。因为这个解决方案不推荐,我们就不谈了,可以上网。
如果对你有帮助,请点一个“喜欢”,谢谢~