Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解决微信emjoy特殊符号插入数据库出错

解决微信emjoy特殊符号插入数据库出错

作者头像
码农编程进阶笔记
发布于 2022-06-29 06:33:36
发布于 2022-06-29 06:33:36
64800
代码可运行
举报
运行总次数:0
代码可运行

概述:

最近一个项目中调用同事封装的一个微信获取信息接口并处理字段存入数据库处理的功能接口,功能测试阶段发现关注公众号信息并没有成功返回,而且情况是一些账号是正常的,一些人却是有问题的,针对有问题的用户查看日志发现微信官方返回的关注状态与同事接口返回的内容不符合,也就是说没有正常更新到。日志记录相关SQL,插入数据库才发现是微信的emjoy符号导致出现问题。

mysql报错内容:

根据上图看见,是mysql对特殊号的报错。

方案概况:

针对符号的报错,搜索了有没有解决方案,并且发现了有两个解决方法。

  1. 修改mysql的编码。
  2. 对字符过滤后再插入数据库

具体方案:

1、修改mysql的编码:

Mysql的utf8编码最多3个字节,而Emoji表情或者某些特殊字符是4个字节。因此我们需要修改编码能接受4个字节的,例如utf8mb4。

  1. 在mysql的安装目录下找到my.ini,作如下修改:[mysqld] character-set-server=utf8mb4 [mysql] default-character-set=utf8mb4
  2. 重启mysql服务
  3. 修改表 ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

2、特殊字符过滤:

其实很多时候数据库中储存的微信昵称完整性不是特别重要,例如:“小蕾??”’ 保存为“小蕾” ,可以考虑直接过滤特殊字符,这样的优点是不用担心修改mysql编码过程中造成其他错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//微信特殊字符过滤
private function wx_name_filter($str) {
    $name = $str;
    $name = preg_replace('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', '', $name);
    $name = preg_replace('/xE0[x80-x9F][x80-xBF]‘.‘|xED[xA0-xBF][x80-xBF]/S','?', $name);
    $return = json_decode(preg_replace("#(\\\ud[0-9a-f]{3})#ie","",json_encode($name)));
    if(!$return){
        return $this->jsonName($return);
    }
    return $str;
}

总结:

个人业务原因采取了过滤字符方案,并且生效了,其实两种方法都挺方便易懂的,主要是看自己需求,如果项目中太多需要修改的地方,那么修改mysql编码方案也不失为一种好方法,当然要注意小心操作。

PS:记录一下更改数据库格式的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show full columns from blog_member;
-- show variables like '%char%';
-- ALTER TABLE blog_employee CHANGE nickname nickname VARCHAR(255)  CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- ALTER TABLE blog_employee CHANGE name name VARCHAR(255)  CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE blog_member CHANGE nickname nickname VARCHAR(255)  CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- ALTER TABLE blog_member CHANGE nickname nickname VARCHAR(255)  CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- ALTER TABLE blog_member nickname CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- set global innodb_file_format = BARRACUDA;
-- set global innodb_large_prefix = ON;
-- show variables like 'character%';
-- show variables like 'collation_%';
-- show variables like 'innodb_large_prefix';
-- show variables like 'innodb_file_format';

最后修改mysql配置文件并且重启才真正生效

my.cnf一般在etc/mysql/my.cnf位置。找到后请在以下三部分里添加如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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'
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农编程进阶笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mysql ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value
chuchur
2022/10/25
1.6K0
mysql 插入 emoji报错1366
最近做项目需要用到emoji表情,好不容易把前端搞定,提交数据到后台发现无法插入数据库,异常提示如下:
kirin
2021/04/16
1.8K1
MySQL 数据库保存 Emoji 表情及特殊符号
MySQL在5.5.3版本之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。其实,utf8mb4是utf8的超集。
程序猿的栖息地
2022/04/29
3K0
MySQL 数据库保存 Emoji 表情及特殊符号
MySQL字符集utf8mb4
Unicode是编码字符集,而UTF-8就是字符编码,即Unicode规则字库的一种实现形式。随着互联网的发展,对同一字库集的要求越来越迫切,Unicode标准也就自然而然的出现。它几乎涵盖了各个国家语言可能出现的符号和文字,并将为他们编号。
HLee
2021/07/23
1.6K0
MySQL字符集utf8mb4
Mysql存储微信Emoji表情问题
上面错误意思是 mysql 数据库中 name 字段插入不正确的字符串值。name 字段是记录微信呢称,设计之出没有考虑到微信呢称中使用 Emoji 表情,导致写入数据失败。
YP小站
2020/06/04
2.2K0
问题分析:什么导致mysql乱码?
之前出现过一些因为mysql编码使用不正确,导致出现页面乱码的bug,比如utf8不支持Emoji表情等等。这里对乱码问题做下分析,沉淀下来避免再次出现
王昂
2019/11/16
2.3K0
问题分析:什么导致mysql乱码?
MySQL utf8mb4 编码 : 支持emoji表情 (字段或表)
一般我们数据编码格式默认设置为utf-8, 但是utf-8并不支持表情,而表情需要utf8mb4字段(向下兼容utf-8)
一个会写诗的程序员
2020/04/16
4.2K0
MySQL唯一索引重复插入数据解决方案总结
在日常开发中,我们会经常遇到某一张表中某列或者多列的值是唯一的,不能重复插入同一个值。遇到这样的设计,我们一般会设置一个unique的索引。也就是在要求值不能是重复的列或者多列上添加一个唯一索引。例如,会执行这一条SQL语句:
兔云小新LM
2021/07/18
6K0
MySQL唯一索引重复插入数据解决方案总结
Java之mysql/Java服务端对emoji的支持
如果UTF8字符集且是Java服务器的话,当存储含有emoji表情时,会抛出类似如下异常:
IT工作者
2022/03/29
3510
MySQL插入Emoji表情
今天在设计开源项目的反馈信息表时遇到了emoji表情插入失败的问题,网上找了很多解决方案,答案五花八门,没找到好使的。
崔笑颜
2020/12/03
4.5K0
MySQL插入Emoji表情
mysql为utf8mb4存储emoji表情
1. MySQL的版本 utf8mb4的最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本。 2.修改MySQL配置文件 修改mysql配置文件my.cnf(windows为my.ini)  my.cnf一般在etc/mysql/my.cnf位置。找到后请在以下三部分里添加如下内容:  [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' 3. 重启数据库,检查变量 SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%'; Variable_name Value character_set_client utf8mb4 character_set_connection utf8mb4 character_set_database utf8mb4 character_set_filesystem binary character_set_results utf8mb4 character_set_server utf8mb4 character_set_system utf8 collation_connection utf8mb4_unicode_ci collation_database utf8mb4_unicode_ci collation_server utf8mb4_unicode_ci collation_connection 、collation_database 、collation_server是什么没关系。 但必须保证这几个变量必须是utf8mb4。 系统变量 描述 character_set_client (客户端来源数据使用的字符集) character_set_connection (连接层字符集) character_set_database (当前选中数据库的默认字符集) character_set_results (查询结果字符集) character_set_server (默认的内部操作字符集) ———————————————————— 到这里为止,上面都是服务器环境方面配置调整 ———————————————————— 4. 将数据库、表、列三个同时也转换成utf8mb4 更改数据库编码:ALTER DATAbase alfredsw CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 更改表编码:ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;  更改列编码:在需要存储的字段进行更改 [注意:数据库和表编码可以不更改,不影响使用] 5、服务器连接排序规则:utf8mb4_general_ci 6、最关键的,thinkphp5的配置要修改 'charset' =>'utf8mb4',// 数据库编码默认采用utf8
零云
2023/07/24
3680
MySQL修改字符集utf8mb4
MySQL在 5.5.3 之后增加了 utf8mb4 字符编码,mb4即 most bytes 4。简单说 utf8mb4 是 utf8 的超集并完全兼容utf8,能够用四个字节存储更多的字符。
MySQL轻松学
2020/06/11
17.7K0
不可忽视的MySQL字符集
墨墨导读:字符集是一组符号和编码。collation是一组用于比较字符集中的字符的规则。
数据和云
2021/03/30
2.2K0
不可忽视的MySQL字符集
MySQL编码引发的两个问题 原
先讲一下写该文章的原因,首先,工作中又遇到一条很熟悉的MySQL报错信息 Cause: java.sql.SQLException: Incorrect string value:Cause: java.sql.SQLException: Incorrect string value… (emoji表情存储导致),原因是MySQL的字符集导致的;其次,因为一直听说数据库变更可能锁表,但是一直不知道到底哪些操作会导致锁表。所以今天对相关知识做一个系统的整理。
阿dai学长
2019/05/14
2.9K0
MySQL编码引发的两个问题
                                                                            原
mysql常用命令
原文链接:https://www.t-io.org/1159243043644252160
talent-tan
2019/08/08
6480
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
首先,您需要具有适当的权限才能在MySQL中创建数据库。通常,这意味着您需要以具有创建数据库权限的用户身份登录到MySQL服务器。
红目香薰
2023/12/01
7380
springboot项目里面,连接数据库之后,查询出来的中文乱码(亲测有效)
打开我们的数据库的安装路径 因为我的mysql数据库是解压版本,所以只有这个配置
一写代码就开心
2022/05/09
5430
springboot项目里面,连接数据库之后,查询出来的中文乱码(亲测有效)
django,mysql存储emoji表情,utf8mb4
今天在做后台的时候发现一个错误: Incorrect string value: '\xF0\x9F\x90\xA8' for column 'signature' at row 1 发现是参数里面是一个iOS的表情,也就是系统自带的emoji表情。 后台用的是django 1.6,数据库用的是Mysql 5.5.22,缓存用的是redis。 上网了解了一下emoji表情,原来一般的字符包括中文用utf8的话,mysql是用3个字节去存储的,而emoji表情要用4个字节的utf8,也就是utf8mb4格式
Bob.Chen
2018/05/02
2.2K0
MariaDB修改编码格式 转
2、登录MySQL,使用 show variables like ‘character%’;
双面人
2019/04/10
2.2K0
MariaDB修改编码格式
                                                                            转
centos配置docker环境
yum默认链接的还是国外的镜像,速度相对不理想,配置成国内的镜像会快很多,这里以阿里镜像为例进行配置:
霍格沃兹测试开发Muller老师
2022/12/16
8950
相关推荐
Mysql ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验