一般Mysql表设计时,都是用UTF8字符集的。把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串。这是怎么回事呢?

原来是因为Mysql的utf8字符集是3字节的,而emoji是4字节,这样整个昵称就无法存储了。这要怎么办呢


1、使用utf8mb4字符集

1、mysql的版本必须为v5.5.3或更高 2、把数据库的编码改成utf8mb4 -- UTF-8 Unicode 3、然后需要存储emoji表情的字段选择utf8mb4_general_ci 4、数据库连接也需要改为utf8mb4 这种方式可能带来的问题: 存储:在数据表中,对于变长的字段(如VARCHAR2,TEXT),utf8mb4最大可存储的字符可能少于utf8系列的collation;    在索引中,对于文本类型的字段,utf8mb4可索引的字符少于utf8系列的collations。如InnoDB的索引最多使用767字节。 如果使用utf8mb4,每一个字符都会预留4字节做索引,而utf8则预留3字节。故此前者是191个字符,后者是255个字符。 性能:由于以上原因,加上字符集大,utf8mb4的性能可能比utf8系列的collations低,    可以参考stackoverfolow上的一个测试结果:http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci,    差异不是特别大。 运维:如果一个大的环境内,如果其他的数据库都是utf8模式,把其中某个库设置为utf8mb4模式,在后续交接运维可能会造成问题,遗留下坑。 上下游:数据库支持unicode的emoji存储,上下游不一定支持。比如mysql客户端驱动(低版本的jdbc就不行)可能不支持utf8mb4,或者DDL的中间件不支持utf8mb4。    web端处理utf8mb4字符展示,这些都有可能影响emoji的存储活着展示。
2、使用base64编码

这种方法是可以,但是旧数据如果没有经过encode操作,取数据的时候如果统一进行decode的话,旧数据会丢失的。

3、过滤emoji表情

支持emoji表情是个麻烦的东西,有时即使能存储,也不一定能完美显示。可能会出现因emoji图片不够全而出现无法显示的情况。并且有些客户端可能还需要使用第三方类库,需要大量的emoji图片等。 因此,如果emoji不是非要不可,我们可以把带有emoji内容的数据过滤掉,达到不影响其他数据的存储。
// 过滤掉emoji表情
function filterEmoji($str)
{
$str = preg_replace_callback('/./u',function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
},$str);
return $str;
}

  

4、文本转义emoji表情
/**
把用户输入的文本转义(主要针对特殊符号和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表情

PHP如何处理emoji表情存入utf8的数据库的更多相关文章

  1. php + mysql 存入表情 【如何转义emoji表情,让它可以存入utf8的数据库】

    方法1:base_encode64 这种方法是可以,但是旧数据没有经过encode操作,取数据的时候如果统一进行decode的话,旧数据会丢失的. 1 方法2:urlencode 这个似乎可以,对没有 ...

  2. 解决 emoji表情存入数据库为' ??? '

    今天把mysql切换为mariaDB,这是题外话 主要是emoji标签存入数据库会发现出现三个???的问题 页面上也显示不出来,解决办法只要把内容从数据库里拿出来的时候解码即可 for (Feedba ...

  3. 前端如何处理emoji表情

    这段时间在做移动端的开发, 有一个功能就是发表评论,其实这个功能本身是比较简单的, 但是在提测是的时候QA给哦提了一个bug,说输入手机自带的emoji表情发送失败了.我就奇怪了,emoji表情也是文 ...

  4. 如何将emoji表情存放到mysql数据库中

    昨晚在爬取猫眼电影评论时在将评论信息插入到数据库中时出现问题,总是在插入一条数据时就会报错: 看着应该时字符编码的问题,比如新建的数据库新建的表,默认字符编码是:Latin1, 这种编码是无法插入中文 ...

  5. 特殊字符,如Emoji表情Base64存储到数据库

    有些特殊字符,如Emoji,存储到oracle数据库就会变成乱码,解决方案就是Base64转码后存储到数据库,取出后再解码传输,经过验证是可以的. 编码存储,接收参数转json再.ToString() ...

  6. 【记录】微信emoji表情存入数据库

    最近遇到一个问题,在微信授权获取用户信息的时候,由于微信昵称(nickName)是表情,无法存入数据库. 查其原因,原来是因为数据库的编码格式不正确,我的是utf-8 改成utf8mb4就可以了. 其 ...

  7. Mysql存储Emoji表情[为何utf8不能存储以及如何使Mysql能够存储Emoji表情]

    https://segmentfault.com/a/1190000008533577

  8. 让MySql支持Emoji表情(MySQL中4字节utf8字符保存方法)

    手机端插入Emoji表情,保存到数据库时报错: Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84' ...

  9. 数据库需要支持emoji表情

    由于需要实现emoji表情评论的功能,所以数据库需要支持emoji表情的存储,根据查询的资料最终实现了该功能,现将实现的过程以及过程遇到的一些问题记录下来,供大家参考和交流. mysql的utf8编码 ...

随机推荐

  1. Django中ORM介绍

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  2. 从redis中取值如果不存在设置值,使用Redisson分布式锁【我】

    用到的jar包: <!-- Redis客户端 --> <dependency> <groupId>redis.clients</groupId> < ...

  3. Jmeter 逻辑控制器总结

    本文主要总结Jmeter的逻辑控制器: 逻辑控制器下一共16个控制器: 1.foreach controller循环控制器 定义变量数组,按数组遍历循环   2.simple controller 简 ...

  4. 2. Java内存区域

    Java 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区:另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存 2.1 程序计数器 程序计数器(Pr ...

  5. sass补充(2019-3-9)

    @each 输出 格式: @each $var in value,value1,value2{ } eg: @each $var1 in 100px,200px,300px{ .box{ width: ...

  6. DevExpress winform 友好皮肤

    DevExpress设置默认皮肤及各种皮肤样式   DevExpress设置默认皮肤及各种皮肤样式 设置默认皮肤代码: 在程序入口Program.cs里添加如下代码 引用using DevExpres ...

  7. Apache Spark 章节1

    作者:jiangzz 电话:15652034180 微信:jiangzz_wx 微信公众账号:jiangzz_wy 背景介绍 Spark是一个快如闪电的统一分析引擎(计算框架)用于大规模数据集的处理. ...

  8. 20164305 徐广皓 Exp2 后门原理与实践

    实验内容 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 (3)使用MSF meterpreter(或其他软件)生成可执行文件, ...

  9. linux --xampp 配置多个网站

    我们想要在本地安装两个测试域名,www.abc.tld, www.xyz.tld, 分别指向到 htdoc 目录下的 abc.tld 和 xyz.tld 文件夹下.tld 是顶级域名 the top ...

  10. 关于SVN报错 svn: E170013 E125006: contains invalid filesystem format option 'addressing logical'

    在使用svn的时候,遇到了这样的一个问题 首先我使用TortoiseSVN 右键创建的repository. 之后用IDEA,配置了1.9.4版本的SVN,去commit访问这个仓库 结果出现了以下的 ...