通过node.js保存emoji到mysql

2017-07-17 14:48:15

什么是emoji


emoji在诞生之初有多种标准,所以早期兼容性是个问题。但是现在已经标准化了,是unicode的一部分。可以认为,跟字母、汉字一样,emoji就是unicode中一个普通的字符

但是emoji通过utf-8编码后,每个字符占4个字节,属于宽字符。而老版本的mysql只支持一个字符占3个字节,所以老版本的mysql是无法存储emoji的。新版本的mysql增加了字符集utf8mb4,可以支持单字符最多占4个字节。utf8mb4是utf8的超集,可以无需修改地支持原来的utf8字符

要让mysql存储emoji,需要满足2个条件:

1、mysql的charset设置为utf8mb4

2、客户端连接mysql的驱动,也需要设置为utf8mb4


比如:

var pool = mysql.createPool({
  connectionLimit: 10,
  host: "122.42.7.135",
  user: "root",
  password: "D@",
  database: "ling",
  useConnectionPooling: true,
  charset:"utf8mb4",
});

mysql设置charset为utf8mb4

1、需要设置数据库实例的character_set_server参数为UTF8mb4

2、设置数据库字符集为utf8mb4

3、设置表的字符集为UTF8mb4

4、如果不设置表的字符集为UTF8mb4,也可以设置单独某个列的字符集为UTF8mb4

对于新开发的应用,建议都把数据库的字符集设置为UTF8mb4,以免后期迁移的麻烦

客户端连接mysql驱动

以node.js为例,需要设置charset参数为UTF8MB4_GENERAL_CI,全大写

其他平台如java,php,也需要做类似的配置

至于最终呈现的地方,包括html页面、iOS客户端,经实验发现,不需要特殊的设置,自然可以输入和展示emoji字符

不支持emoji的客户端

有些客户端不支持emoji,或者支持得不充分。我实验了一下:

navicat for mysql完全无法正确展示已经入库的emoji字符

webstorm也无法完全正确展示,部分emoji字符被截断而展示不全

CocoaRestClient可以完美展示,借助复制粘贴,也可以输入emoji字符


  • 2019-12-10 21:14:11

    axios文件上传功能+formData

    在项目中使用axios上传文件,记得new一个纯净的axios或者考虑用ajax请求。因为axios在项目估计已经用了全局配置请求头等信息,这里的配置可能被全局请求头拦截,导致请求失败。 2.1构造formData 作者:exmexm 链接:https://www.jianshu.com/p/9c708a47d8a5 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 2019-12-11 16:04:15

    CSS中的 “var()” 和 “:root”

    var() var()函数可以代替元素中任何属性中的值的任何部分。var()函数不能作为属性名、选择器或者其他除了属性值之外的值。(这样做通常会产生无效的语法或者一个没有关联到变量的值。)

  • 2019-12-11 16:18:51

    npm发布vue组件

    开发之前先看看官网的 开发规范 我们开发的之后期望的结果是支持 import、require 或者直接使用 script 标签的形式引入,就像这样

  • 2019-12-11 16:21:00

    .vue文件 加scoped 样式不起作用

    在vue组件中,为了使样式私有化(模块化),不对全局造成污染,在style标签上添加scoped属性,以表示它只属于当下的模块。但是要慎用,因为在我们需要修改公共组件(第三方库或者项目中定制的组件)的样式的时候,scoped会造成很多困难,组要增加额外的复杂度。

  • 2019-12-11 16:22:04

    Vue中的scoped和scoped穿透,scoped原理

    在Vue文件中的style标签上有一个特殊的属性,scoped。当一个style标签拥有scoped属性时候,它的css样式只能用于当前的Vue组件,可以使组件的样式不相互污染。如果一个项目的所有style标签都加上了scoped属性,相当于实现了样式的模块化。

  • 2019-12-12 14:19:32

    laravel自定义分页LengthAwarePaginator

    有时候我们使用larave提供的后台分页数据库查询,有时候限制太多,我们需要自己定制分页功能。 下面是我给大家一个例子,我们可以根据例子,制作自己的分页功能。