问题减少使用erlang将一些特殊的字符串存入MySQL时,无法读取出来。经查看,这些字符串的二进制格式如下:<<240,159,152,134,240,159,152,144>>查看二进制unicode是什么?14>unicode:characters_to_list(<<240,159,152,134,240,159,152,144>>).[128518,128528]118>erlang:inte).%%看十六进制的“1F606”16>erlang:integer_to_list(128528,16)."1F610"显然,1F606和1F610超出了普通unicode字符串0000-FFFF的表达范围。这里参考:http://cenalulu.github.io/linux/character-encoding/1F606和1F610分别代表什么?根据unicode官网的描述,这是一种表情符号(emoji),具体显示形式与厂商有关。MySQL上存储失败的原因目前,大多数MySQL存储都是以utf8存储的。注意,MySQL的utf8与我们所说的传统utf8有点不同。MySQL的utf8编码规定最多只能有3个字节,而emoji的unicode已经超过了3个字节,所以MySQL的utf8无法识别存储emoji。为此,可以参考MySQL中关于unicode支持的资料,从中可以知道MySQL在5.5之后开始支持utf8mb4。这种编码支持1到4个字节,这种编码可以表示emoji。此外,utf8mb4向后兼容utf8。unicode和utf8的详细介绍请查看:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html解决方法将MySQL中对应字段改为utf8mb4编码:ALTERTABLEt1DEFAULTCARACTERSETutf8mb4,MODIFYcol1CHAR(10)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ciNOTNULL,MODIFYcol2CHAR(10)CHARACTERSETutf8mb4COLLATEutf8mb4_binNOTNULL;参考:http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-upgrading.html将连接库的连接编码改成utf8mb4连接erlang取下库emysql为例:emysql:add_pool(pool,[{size,1},{user,"user"},{password,"password"},{host,"host"},{port,3306},{encoding,utf8mb4}]).%%或emysql:add_pool(pool,1,"user","password","host",3306,undefined,utf8mb4)。为了方便建表,可以修改my.cnf:#servercharactersset[mysql]default-character-set=utf8mb4[mysqld]character-set-server=utf8mb4
