MySQL要存储emoji表情,由于emoji表情的unicode编码占用4个字节,而Mysql的utf8编码最多只能存储3个字节,

所以保存到数据库时会产生异常,一般两种解决方法,

方法一

修改数据库的字符集为utf8mb4,MySQL支持 emoji 表情的最低版本为5.5.3,否则不支持字符集utf8mb4。

# 修改数据库:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# 修改表:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 修改表字段:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  

修改mysql的配置文件,一般在/etc/my.cnf,最重要的修改是 [mysqld] 的配置添加

[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> 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 |
+--------------------------+--------------------+
mysql> SHOW FULL FIELDS FROM tbl_user;

注意程序连接数据库时,是否支持该字符集

方法二

如果有些情况修改数据库配置的方式不可执行,则只能从程序段动手,原则就是转码保存再转码显示

    /**把用户输入的文本转义(主要针对特殊符号和emoji表情)*/public function userTextEncode($str){if(!is_string($str))return $str;if(!$str || $str=='undefined')return '';$text = json_encode($str); //暴露出unicode$text = preg_replace_callback("/(\\\u[ed][0-9a-f]{3})/i",function($str){return addslashes($str[0]);},$text);//将emoji的unicode留下,其他不动,这里的正则比原答案增加了d,因为我发现我很多emoji实际上是\ud开头的,反而暂时没发现有\ue开头。return json_decode($text);}/**解码上面的转义*/public function userTextDecode($str){$text = json_encode($str); //暴露出unicode$text = preg_replace_callback('/\\\\\\\\/i',function($str){return '\\';},$text); //将两条斜杠变成一条,其他不动return json_decode($text);}

即将emoji表情的unicode编码保存到数据库中,待取出时候再做转义回,使用上面的方法需要注意

1)中文字符串经过json_encode后生成的json字符串,是用''括起来的,例如'"\ud83c\udf89 \ud83d\udcb0"',尤其

是做测试用作参数时候,如果没有单引号直接json_decode是返回null的;

2)json_encode的字符串中包含转义字符“ \ ”时,编码后会生成两个“ \ ”,所以方法 userTextDecode 中正则表达是才用

八个“ \ ”来匹配;

转载于:https://www.cnblogs.com/oneyear/p/8469872.html

微信昵称包含emoji表情,保存异常相关推荐

  1. 微信昵称乱码 mysql_微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案...

    微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案如下: 问题产生原因:由于数据库及属性一致设为utf8,而utf8只支持1-3个字节.当用户昵称为emoji表情时,获取用户基本信 ...

  2. 微信小程序web-view嵌入h5———微信名包含emoji表情,导致数据无法存入数据库

    由于部分用户微信名包含emoji表情导致无法存入数据库. 报错为:[2019-08-27 16:21:12] [ERROR] [org.hibernate.engine.jdbc.spi.SqlExc ...

  3. java emoji表情 乱码_java 微信昵称带有emoji 表情乱码

    问题描述: ipone5s中昵称输入"emoji表情",保存数据库有问题. 运行环境: Java.Tomcat.mysql.Linux(我的Linux下为乱码,这个是linux问题 ...

  4. 处理微信昵称的emoji表情

    2019独角兽企业重金招聘Python工程师标准>>> 一.转移emoji存储到mysql数据库 function emoji_encode($nickname){$strEncod ...

  5. mysql无法存储微表情、微信昵称包含微表情无法存储数据库

    网上搜到了很多关于这个问题的解决办法,但是都没解决我的问题.我的mysql用的是windows版mysql-server 5.7 首先我按照基本方法,修改my.inf配置文件,添加下面配置: [mys ...

  6. java ipone 微信昵称emoji表情保存失败 无法存入数据库

    问题描述:ipone5s中昵称输入"emoji 表情",保存数据库有问题. 运行环境:Java.Tomcat.mysql.Linux(我的Linux下为乱码,这个是linux问题) ...

  7. mysql 过滤微信昵称表情_PHP正则过滤处理微信昵称中emoji字符的方法

    本文实例讲述了PHP正则过滤处理微信昵称中emoji字符的方法.分享给大家供大家参考,具体如下: 今天刚做了一个微信应用,在获取微信昵称的过程中报错了,经查原因是微信昵称中包含emoji字符,在写入数 ...

  8. php过滤微信昵称的emoji表情符号,emoji表情过滤处理

    微信消息接口开发时,消息体包含emoji表情时,不考虑存储emoji表情,可使用preg_replace函数过滤替换,PHP如下: ... $content=json_decode(preg_repl ...

  9. PHP处理微信中带Emoji表情的消息发送和接收(Unicode字符转码编码)

    在进行微信公众号开发者接入的时候,与用户的对话互动中,涉及到的文本信息不仅仅是文字那么简单,其中可能还会包含着各种表情字符,例如「emoji表情」. 百科:  Emoji 由于微信接口中对于emoji ...

最新文章

  1. oracle运行企业管理器,如何打开Oracle 10g的企业管理器(Enterprise Manager)?
  2. java让用户输入3个随机数_3-流程控制、随机数、键盘输入
  3. LeetCode 961. 重复 N 次的元素
  4. manjaro 安装tensorflow 【CPU版本】 环境
  5. 使用Navicat管理MySQL用户
  6. linux 中断服务程序,request_irq() linux注册中断服务
  7. Do 32-bit build only with XCode 5.1
  8. checking for tgetent()... configure: error: NOT FOUND!
  9. OpenDaylight Hydrogen版本应用SampleTap研究(一)
  10. 纪念DOS下的经典软件
  11. LSM6DS3 gyro数据设置
  12. 基于zynq的千兆网udp项目_米联客 ZYNQ/SOC 精品教程 S05-CH03-UDP千兆光通信
  13. 网易云音乐黑胶会员免费领取
  14. OpenCV彩色图像读取
  15. 复杂交通流对混合交通的影响研究多向车流量分析
  16. 获取视频网站上视频的缩略图以及其他信息
  17. ACC自适应巡航控制系统介绍
  18. arm sshd交叉编译及部署
  19. Proxmox VE 7.2 网卡直通
  20. PMT函数是怎么使用的?

热门文章

  1. 的列数 获取mysql_阿里面试:MySQL如何设计索引更高效?
  2. cent os7 安装kafka_2.13-2.6.0
  3. PowerDesigner16.5汉化破解版安装教程(含安装文件、汉化包、破解文件)
  4. SQL中Convert()函数的使用方法
  5. lepus监控oracle数据库_实用脚本一键监控oracle数据库索引使用状况
  6. python编程从入门到实战的16堂课_好评如潮,百万Python程序员的「案头必备书」,终于出配套习题解答了!...
  7. 虚拟文件系统模拟_容器和虚拟机到底有啥区别?
  8. 系统学习深度学习(三十九)--基于模型的强化学习与Dyna算法框架
  9. c语言计算总分和平均分float,用C语言编程平均分数
  10. PAT (Basic Level) Practice1018 锤子剪刀布