问题Tomcat在Java中报如下错误:java.sql.SQLException:Incorrectstringvalue:'\xF0\x9F\x8D\x87\xE7...'forcolumn'name'atrow1在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119))在com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)在com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)在com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815)atcom.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)atcom.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)atcom.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute以上错误这意味着mysql数据库中的名称字段插入了一个不正确的字符串值。name字段是用来记录微信昵称的。设计没有考虑到微信昵称中使用emoji表情,导致写入数据失败。问题根源是Mysql5.7.22版本。当时使用如下命令创建数据库,使用utf8编码。但是utf8不支持Emoji表情。createdatabaseifnotexistsmy_dbdefaultcharsetutf8collat??eutf8_general_ci;utf8为什么不支持Emojiutf8不支持emoji,因为emoji是4个字节存储一个字符,而mysql的utf8只能存储1-3个字节的字符。解决方案(1)Mysql服务器客户端,mysql,mysqld需要明确指定字符集为utf8mb4(2)在(1)的服务器上创建的db需要是utf8mb4字符集,COLLATE为utf8mb4_unicode_ci或utf8mb4_general_ci(3)在(2)db中建表存储emoji字段的字符集为utf8mb4,collat??e为utf8mb4_unicode_ci或utf8mb4_general_ci。(4)MySQL驱动不得低于5.1.13,5.1.34可用。utf8_unicode_ci和utf8_general_ci的比较:utf8_unicode_ci和utf8_general_ci对于中文和英文没有本质区别。utf8_general_ci校对速度更快,但准确性稍差。utf8_unicode_ci准确率高,但校对速度稍慢。简介:如果您的应用程序支持德语、法语或俄语,请务必使用utf8_unicode_ci。通常utf8_general_ci就足够了。utf8mb4mysql最低版本支持注意:utf8mb4最低mysql版本支持是5.5.3+,如果没有,请升级到较新的版本。MySQL在5.5.3之后加入了utf8mb4字符编码,mb4最多为4个字节。简单的说,utf8mb4是utf8的超集,完全兼容utf8,可以用四个字节存储更多的字符。但是不管是什么数据库,标准的UTF-8字符集编码可以用1~4个字节来编码21位的字符,这几乎囊括了世界上所有可见的语言。而MySQL中实现的utf8最多使用3个字节,即只支持Unicode中的基本多文本平面(U+0000到U+FFFF),包括控制字符、拉丁文、中文、日文、韩文大部分国际字符的数量,但不是全部,最常见的是手机上常用的表情符号和一些不常见的汉字,需要四个字节进行编码。Thespecificsolutionistomodify/etc/mysql/my.cnf(theconfigurationisgenerallystoredhere),andaddthefollowingcontent[client]default-character-set=utf8mb4[mysql]default-character-set=utf8mb4[mysqld]character-set-client-handshake=FALSEcharacter-set-server=utf8mb4collation-server=utf8mb4_unicode_ciinit_connect='SETNAMESutf8mb4'重启数据库,检查变量mysql>SHOWVARIABLESWHEREVariable_nameLIKE'character_set_%'ORVariable_nameLIKE'collation%';Variable_nameValuecharacter_set_clientutf8mb4character_set_connectionutf8mb4character_set_databaseutf8mb4character_set_filesystembinarycharacter_set_resultsutf8mb4character_set_serverutf8mb4character_set_systemutf8collation_connectionutf8mb4_unicode_cicollation_databaseutf8mb4_unicode_cicollation_serverutf8mb4_unicode_ci必须保证下面几个变量是utf8mb4系统变量描述character_set_client客户端来源数据使用的字符集character_set_connection连接层字符集character_set_database当前选中数据库的默认字符集character_set_results查询结果字符集character_set_server默认的Theinternaloperationcharactersetalsoconvertsthedatabaseandthealreadybuilttablesintoutf8mb4ALTERDATABASEdatabase_nameCHARACTERSET=utf8mb4COLLATE=utf8mb4_unicode_ci;#更改数据库编码ALTERTABLEtable_nameCONVERTTOCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;#更改表编码ALTERTABLEtable_nameCHANGEcolumn_nameVARCHAR(191)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;#修改列表的编码查询字符集编码showcreatedatabasefangdai_CMS;#查询数据库编码showcreatetablet_member;#查询表编码显示来自t_member的完整列;#查询所有表字段编码数据库连接配置添加characterEncoding=utf8会自动识别为utf8mb4;autoReconnect=true参数必须加上参考链接https://yq.aliyun.com/article...https://blog.csdn.net/u010129...本文由YP小站发表!
