通过node.js保存emoji到mysql

2017-07-17 14:48:20

什么是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字符


  • 2017-08-15 17:44:21

    glob 介绍

    glob 最早是出现在类Unix系统的命令行中, 是用来匹配文件路径的。比如,lib/**/*.js 匹配 lib 目录下所有的 js 文件。 除了在命令行中,我们在程序中也会有匹配文件路径的需求。于是,很多编程语言有了对 glob 的实现 ,如 Python 中的 glob 模块; php 中的 glob 方法。

  • 2017-08-16 08:45:41

    nodejs中流(stream)的理解

    这种方式是把文件内容全部读入内存,然后再写入文件,对于小型的文本文件,这没有多大问题,比如grunt-file-copy就是这样实现的。但是对于体积较大的二进制文件,比如音频、视频文件,动辄几个GB大小,如果使用这种方法,很容易使内存“爆仓”。理想的方法应该是读一部分,写一部分,不管文件有多大,只要时间允许,总会处理完成,这里就需要用到流的概念。

  • 2017-08-17 17:58:48

    /usr、/home、/bin、/dev、/var、/etc中主要存放什么文件

    /usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含: /usr/X11R6 存放X window的目录 /usr/bin 众多的应用程序 /usr/sbin 超级用户的一些管理程序 /usr/doc linux文档 /usr/include linux下开发和编译应用程序所需要的头文件 /usr/lib 常用的动态链接库和软件包的配置文件 /usr/man 帮助文档 /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的库

  • 2017-08-17 19:26:00

    mysql安装目录、配置文件存放位置

    linux系统下,如何知道mysql使用的配置文件到底是哪个呢?linux自带的mysql的安装目录又是什么呢?数据存放在什么目录下?