MySQL的文本(varchar,text),对emoji表情符号不是很好的支持,在5.5之前的版本,varchar和text都是不支持存储emoji表情符号的(即使是utf8)的编码模式。原因在于mysql的utf8是规定了每一个utf8字符按照3个字节来存储,而一个emoji(最初来自苹果系统,现在流行于各种移动操作系统)却需要4个字节来存储。这就导致了如果强制将emoji存储到varchar,text等字段上的时候,mysql会抛出异常,认为emoji是个不正确的文本。

ERROR 1366 (HY000): Incorrect string value: ‘\xF0\x9F\x91\xBD\xF0\x9F…’ for column ‘name’ at row 31

其原因是utf8是不定长的,根据左侧位来决定占用了几个字节。emoji表情是4个字节,而MySQL的utf8编码最多支持3个字节,所以插入会出错。

为了解决这个问题,MySQL 5.5开始支持utf8mb4,utf8mb4可支持4个字节utf编码,从而支持更大的字符集,并且兼容utf8。简单来说,utf8mb4是utf8的超集。

要让MySQL开启utf8mb4支持,需要一些额外的设置。

检查MySQL Server版本

utf8mb4 支持需要MySQL Server v5.5.3+

设置

设置表的CHARSET

创建表的时候指定CHARSET为utf8mb4

CREATE TABLE IF NOT EXISTS table_name (

...

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

修改数据库字符集

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

修改表的字符集

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; #将TABLE_NAME替换成你的表名

ALTER TABLE table_name modify name text charset utf8mb4;

修改字段的字符集

ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

修改MySQL配置文件

修改my.cnf的内容

[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 variables like '%sql_mode%';

+---------------+--------------------------------------------+

| Variable_name | Value                                      |

+---------------+--------------------------------------------+

| sql_mode      | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |

+---------------+--------------------------------------------+

1 row in set (0.00 sec)

如果是以上结果恭喜你是存储不了的

去设置这个sql_mod模式(注意这里修改看之后要退出控制台要不然还是看不到效果的,而且这个配置写my.cnf重启服务器是不生效的)

mysql> show variables like '%sql_mode%';

+---------------+--------------------------------------------+

| Variable_name | Value                                      |

+---------------+--------------------------------------------+

| sql_mode      | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |

+---------------+--------------------------------------------+

1 row in set (0.00 sec)

指定MySQL连接时的charset

以mysql-python为例

MySQLdb.connect(

host=config.DB_HOST,

port=config.DB_PORT,

user=config.DB_USR,

passwd=config.DB_PSW,

db=config.DB_NAME,

use_unicode=True,

charset="utf8mb4")

参考文档

http://en.wikipedia.org/wiki/Mapping_of_Unicode_charactershttp://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.htmlhttps://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4http://blog.caoyue.me/post/support-emoji-in-mysql

mysql可以用表情符号_让MySQL支持emoji表情符号存储相关推荐

  1. mysql utf8 表情符号_MySQLutf8mb4字符集:支持emoji表情符号

    MySQL utf8mb4 字符集:支持 emoji 表情符号 首页 → 数据库技术 背景: 阅读新闻 MySQL utf8mb4 字符集:支持 emoji 表情符号 [日期:2013-05-16] ...

  2. mysql 中有什么命令_常用mysql命令大全

    常用的MySQL命令大全 连接MySQL格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命 ...

  3. mysql数据库建仓范式_存mysql个数

    MySQL学习笔记之数据类型详解 注:以下内容针对MySQL5.0及以上版本 MySQL的数据类型非常多,选择正确的数据类型对于获得高性能至关重要,本文是我结合网上看到的一些blog加上<高性能 ...

  4. mysql 集群操作系统_高性能MySQL集群详解(二)

    一.通过Keepalived搭建MySQL双主模式的高可用集群系统 1.MySQL Replication介绍: MySQL Replication是MySQL自身提供的一个主从复制功能,其实也就是一 ...

  5. mysql主从数据库含义_(转)Mysql数据库主从心得整理

    管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验所写,整理了一下,分享给各位同行,希望对 ...

  6. mysql 基于gtid复制_深入MySQL复制(二):基于GTID复制

    相比传统的MySQL复制,gtid复制无论是配置还是维护都要轻松的多.本文对gtid复制稍作介绍. 1.gtid基本概念 传统的基于binlog position复制的方式有个严重的缺点:如果slav ...

  7. 深入浅出mysql唐汉名_深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明 -- 存储引擎 - 数据类型 - 字符集和校验规则 -...

    create schema deepInMySql; use deepInMySql; -- 查看当前默认存储引擎 show variables like '%table_type%'; -- 查看当 ...

  8. mysql 更改数据库编码_更改MySQL数据库的编码为utf8mb4

    utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符.如果直接往采用utf-8编码的数据库中插入表情数据,Java程 ...

  9. mysql 子查询概念_聊聊MySQL的子查询

    1. 背景 在之前介绍MySQL执行计划的博文中已经谈及了一些关于子查询相关的执行计划与优化.本文将重点介绍MySQL中与子查询相关的内容,设计子查询优化策略,包含半连接子查询的优化与非半连接子查询的 ...

  10. mysql数据库断开连接_解决mysql服务器在无操作超时主动断开连接的情况

    我们在使用mysql服务的时候,正常情况下,mysql的设置的timeout是8个小时(28800秒),也就是说,如果一个连接8个小时都没有操作,那么mysql会主动的断开连接,当这个连接再次尝试查询 ...

最新文章

  1. C 内存free()出错
  2. learning中的数学
  3. 判断一个字符串是否全部不相同
  4. 大图详解负载神器 LVS、Nginx及HAProxy工作原理
  5. Kafka消息序列化和反序列化(下)
  6. 2017浙江省赛 B - Problem Preparation ZOJ - 3959
  7. Leetcode--7. 整数反转
  8. 修复IE下列表 li 的阶梯Bug
  9. Linux 系统之Sysvinit
  10. 【产品体验】echo回声
  11. 64% 的企业未实现智能化,5 成公司算法工程师团队规模小于 10人,AI 工程师的机遇在哪里?...
  12. python抓取直播源 并更新_虎牙直播源Python爬虫
  13. 站长网管工具有哪些用处?
  14. 在RStudio里面部署Python
  15. 使用john进行密码爆破
  16. Python-illegal multibyte sequence
  17. bootstrap typeahead实现模糊查询功能
  18. 一个不错的java机器学习项目JSAT
  19. 工行银企互联(NC模式)中间件开发模式
  20. Stlink固件更新问题“ST-Link is not in the dfu mode Please restart it“的解决方法

热门文章

  1. 前端快速切图:PS切图常用快捷键、精准测量尺寸
  2. Python的三大神器,你知道是哪三大吗?史上最详细的入门教程!
  3. mysql导致的502_ab压测过程中出现502及操作数据库失败
  4. AWK中BEGIN和END的使用理解
  5. 按颜色分类:蓝紫色系(Purple Blue)
  6. 学会用CUPS管理打印机
  7. 视频光端机怎么连接 视频光端机接法图解
  8. 高性能游戏计算机cpu的选择,玩游戏的电脑cpu选哪个
  9. 大数据中心建设一哄而上 人才技术制约产业发展
  10. SQL : INSTEAD OF触发器的工作过程