存储emoji表情或特殊字符报错(Incorrect string value: ‘\xF0\x9F\x98\x82\xF0\x9F...‘)

今天发生一件有趣的事情。

我的博客

我在一篇文章中使用了**emoji表情**,前面很顺利,不管是WordPress还是其他博客园啥的,都是正常发送。

但是,我在Typecho系统中发布文章时....

我当时一脸懵逼,啥情况,数据库坏了?

我重启服务器,发现没用,于是准备直接使用Navicat工具直接写入数据库。

巧了,还是报错,不管可算知道问题了。

浏览器搜索一番后,发现,是表情的问题。

如何解决?

于是既然是错误,那我就解决一下吧。

首先,我们要知道,utf8是Typecho系统写入数据库是的默认编码,也是安装MySQL是的默认编码。

Typecho 默认是不支持 Emoji 表情的,当你评论中有 Emoji 的话,就会报这个错误。这个是因为编码的问题造成的。Mysql 默认使用的是 utf8 字符集,utf8 字符集的编码范围 u0000-uFFFF,而 Emoji 是在 Unicode 位于 u1F601-u1F64F 区段的字符。所以评论中带有 Emoji 表情才会报错。

  • 修改Typecho配置文件

    Typecho修改网站的配置文件,打开网站根目录,找到 config.inc.php 文件,把 charset 的值改为 urf8mb4

    如果是Java,可以修改数据库连接字符串的编码。其他语言也类似。

  • 修改MySQL全局默认编码

    首先,找到**my.cnf**文件,Window是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'
    

    找到之后直接将上面这串代码粘贴到文件的空位置,一般就最下面就可以。

    这样之后,重启MySQL服务。

    重启之后效果我们可以使用SQL语句看看。

上面部分是没改之前的,下面是改完后。

这样就可以了。

  • Typecho玩家请注意!
alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_options convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_users convert to character set utf8mb4 collate utf8mb4_general_ci;

请运行这一段SQL语句,至于怎么运行这就不说了,太基础。

这样,就可以正常发布带有表情的文章了。

延伸知识

1、MySQL在5.5.3之后增加了这个utf8mb4的编码,所以最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本;

2、mb4就是most bytes 4的意思,可以用来兼容四字节的unicode,存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。如果你要存互联网emoji表情,就需要utf8mb4,而不是utf-8;

3、utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换;

4、MySQL数据库的 “utf8”并不是真正概念里的 UTF-8,MySQL中的“utf8”编码只支持最大3字节每字符。真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符,MySQL的开发者没有修复这个bug。他们在2010年增加了一个变通的方法:一个新的字符集“utf8mb4”,他们并没有对外公布(可能因为这个bug有点尴尬)。现在很多指南推荐用户使用“utf8”其实都错了;

5、建议MySQL和MariaDB用户使用“utf8mb4”而不是“utf8”,毕竟现在是不管使用 Anroidz设备,还是 iOS 设备,如果插入包含有 emoji 表情符号的记录时就报错,还是很尴尬的;

6、最重要一点,对数据库操作前,记得备份数据。

为什么要修改编码才行?

为什么要把数据库的字符集设置成utf8mb4呢?以前一直用的都是utf8啊?

utf8适用于不使用移动设备的互联网交互,utf8mb4适用于当前的移动设备互联网开发,因为移动设备中常常会有表情符号(emoji)的存储,它占用4个字节的存储空间,而utf8是3个字节,这样,用3个字节去存储4个字节的东西,很明显是存不下的,会报错,所以要用utf8mb4,并且utf8mb4是兼容utf8的,那么,就没有理由不用utf8mb4字符集了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你遇到的错误是"java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x83\xF0\x9F...' for column 'content' at row 1"。这个错误通常是由于数据库的编码问题引起的。根据引用和引用来看,错误信息显示在插入数据时,'content'列接收到了一个无法识别的字符串值。 为了解决这个问题,你可以尝试以下步骤: 1. 确保数据库的字符集设置与应用程序的字符集设置相匹配。如果数据库的字符集不支持特定的字符,就会出现该错误。可以通过检查数据库的字符集设置来确认。 2. 确保你的应用程序在将数据插入数据库之前对数据进行正确的编码转换。根据引用,你可以使用EmojiConverter将字符串进行转义,然后再插入数据库。这样可以确保数据在插入数据库时不会包含无法识别的字符。 3. 如果上述步骤无效,可能需要考虑修改数据库的字符集设置,以支持特定的字符。具体的操作可能因数据库类型而异,你可以参考数据库的官方文档或寻求专业人士的帮助。 综上所述,你遇到的错误是由于数据库的编码问题引起的,可以通过检查数据库字符集设置、对数据进行正确的编码转换或修改数据库的字符集设置来解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [解决 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...'](https://blog.csdn.net/cai454692590/article/details/100016561)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [解决MysqlIncorrect string value: ‘\xF0\x9F\xA7\x92‘ for column ‘content‘ at row 1的异常](https://blog.csdn.net/weixin_45393094/article/details/127795979)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小简(JanYork)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值