MySQL乱码的原因和设置UTF8数据格式的方法介绍-mysql教程-学派吧

本篇文章给大家带来的内容是关于MySQL乱码的原因和设置UTF8数据格式的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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:数据库服务器的默认字符集

3766484772-56b02610f38fc_articlex.jpg

字符集的转换流程分为3步:

1、客户端请求数据库数据,发送的数据使用character_set_client字符集

2、MySQL实例收到客户端发送的数据后,将其转换为character_set_connection字符集

3、进行内部操作时,将数据字符集转换为内部操作字符集:

(1)使用每个数据字段的character set设定值

(2)若不存在,使用对应数据表的default character set设定值

(3)若不存在,使用对应数据库的default character set设定值

(4)若不存在,使用character_set_server设定值

4、将操作结果值从内部操作字符集转换为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等,那么他们的区别是什么呢?

1、_bin是用二进制存储并比较,区别大小写,存储二进制内容时使用

2、utf8_general_ci:校对速度快,但准确度稍差,使用中英文时使用

3、utf8_unicode_ci:准确度高,但校对速度稍慢,使用德法俄等外语时使用

详细的区别可以参考 Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结。

修改字符集和字符序

如果在MySQL连接时,出现了乱码的问题,那么基本可以确定是各个字符集/序设置不统一的原因。MySQL默认的latin1格式不支持中文,由于我们在中国,所以选择对中文和各语言支持都非常完善的utf8格式。所以,我们需要将需要关注的字符集和字符序都修改为utf8格式。

你也可以选择utf8mb4格式,这个格式支持保存emoji

以上就是MySQL乱码的原因和设置UTF8数据格式的方法介绍的详细内容,更多请关注php中文网其它相关文章!

主题测试文章,只做测试使用。发布者:云大使,转转请注明出处:https://www.xp8.net/data/3468.html

(0)
打赏 微信扫一扫 微信扫一扫
云大使的头像云大使
上一篇 2019年4月9日 下午8:57
下一篇 2019年4月9日 下午8:57

相关推荐

  • MySQL数学函数的简单总结-mysql教程-学派吧

    MySQL包含了很多函数和运算符,可以帮助我们处理数据。下面我们就给大家整理出MySQL中可用的数学函数,希望对需要的朋友有所帮助! ABS()返回给定值的绝对值。 ACOS()返回数字的反余弦值。 ASIN()返回数字的反正弦值。 ATAN()返回一个或多个值的反正切值。 ATAN2()返回两个参数的反正切。 CEIL()同义词是CEILING()。 CE…

    数据库运维 2019年4月9日
    2.0K00
  • MySQL 闪退服务列表里找不到MySQL MySQL服务无法启动等

    前言 昨天配置了WampServer,弄了好长时间、一直不成功、显示丢失文件什么的。mysql也无法使用。下面把我碰到的发出来。仅供其他网友参考 安装MySQL之后输密码之后闪退: 1.最简单的, MySQL如果你输错了密码他就会闪退的。  2.如果你刚安装MySQL,并且下载安装过程中,他没有提示你填写用户名和密码,那你就是默认用户名root,默认密码是没…

    2018年9月14日
    4.4K00
  • Linux服务器下MySQL自动备份脚本的使用方法教程-学派吧-

    问题说明 如何对 ECS Linux 系统中部署的 MySQL 进行自动备份。 处理办法 在 ECS Linux 系统中搭建了 MySQL 服务,用户可以使用如下脚本实现 MySQL 的定期自动备份。 使用方法如下: 1. 将以下脚本拷贝到本地,上传到服务器上,名称叫 “autoback.sh” #!/bin/bash #——————…

    数据库运维 2019年1月1日
    2.4K00
  • MongoDB提升性能的方法教程-mysql教程-学派吧

    本篇文章给大家带来的内容是关于MongoDB提升性能的方法总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 MongoDB 是高性能数据,但是在使用的过程中,大家偶尔还会碰到一些性能问题。MongoDB和其它关系型数据库相比,例如 SQLServer 、MySQL 、Oracle相比来说,相对较新,很多人对其不是很熟悉,所以很多开发、DB…

    数据库运维 2018年11月24日
    3.0K00
  • B树和哈希索引的比较(代码示例)-mysql教程-学派吧

    本篇文章给大家带来的内容是关于B树和哈希索引的比较(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 前言:了解B树和哈希数据结构有助于预测查询在这些使用不同索引数据结构的存储引擎上的执行情况,特别是对于MEMORY存储引擎,它是允许您选择B树或哈希作为索引的存储引擎。 1. B树指数特征 B树索引可以在使用表达式中使用的对列的比较…

    数据库运维 2019年4月9日
    3.5K00

发表回复

登录后才能评论
联系我们

联系我们

18838889666

在线咨询: QQ交谈

邮件:xinyun@88.com

工作时间:周一至周五,9:30-18:30,节假日休息

添加微信
添加微信
分享本页
返回顶部
---------官方优惠叠加渠道折扣:通过我们购买腾讯云/阿里云,价格更低,服务更优。更有专业配置指导与服务。微信同步:18838889666----