一般情况下,我们会设置MySQL默认的字符编码为utf8,但是近些年来,emoji表情的火爆使用,给数据库带来了意外的错误,就是emoji的字符集已经超出了utf8的编码范畴?

令人抓狂的字符编码问题

谈到字符编码问题,会让很多人感到头疼,这里不在深究各个字符编码的特点和理论,这里只说下Unicode和utf8字符编码的关系

1234567
Unicode是编码字符集,而UTF-8就是字符编码,即Unicode规则字库的一种实现形式。随着互联网的发展,对同一字库集的要求越来越迫切,Unicode标准也就自然而然的出现。它几乎涵盖了各个国家语言可能出现的符号和文字,并将为他们编号。详见:Unicode on Wikipedia。Unicode的编号从0000开始一直到10FFFF共分为16个Plane,每个Plane中有65536个字符。而UTF-8则只实现了第一个Plane,可见UTF-8虽然是一个当今接受度最广的字符集编码,但是它并没有涵盖整个Unicode的字库,这也造成了它在某些场景下对于特殊字符的处理困难

简单的说在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件

emoji是Unicode编码,在MySQL中使用utf8编码无法正常显示emoji的表情,为了解决这个问题,MySQL在5.5.3版本之后,引进了新的字符编码utf8mb4,本篇文章主要介绍如何将已经是utf8的database切换到utf8mb4字符编码

什么是utf8mb4

utf8mb4最明显的好处是解决了苹果挖的坑-推广了emoji表情。utf8mb4解决了MySQL数据库存储emoji表情的问题

utf8mb4是utf8的超集,理论上由utf8升级到utf8mb4字符编码没有任何兼容问题

升级utf8到utf8mb4

1. 备份

安全第一,备份所有需要升级字符编码的数据库

  • 可以将库dump出来
  • 如果是虚拟机,可以给整个主机做快照

2. 升级

utf8mb4是MySQL5.5.3版本之后支持的字符集,so,如果你需要使用这个字符集,前提条件是你的MySQL版本必须 >= 5.5.3

3. 修改

在MySQL中,可以为一个database设置字符编码,可以为一张表设置字符编码,甚至可以为某一个字段设置字符编码

  • 查看当前系统默认的字符集设置

    SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

  • 查看database的字符编码
    show create database polarsnow;

  • 查看table的字符编码
    show create table ps;

  • 查看column的字符编码
    show full columns from ps;

修改database默认的字符集

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci

虽然修改了database的字符集为utf8mb4,但是实际只是修改了database新创建的表,默认使用utf8mb4,原来已经存在的表,字符集并没有跟着改变,需要手动为每张表设置字符集

修改table的字符集

  • 只修改表默认的字符集 ALTER TABLE table_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 修改表默认的字符集和所有字符列的字符集 ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

单独修改column默认的字符集

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

注:VARCHAR(191) 根据字段实例的类型填写

4. 检查字段的最大长度和索引列

  • 字段长度

由于从utf8升级到了utf8mb4,一个字符所占用的空间也由3个字节增长到4个字节,但是我们当初创建表时,设置的字段类型以及最大的长度没有改变。例如,你在utf8下设置某一字段的类型为TINYTEXT, 这中字段类型最大可以容纳255字节,三个字节一个字符的情况下可以容纳85个字符,四个字节一个字符的情况下只能容纳63个字符,如果原表中的这个字段的值有一个或多个超过了63个字符,那么转换成utf8mb4字符编码时将转换失败,你必须先将TINYTEXT更改为TEXT等更高容量的类型之后才能继续转换字符编码

  • 索引

在InnoDB引擎中,最大的索引长度为767字节,三个字节一个字符的情况下,索引列的字符长度最大可以达到255,四个字节一个字符的情况下,索引的字符长度最大只能到191。如果你已经存在的表中的索引列的类型为VARCHAR(255)那么转换utf8mb4时同样会转换失败。你需要先将VARCHAR(255)更改为VARCHAR(191)才能继续转换字符编码

5. 修改配置文件

SET NAMES utf8 COLLATE utf8_unicode_ci becomes SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci

123456789101112131415
> vim /etc/my.cnf# 对本地的mysql客户端的配置[client]default-character-set = utf8mb4

# 对其他远程连接的mysql客户端的配置[mysql]default-character-set = utf8mb4

# 本地mysql服务的配置[mysqld]character-set-client-handshake = FALSEcharacter-set-server = utf8mb4collation-server = utf8mb4_unicode_ci> service mysqld restart

检查修改

12345678910111213141516
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 |+--------------------------+--------------------+10 rows in set (0.00 sec)

注:character_set_system 一直都会是 utf8,不能被更改

6. 修复&优化所有数据表

1
> mysqlcheck -u root -p --auto-repair --optimize --all-databases

总结

不要在MySQL上使用utf8字符编码,推荐使用utf8mb4,至于为什么,引用国外友人的一段话:

Never use utf8 in MySQL — always use utf8mb4 instead. Updating your databases and code might take some time, but it’s definitely worth the effort. Why would you arbitrarily limit the set of symbols that can be used in your database? Why would you lose data every time a user enters an astral symbol as part of a comment or message or whatever it is you store in your database? There’s no reason not to strive for full Unicode support everywhere. Do the right thing, and use utf8mb4. ?

转载于:https://www.cnblogs.com/wang666/p/10282755.html

mysql 修改字符集为utf8mb4相关推荐

  1. mysql修改字符集utf8为utf8mb4

    mysql修改字符集utf8为utf8mb4 查看数据库的编码格式 1 2 3 SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR ...

  2. mysql修改字符集utf8mb4引发的惨案

    mysql修改字符集utf8mb4引发的惨案 环境配置: Linux CentOS 7 mysql5.7字符编码是utf8: 惨案原因:数据库表需要支持表情很符号,表情符号一般是4个字符,utf8最多 ...

  3. 修改MySQL的字符集为utf8mb4

    一般情况下,我们会设置MySQL默认的字符编码为utf8,但是近些年来,emoji表情的火爆使用,给数据库带来了意外的错误,就是emoji的字符集已经超出了utf8的编码范畴? 令人抓狂的字符编码问题 ...

  4. MySQL修改字符集

    MySQL数据库修改字符集,介绍一下修改的方法 1)系统工具iconv #file filename #mysqldump --default-character-set=utf8 >20180 ...

  5. MySQL修改字符集步骤(字段插入中文提示错误时解决办法)

    在实际应用中,如果一开始没有正确的设置字符集,在运行一段时间以后,才发现当前字符集不能满足要求,需要进行调整,但又不想丢弃这段时间的数据,这个时候就需要修改字符集. 在<MySQL设置默认字符集 ...

  6. mysql修改字符集_MySQL修改字符集步骤详解

    在实际应用中,如果一开始没有正确的设置字符集,在运行一段时间以后,才发现当前字符集不能满足要求,需要进行调整,但又不想丢弃这段时间的数据,这个时候就需要修改字符集. 在<MySQL设置默认字符集 ...

  7. mysql 修改字符集为utf8mb4_MySQL数据库修改字符集为utf8mb4

    需要修改my.ini( my.cnf) [client] default-character-set=utf8mb4 [mysqld] character-set-client-handshake = ...

  8. linux下mysql修改字符集,远程连接

    安装时候很简单,但是安装了后一般不能用 安装后 首先执行 mysql -u root mysql 这是就会进入mysql命令窗口,这样是可以使用的,但是我们要先设置密码 1.先设置密码 UPDATE ...

  9. ubuntu mysql修改字符集后不能启动mysql_解决ubuntu下修改my.cnf设置字符集导致mysql无法启动...

    在Ubuntu下安装了MySQL数据库,为了便于使用,欲将字符集统一设置为utf8,而不是默认的latin1. 进入mysql,输入show variables like 'character%';查 ...

  10. linux mysql 修改字符集_linux下mysql修改字符集,远程连接

    安装时候很简单,但是安装了后一般不能用 安装后 首先执行 mysql -u root mysql 这是就会进入mysql命令窗口,这样是可以使用的,但是我们要先设置密码 1.先设置密码 UPDATE ...

最新文章

  1. Word文档以两列的格式打开,类似于书本那样
  2. webhook简单部署
  3. QT编译发布程序后报错如缺少dll、“应用程序无法正常启动(0xc000007b)”的可能解决方法
  4. 谷歌宣布确立“量子霸权” IBM质疑:真的吗?
  5. Linux 上的高可用中间件
  6. java 生成校验验证码_java 验证码生成与校验
  7. linux awk if 多个条件,linux shell awk 流程控制语句(if,for,while,do)详细介绍
  8. java list stream avg_Java 8 Stream API中的多个聚合函数
  9. 解决 transaction-manager Attribute transaction-manager is not allowed here
  10. SAI+PS超萌Q版插画手绘视频教程
  11. php进度条实例,JavaScript_一个简单的jquery进度条示例,用jQuery实现的最简单的进度条 - phpStudy...
  12. 走进MSTP -- 4. OSN7500/7500II/3500/1500硬件速览
  13. PyTorch中view的用法
  14. XTP dockingpane的使用方法
  15. Oracle 考试题 原题
  16. Linux 下 github 的使用
  17. IBM-PC汇编语言程序设计课后习题答案(第4、5章)
  18. 修复液晶显示器屏幕上的划痕
  19. Windows 8实用窍门系列:20.Windows 8中的GridView使用(二)和DataTemplateSelector
  20. 大龄Android程序员刚迈过了 35 岁这个“坎儿”,和大家说点儿心里话

热门文章

  1. 二维字符数组转字符串c语言,[求助] 怎样转换一个字符二维数组到一维数组~~~...
  2. 中兴android.process.acore,中兴天机Grand SII第三方系统刷机包(卡刷包)
  3. Redis 6.0 源码阅读笔记(6) -- Set 数据类型源码分析
  4. select2 清除已选项
  5. 4.4使用@Enable*注释去切换配置
  6. MyBatis基于Java API配置
  7. 【渝粤教育】国家开放大学2018年春季 3922T汽车运用基础 参考试题
  8. Building libmesh with Petsc support
  9. 教大家如何修改博客背景
  10. SA / SAM 题目集