MySQL乱码的原因和设置UTF8数据格式
https://segmentfault.com/a/1190000018662023
MySQL使用时,有一件很痛苦的事情肯定是结果乱码。将编码格式都设置为UTF8可以解决这个问题,我们今天来说下为什么要这么设置,以及怎么设置。
MySQL字符格式
字符集
在编程语言中,我们为了防止中文乱码,会使用unicode
对中文字符做处理,而为了降低网络带宽和节省存储空间,我们使用UTF8进行编码。对这两者有什么不同不够了解的同学,可以参考Unicode字符集和UTF8编码编码的前世今生这篇文章。
同样在MySQL中,我们也会有这样的处理,我们可以查看当前数据库设置的编码方式(字符集):
mysql> show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)
表中就是当前设置的字符集,先看不用关注的几个值:
character_set_filesystem | binary:
文件系统上的存储格式,默认为binary
(二进制)character_set_system | utf8:
系统的存储格式,默认为utf8
character_sets_dir | /usr/local/mysql/share/charsets/:
可以使用的字符集的文件路径
剩下的几个就是日常影响读写乱码的参数了:- character_set_client:
客户端请求数据的字符集- character_set_connection:
从客户端接收到数据,然后传输的字符集- character_set_database:
默认数据库的字符集;如果没有默认数据库,使用character_set_server
字段- character_set_results:
结果集的字符集- character_set_server:
数据库服务器的默认字符集
字符集的转换流程分为3
步:
- 客户端请求数据库数据,发送的数据使用
character_set_client
字符集 MySQL
实例收到客户端发送的数据后,将其转换为character_set_connection
字符集进行内部操作时,将数据字符集转换为内部操作字符集:
- 使用每个数据字段的
character set
设定值 - 若不存在,使用对应数据表的
default character set
设定值 - 若不存在,使用对应数据库的
default character set
设定值 - 若不存在,使用
character_set_server
设定值
- 使用每个数据字段的
- 将操作结果值从内部操作字符集转换为
character_set_results
字符序
说字符序之前,我们需要了解一点基础知识:
- 字符
(Character)
是指人类语言中最小的表义符号。例如’A’、’B’
等; - 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码
(Encoding)
。例如,我们给字符’A’
赋予数值0
,给字符’B’
赋予数值1
,则0
就是字符’A’
的编码; - 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集
(Character Set)
。例如,给定字符列表为{‘A’,’B’}
时,{‘A’=>0, ‘B’=>1}
就是一个字符集; - 字符序
(Collation)
是指在同一字符集内字符之间的比较规则; - 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;
- 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序
(Default Collation)
; MySQL
中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci
(表示大小写不敏感,case insensitive
)、_cs
(表示大小写敏感,case sensitive
)或_bin
(表示按编码值比较,binary
)结尾。例如:在字符序“utf8_general_ci”
下,字符“a”
和“A”
是等价的;
因此字符序不同于字符集,用于数据库字段的相等或大小比较。我们查看MySQL
实例设置的字符序:
mysql> show variables like 'collation%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
跟utf8对应的常用字符序是:utf8_unicode_ci/utf8_general_ci和utf8_bin
等,那么他们的区别是什么呢?
_bin
是用二进制存储并比较,区别大小写,存储二进制内容时使用utf8_general_ci
:校对速度快,但准确度稍差,使用中英文时使用utf8_unicode_ci
:准确度高,但校对速度稍慢,使用德法俄等外语时使用
详细的区别可以参考 Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结。
修改字符集和字符序
如果在MySQL
连接时,出现了乱码的问题,那么基本可以确定是各个字符集/序设置不统一的原因。MySQL
默认的latin1
格式不支持中文,由于我们在中国,所以选择对中文和各语言支持都非常完善的utf8
格式。所以,我们需要将需要关注的字符集和字符序都修改为utf8
格式。
你也可以选择 用curl获取一个经过gzip压缩后的网页时返回乱码 原因大体就是服务器返回的Content-Encoding的值和网页的编码不同,造成curl解码出问题,直接将gzip或deflate编码的文件下载 ... 有时候因为编码需要修改mysql的编码,windows下修改有图文界面简单一些,linux大家就可以参考下面的方法 默认登录mysql之后可以通过SHOW VARIABLES语句查看系统变量及其值 ... windows系统下的mysql: 1.找到mysql的配置文件:文件名可能不是my.ini(如my-default.ini),修改成my.ini. 打开配置文件,并编辑如下:(若是没有[client ... 在阅读本文之前,强烈建议对字符集编码概念还比较模糊的同学 阅读下博主之前对相关概念的一篇科普:十分钟搞清字符集和字符编码 本博客已经迁移至: http://cenalulu.github.io/ 为了 ... 本文来自:http://www.cnblogs.com/cenalulu/p/4325693.html 要了解为什么会出现乱码,我们就先要了解从客户端发起请求,到MySQL存储数据,再到下次从表取回客 ... 本文将详细介绍MySQL乱码的成因和具体的解决方案 在阅读本文之前,强烈建议对字符集编码概念还比较模糊的同学 阅读下博主之前对相关概念的一篇科普:十分钟搞清字符集和字符编码 MySQL出现乱码的原因 ... 工作中因为字符集问题没少头疼,还犯过一次错误,还好拯救及时,没有发生重大事故,唉,弄清楚点还是非常有必要的: 例如我的工作环境为CTR+redhat5+mysql5.5 在导入sql语句的时候必须要注 ... 当你遇到这个mysql保存中文乱码问题的时候,期待找到mysql保存中文乱码的原因和解决办法这样一篇能解决问题的文章是多么激动人心. 也许30%的程序员会选择自己百度,结果发现网友已经贴了很多类 ... character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. characte ... gRPC服务发现&负载均衡 https://segmentfault.com/a/1190000008672912?utm_source=tag-newest GRPC编程指南 gRPC 介绍 ... 目录 一.vue中的组件 1. 组件的概念 2. 组件分类 3. 组件的特点 4. 组件的定义 5. 组件化 (1)用法和注意 (2)数据组件化实例 6. 组件传参--父传子 (1)用法和注意 (2) ... 原文地址:https://blog.csdn.net/qq_41254677/article/details/81011681 使用maven是为了更好的帮项目管理包依赖,maven的核心就是pom. ... Zabbix 一.Zabbix 概述 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的 ... 有下面 2 种方法来上传一个附加文件的新版本,你可以: 上传与已有附件具有相同文件名的版本. 使用 上传一个新版本(Upload a new version) 按钮来进行上传(这个在文件预览界面中 ... 题目4标题:第几个幸运数 到x星球旅行的游客都被发给一个整数,作为游客编号.x星的国王有个怪癖,他只喜欢数字3,5和7.国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品. 我们来看前 ... [root@izbp145axkc98giot5b448z ~]# docker run -d 231d40e811cd -p 80:80 --name=nginx 56896ff0b49cfe5f1 ... 一.去除空格 strip() " xyz ".strip() # returns "xyz" " xyz ".lstrip() # ... 参考链接: 1. https://medium.com/@cwchang/gradient-boosting-%E7%B0%A1%E4%BB%8B-f3a578ae7205 2. https://zh ... 参考链接1 参考链接2 当浏览器从 web 服务器请求服务时,可能会发生错误. HTML消息 1xx: 信息 消息: 描述: 100 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒绝 ...utf8mb4
格式,这个格式支持保存emoji
MySQL乱码的原因和设置UTF8数据格式的更多相关文章
随机推荐