MySQL 的 utf8 实际上不是真正的 UTF-8。utf8 只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。MySQL 一直没有修复这个 bug,他们在 2010 年发布了一个叫作 utf8mb4 的字符集,绕过了这个问题。当然,他们并没有对新的字符集广而告之(可能是因为这个 bug 让他们觉得很尴尬),以致于现在网络上仍然在建议开发者使用 utf8,但这些建议都是错误的。

简单概括如下:

MySQL 的 utf8mb4 是真正的 UTF-8。

MySQL 的 utf8 是一种专属的编码,它能够编码的 Unicode 字符并不多。

所有在使用 utf8 的 MySQL 和 MariaDB 用户都应该改用 utf8mb4,永远都不要再使用 utf8。

为什么会有UTF8MB4?

既然utf8应付日常使用完全没有问题,那为什么还要使用utf8mb4呢? 低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。

UTF-8编码

理论上将, UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。关于UTF编码,请阅读《常见编码总结》一文。

而utf8 则是 Mysql 早期版本中支持的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。这可能是因为在MySQL发布初期,基本多文种平面之外的字符确实很少用到。而在MySQL5.5.3版本后,要在 Mysql 中保存 4 字节长度的 UTF-8 字符,就可以使用 utf8mb4 字符集了。例如可以用utf8mb4字符编码直接存储emoj表情,而不是存表情的替换字符。

为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8,事实上,最新版的phpmyadmin默认字符集就是utf8mb4。诚然,对于 CHAR 类型数据,使用utf8mb4 存储会多消耗一些空间。

那么utf8mb4比utf8多了什么的呢?

多了emoji编码支持.

如果实际用途上来看,可以给要用到emoji的库或者说表,设置utf8mb4.

比如评论要支持emoji可以用到.

建议普通表使用utf8 如果这个表需要支持emoji就使用utf8mb4

新建mysql库或者表的时候还有一个排序规则

utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下 utf8_general_ci的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是utf8_general_ci,所以新建数据 库时一般选用utf8_general_ci就可以了

如果是utf8mb4那么对应的就是 utf8mb4_general_ci utf8mb4_unicode_ci

查询系统字符编码变量 (最好不要使用连接工具 navica 等,查出来的不准,使用终端,cmd 等)

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

未修改之前

image.png

修改设置

修改数据库编码及字符集

ALTER DATABASE db_name(你的数据库) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

给没有设置编码的表设置编码

alter table table_name(你的表名) default character set utf8mb4 collate=utf8mb4_general_ci;

批量生成修改所有表编码的 sql 然后复制执行

SELECT

CONCAT("ALTER TABLE `", TABLE_NAME,"` default character set utf8mb4 collate=utf8mb4_general_ci;")

AS target_tables

FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_SCHEMA = "db_name" (这里是数据库名)

AND TABLE_TYPE="BASE TABLE"

修改表字段编码

ALTER TABLE temp convert to CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

批量生成修改所有表字段编码的 sql 然后复制执行

SELECT

CONCAT("ALTER TABLE `", TABLE_NAME,"` convert to CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;")

AS target_tables

FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_SCHEMA = "db_name" (这里是数据库名)

AND TABLE_TYPE="BASE TABLE"

修改 my.ini 文件或者 my-default.int 文件

[client]

default-character-set = utf8mb4

[mysql]

default-character-set = utf8mb4

[mysqld]

# 设置表字段排序规则

init_connect='SET collation_connection = utf8mb4_unicode_ci'

# set names utf8 是用于设置编码,可以再在建数据库的时候设置,也可以在创建表的时候设置,或只是对部分字段进行设置

init_connect='SET NAMES utf8mb4'

# 设置数据库编码

character-set-server=utf8mb4

collation-server=utf8mb4_unicode_ci

# 此处是忽略客户端的字符集,使用服务器的设置

skip-character-set-client-handshake

重新启动

修改之后

image.png

mysql 特殊字符支持_mysql 解决生僻字,特殊字符插入失败相关推荐

  1. 解决mysql的utf8编码中生僻字写入时Incorrect string value错误

    http://hi.baidu.com/cnkarl/item/e18214e8ba7ce3c6bbf37ddd ------------------------------------------- ...

  2. mysql share 字体 中文_MySQL 存储生僻字/不常见繁体字解决方案(未完全解决)

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

  3. 数据库存储解决生僻字

    一.Oracle数据库 就一般情况来说,Oracle存储中英文的字段用varchar2类型就可以了,但有些时候,遇到生僻字就不行了, 在默认字符集环境下,实现Oracle储存生僻字: 㛃.䶮-(使用n ...

  4. mysql整点抖动_MySQL 5.5 大量数据插入出现的抖动问题 及 解决方法

    背景 日志型应用的一个典型操作,是周期性地有大量的insert操作.这类操作需要对扩展表空间. 分析 在InnoDB里,扩展表空间的操作是在语句执行过程中,由执行线程直接调用的. 尤其是对于一些表每行 ...

  5. oracle 数据库更改字符集,解决生僻字和中文标点符号. 乱码

    背景: 一个很久以前的老项目,开发人员在安装Oracle数据库时采用的默认的编码集,导致后期正式运行时出现某些生僻字和中文符号. 出现乱码.出现的情况就是某些生僻字或中文符号点一经保存,数据库里面就直 ...

  6. php处理mysql的符号_MySQL数据入库时特殊字符处理

    在一个字符串中,如果某个序列具有特殊的含义,每个序列以反斜线符号 ("/")开头,称为转义字符. MySQL 识别下列转义字符: /0 一个 ASCII 0 (NUL) 字符. / ...

  7. mysqlgbk不支持中文吗_【转载】mysql 不支持中文解决办法

    一)不能显示中文解决办法: 1:windows平台,因为windows操作系统默认的是用了gb2312这个字符,而mysql在安装的时候, 默认的是客户端和服务器都用了latin1,所以这就导致一个字 ...

  8. mysql gbk支持_mysql支持gbk

    在mysql数据库中,使用的是latin字符集,所以无法正常的支持中文字符,中文在数据库中显示为乱码"?"号.为了让mysql可以正常使用中文,尤其是当使用jsp连接mysql的时 ...

  9. mysql gbk支持_mysql如何支持gbk编码

    mysql支持gbk编码的方法:首先修改[my.cnf]文件:然后建立库表时指定gbk字符集,代码为[>show cereate table tablename]:最后修改jdbc驱动即可. m ...

最新文章

  1. UML用例图概要(转)
  2. n-netstat 查看网络状态命令
  3. Ubuntu 搭建 Zerotier One MOON 根目录服务器
  4. 因为WMI配置,无法执行Sql Server 系统配置检查器的解决办法
  5. 检查点重做检查点队列简单总结Strut2教程-java教程
  6. Apache Ranger源码编译及使用
  7. 【黑马程序员】————预处理指令1-宏定义
  8. Android Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE解决办法
  9. getView的解析流程
  10. 我们生活在最好的时代
  11. python计算方位角_实例讲解:用python 计算方位角(根据两点的坐标计算)记得收藏哦...
  12. 使用百度UMeditor富文本编辑器,修改自定义图片上传,修改源码
  13. 使用CSS样式,制作六边形
  14. ocp认证考试指南第一章
  15. 从零开始搭建神经网络并将准确率提升至85%
  16. 练手|常见近30种NLP任务的练手项目
  17. 【富文本】解决会声会影、PR、AE处理视频后过大的问题(三款工具)专业视频压制软件|专业视频压制神器下载
  18. 1招提升Java单元测试ROI
  19. 深度学习目标检测模型汇总(论文,源码,数据集,推荐收藏)
  20. 基于遗传算法的simulink/PID参数整定(s函数)

热门文章

  1. 【Hibernate】Hibernate实体关系映射——双边的多对多关系
  2. 几款让你爱不释手的语音转文字软件
  3. XML配置里的Bean自动装配与Bean之间的关系
  4. 11.14PMP试题每日一题
  5. MIT JOS学习笔记01:环境配置、Boot Loader(2016.10.22)
  6. 什么是OpenCL?面向FPGA的OpenCL有何优点?
  7. 去掉easyui datagrid内部虚线的方式。
  8. mysql的错误号大全
  9. 优酷世博频道上线 拍客牛人导航上海世博
  10. PIL 学习笔记(1)