MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

二、内容描述

那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

三、问题根源

最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。

utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。

Mysql 中的 utf8 为什么只支持持最长三个字节的 UTF-8字符呢?我想了一下,可能是因为 Mysql 刚开始开发那会,Unicode 还没有辅助平面这一说呢。那时候,Unicode 委员会还做着 “65535 个字符足够全世界用了”的美梦。Mysql 中的字符串长度算的是字符数而非字节数,对于 CHAR 数据类型来说,需要为字符串保留足够的长。当使用 utf8 字符集时,需要保留的长度就是 utf8 最长字符长度乘以字符串长度,所以这里理所当然的限制了 utf8 最大长度为 3,比如 CHAR(100) Mysql 会保留 300字节长度。至于后续的版本为什么不对 4 字节长度的 UTF-8 字符提供支持,我想一个是为了向后兼容性的考虑,还有就是基本多文种平面之外的字符确实很少用到。

要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持(查看版本: select version();)。我觉得,为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8. 对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR。

更改数据库的编码为utf8mb4:

1. MySQL的版本

utf8mb4的最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本。

2. MySQL驱动

5.1.34可用,最低不能低于5.1.13

3.修改MySQL配置文件

修改mysql配置文件my.cnf(windows为my.ini)
my.cnf一般在etc/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'

4. 重启数据库,检查变量

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

collation_connection 、collation_database 、collation_server是什么没关系。

但必须保证

系统变量 描述
character_set_client (客户端来源数据使用的字符集)
character_set_connection (连接层字符集)
character_set_database (当前选中数据库的默认字符集)
character_set_results (查询结果字符集)
character_set_server (默认的内部操作字符集)

这几个变量必须是utf8mb4。

5. 数据库连接的配置

数据库连接参数中:
characterEncoding=utf8会被自动识别为utf8mb4,也可以不加这个参数,会自动检测。
而autoReconnect=true是必须加上的。

6. 将数据库和已经建好的表也转换成utf8mb4

更改数据库编码:ALTER DATABASE caitu99 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ;

更改表编码:ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ;
如有必要,还可以更改列的编码

一、简介MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。二、内容描述那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql
本文实例分析了 mysql 存储 emoji 表情 报错的处理 方法 。分享给大家供大家参考,具体如下: utf-8编码可能2个 字节 、3个 字节 、4个 字节 字符 ,但是 MySQL utf8 编码只 支持 3 字节 的数据,而移动端的 表情 数据是4个 字节 字符 。如果直接往采用utf-8编码的数据库 插入 表情 数据,Java程序 将报SQL异常: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94’ for column ‘name’ at row 1 at com. mysql .jdbc.SQLError.createSQLException(SQL
之前开发时需要在数据库 保存 emoji 表情 符号,在数据库将表的 字符 集设置为 utf8 mb4,仍然无法 保存 表情 ,提示下面的报错 :java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94'。 最后发现是数据库连接的问题,本想在数据库链接参数 添加characterEncoding= utf8 mb4,但是并不生效。最后是在每次执行 保存 emoji 表情 的语句之前,执行SET NAMES utf8 mb4。后面又发现可以在建立数据库链接的初始化
由于需要实现 emoji 表情 评论的功能,所以数据库需要 支持 emoji 表情 的存储,根据查询的资料最终实现了该功能,现将实现的过程以及过程遇到的一些问题记录下来,供大家参考和交流。 mysql utf8 编码的一个 字符 最多3个 字节 ,但是一个 emoji 表情 为4个 字节 ,所以 utf8 支持 存储 emoji 表情 。但是 utf8 的超集 utf8 mb4一个 字符 最多能有4 字节 ,所以能 支持 emoji 表情 的存储。下面介绍了关于
项目开发 经常会遇到用户在评论或者发表文章的时候会打一些 表情 在里面,如果我们在开发 不去做一些处理的话, 表情 会出不来的,甚至是报错,下面简单介绍处理方式. 原文地址: 小时刻个人博客:http://small.aiweimeng.top/index.php/archives/ Emoji .html 项目 评论或者文章 写入 表情 符号时,php报错,或者出来时一些???。这是为什么呢? 下面说一下... MySQL 在5.5.3之后增加了这个 utf8 mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四 字节 的unicode。好在 utf8 mb4是 utf8 的超集,除了将编码改为 utf8 mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用 utf8 也就够了。 二、内容描述 那上面说了既然 utf8 能够存下大部分 文汉字,那为什么还要使用 utf8 mb4呢? 原来 mysql
作者:laruence(http://www.laruence.com/)· 本文地址: http://www.laruence.com/2008/01/05/12.html· 转载请注明出处 根据Chaos Wang的PPT整理而成, 在此再次感谢Chaos Wang的此次TechTalk • 字符 (Character)是指人类语言 最小的表义符号。例如’A'、’B'等; ...
mysql 针对 字符 串类型,在设置charset的时候可以精确到字段。 如果只将某个字段设置 utf8 mb4,那么其他字段不会受影响。 如果针对表来设置,那么已经存在的字段依然是 utf8 ,并且会多出 utf8 的标记,之后所创建的字段才会是 utf8 mb4。 如果针对库来设置,那么已经存在的表依然是 utf8 ,之后所创建的表才会是 utf8 mb4。 除此之外呢,我们在连接数据库的时候,也要指明charset= utf8 mb4,否则的话,此连接无法向 utf8 mb4的字段写入数据,并且读取的时候是 在存储Scratch项目的xml内容时,DB报了个错:Incorrect string value: '\xF0\x9F\x91\x8B",...' for colum ...........(省略) 因为数据库默认配置都是uft8,具体如下: SHOW VARIABLES WHERE Variable_name LIKE 'character%' OR Variable_...
设计数据库时,对于 字符 类型数据设计时,因为使用的是Navicat软件进行建表,经常默认的 字符 集是 utf8 md4,于是就去查了查 utf8 utf8 mb4的区别。 对于这两种编码,区别在于: MySQL 在5.5.3版本以后增加了 utf8 mb4编码,其 mb4是most bytes 4的含义,用来兼容四个 字节 的Unico...
转自: (译)用 MySQL 的朋友们请不要使用" utf8 ",请使用" utf8 mb4" 用 MySQL 的朋友们请不要使用" utf8 ",请使用" utf8 mb4" 今天我试图把UTF-8编码的 字符 串插入使用“ utf8 ”编码的MariaDB数据库 ,Rails抛出一个古怪的异常: Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column...
什么是 UTF8 MB4? 我们在使用PhpMyAdmin管理面板时,可以在首页看到名为“Server connection collation”(服务器连接排序规则)的选项,用来选择所使用的 字符 集。对于我们常用的 UTF8 ,却有 utf8 utf8 mb4两种,这是为什么呢? 原来, MySQL 在5.5.3版本之后增加了这个 utf8 mb4的编码,mb4就是most bytes 4的意思,专门用来...
一、基本原则 如果要实现存储 emoji 表情 MySQL 实例,需要应用客户端、到 MySQL 实例的连接、 MySQL 实例内部 3 个方面统一使用或者 支持 utf8 mb4 字符 集。 否则会报Incorrect string value: ‘\xF0\x9F\x98\xAD",…’ for column ‘commentContent’ at row 1错误 解决 方法 1. 修改 mysql 数...