先看下面的执行结果:

(root@localhost)[(none)]mysql>show variables like 'character%';
+--------------------------+-------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-5.6.26-linux-glibc2.5-i686/share/charsets/ |
+--------------------------+-------------------------------------------------------------+
8 rows in set (0.01 sec) (root@localhost)[(none)]mysql>set names gbk;
Query OK, 0 rows affected (0.00 sec) (root@localhost)[(none)]mysql>show variables like 'character%';
+--------------------------+-------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-5.6.26-linux-glibc2.5-i686/share/charsets/ |
+--------------------------+-------------------------------------------------------------+
8 rows in set (0.01 sec) (root@localhost)[(none)]mysql>set names utf8mb4;
Query OK, 0 rows affected (0.00 sec) (root@localhost)[(none)]mysql>show variables like 'character%';
+--------------------------+-------------------------------------------------------------+
| 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 |
| character_sets_dir | /usr/local/mysql-5.6.26-linux-glibc2.5-i686/share/charsets/ |
+--------------------------+-------------------------------------------------------------+
8 rows in set (0.00 sec)

1. character_set_system

The character set used by the server for storing identifiers. The value is always utf8.

character_set_system 是系统元数据(字段名等)存储时使用的编码字符集,该字段和具体存储的数据无关。总是固定不变的——utf8. 我们可以不去管它。

2. character_set_server 

Use charset_name as the default server character set. See Section 10.5, “Character Set Configuration”. If you use this option to specify a nondefault character set, you should also use --collation-server to specify the collation.

该变量设置的 server 级别的(mysqld级别的) 字符集。也就是说设置的是 一个 mysqld 的,所有字符最后存储时,使用的编码字符集。

默认值为 lantin1. 我们一般设置成:utf8、utf8mb4、gbk 等值。

一同设置的还有 server 级别的排序规则:

collation_server:

utf8mb4_bin, utf8mb4_general_ci, utf8_bin, utf8_general_ci

ci 代表: casesensitive ignore 排序时不考虑大小写;而 _bin 结尾的排序时考虑大小写。

3. character_set_database

Every database has a database character set and a database collation. The CREATE DATABASE and ALTER DATABASE statements have optional clauses for specifying the database character set and collation:

CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name] ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]

character_set_database 是单个数据库级别的 字符集设置,该参数允许我们在同一个 mysqd 下面的不同的 database 使用不同的字符集。

比如:

create database db1 character set utf8mb4 collate utf8mb4_bin;

这就设置了 数据库 级别的字符集。如果 create database 语句没有 character 和 collate 参数,那么他们会默认使用:

character_set_server 和 character_collation 的值作为 默认值。

同样对应有数据库级别的排序规则参数:

collation_database

4. character_set_client 

The character set for statements that arrive from the client. The session value of this variable is set using the character set requested by the client when the client connects to the server. (Many clients support a --default-character-set option to enable this character set to be specified explicitly. See also Section 10.1.4, “Connection Character Sets and Collations”.)

也就是 mysql client 发送 给 mysqld 的语句使用的 编码字符集。

可以使用 --default-character-set 参数来显示设置。

5. character_set_connection

The character set used for literals that do not have a character set introducer and for number-to-string conversion.

数字到字符转换时的编码字符集。

(用introducer指定文本字符串的字符集: 
– 格式为:[_charset] 'string' [COLLATE collation] 
– 例如: 
• SELECT _latin1 'string'; 
• SELECT _utf8 '你好' COLLATE utf8_general_ci; 
– 由introducer修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集处理。 )

实际中我们一般没有人去使用 introducer ,所以其实是没有 introducer,所以都会使用 character_set_connection来编码的。

6. character_set_results

The character set used for returning query results such as result sets or error messages to the client.

mysqld 在返回 查询 结果集 或者错误信息到 client 时,使用的编码字符集。

7. set names 'xxx' 命令

可以看到改变的是 character_set_client、character_set_connection、character_set_results

它们都是和 client 相关的。而 真正server端的编码字符集,character_set_server 和 character_set_database ,set names 'xxx' 根本无法修改。

set names 'xxx' 命令可以使 character_set_client、character_set_connection、character_set_results 三者统一:

client (character_set_client) -----> character_set_connection -------> mysqld  ------> client(character_set_results)

减少编码转换的需要。

8. character_set_server 和 character_set_database 

二者 的作用其实是相同的,都是设置 字符最终存储到磁盘时,使用的编码字符集。只不过 二者设置的级别不一样而已。character_set_server 设置了 mysqld 级别的存储编码字符集,而character_set_database设置 mysqld 中单个 database 的存储编码字符集。而且character_set_database的默认值就是 character_set_server 的值。

存在三次编码转换过程:

1)mysql client 使用 character_set_client编码的字符------> character_set_connection 编码字符

------> mysqld :这里需要从 character_set_connection 编码格式二进制流解码成 字符,然后使用 character_set_server/character_set_database 对字符进行再次编码,生成二进制流,存储时,就是存储再次编码的二进制流数据。

2)读取数据时,会使用 character_set_server/character_set_database 对读取到的二级制流进行 解码成 字符,然后使用 character_set_results 对字符进行二次编码,生成二进制流,发给 mysql client.

所以 使用 set names 'xxx' 命令,结合 character_set_server 参数,可以将 整个过程的 字符集设置成相同的,就不会存在编码转换的过程。

9. default-character-set = charset_name 配置参数

Use charset_name as the default character set for the client and connection(其实还有 character_set_results).

A common issue that can occur when the operating system uses utf8 or another multibyte character set is that output from the mysql client is formatted incorrectly, due to the fact that the MySQL client uses the latin1 character set by default. You can usually fix such issues by using this option to force the client to use the system character set instead.

See Section 10.5, “Character Set Configuration”, for more information.

default-character-set 能够同时指定 client 端 和 connection 的字符,也就是:character_set_client 和 character_set_connection的值,实际上还设置了 character-set-results 的值

所以 default-character-set 的作用和 set names 'xxx' 的作用是一样的

mysql set names 命令和 mysql 字符编码问题的更多相关文章

  1. mysql set names 命令和 mysql字符编码问题

    先看下面的执行结果: (root@localhost)[(none)]mysql>show variables like 'character%'; +--------------------- ...

  2. mysql命令行修改字符编码

    1.修改数据库字符编码 mysql> alter database mydb character set utf8 ; 2.创建数据库时,指定数据库的字符编码 mysql> create ...

  3. mysql的严格模式与无效字符编码问题

    问题一般格式为: 1366 Incorrect string value: '' for column 1300 Invalid utf8 character string: '' 向mysql插入中 ...

  4. ubuntu下mysql的常用命令,MySQL数据库的基本操作命令

    一.mysql服务操作 0.查看数据库版本 sql-> status; 1.net start mysql //启动mysql服务 2.net stop mysql //停止mysql服务  3 ...

  5. mysql注入新姿势(数字与字符编码注入) hex,conv

    0x01 前言 今天看到师傅们发的一篇文章,感觉mysql注入还能这么用,于是自己搭建了一个简单的环境,进行复现. 0x02原理 首先介绍两个mysql函数 hex和conv conv(N,from_ ...

  6. mysql show processlist 命令检查mysql lock

    processlist命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令. 1. 进入mysql/bin目录下输入mysqladmin processlist; ...

  7. 通过mysql show processlist 命令检查mysql锁的方法

    作者: 字体:[增加 减小] 类型:转载 时间:2010-03-07 show processlist 命令非常实用,有时候mysql经常跑到50%以上或更多,就需要用这个命令看哪个sql语句占用资源 ...

  8. Mysql参见SHOW命令总结

    Mysql参见SHOW命令总结 MySQL Show命令的用法大全

  9. mysql5.6修改字符编码,ERR:Illegal mix of collations for operation 'concat'

    mysql5.6修改字符编码,ERR:Illegal mix of collations for operation 'concat' 1.问题起因:搭建环境初始化mysql的时候看到mysql配置文 ...

随机推荐

  1. Dubbo入门

    早就听说了dubbo的好处,但是在项目中一直没有使用的机会,所以一直不知道怎么使用.今天晚上有空,简单的学习一下 就当入个门,以后项目中遇到的话,那么使用起来就比较简单了,至于介绍的话,我就不总结了, ...

  2. 《Java4Android》视频学习笔记——为什么用抽象类?

    我们来举个例子,然后引出这个问题的答案: 市面上有 喷墨式打印机 和 针式打印机 这两种形式的打印机,我们需要编程来实现他们的 开机,关机以及打印. 构建父类Printer class Printer ...

  3. Code First :使用Entity. Framework编程(1) ----转发 收藏

    这个是在学习EF CodeFirst时发现的,对于初学者还是不错的.果断转发,方便自己以后查阅和学习. 对于学习Code First 这个教程讲解的还是很详细. 第一章:欢迎来到Code First ...

  4. ProgressBar.js – 漂亮的响应式 SVG 进度条

    ProgressBar.js 是一个借助动态 SVG 路径的漂亮的,响应式的进度条效果.使用 ProgressBar.js 可以很容易地创建任意形状的进度条.这个 JavaScript 库提供线条,圆 ...

  5. 移动 Web 开发必备!时尚的 Off Canvas 导航

    这里向大家分享一组创新的 Off Canvas 导航效果.Off Canvas 导航在一些移动应用程序中被广泛使用.当你点击汉堡按钮(一般是三条横线组成)时,在左侧或者右侧拉出一个菜单,这样可以充分利 ...

  6. 【Spring】Spring框架之Struts2和Spring的优点

    Java Web开发使用Structs2和Spring框架的好处 今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术 ...

  7. 安装运行mariadb时错误:gtid_slave_pos

    精简windows zip包后出现错误: Failed to load slave replication state from table mysql.gtid_slave_pos: 1932: T ...

  8. sql2008“备份集中的数据库备份与现有的xxx数据库不同”解决方法

    因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决了: 一.打开sql企业管理器,新建查询 执行以下SQL代码: RESTORE DATAB ...

  9. HTML5移动开发学习笔记

    最近做webapp项目过程中,发现坑还是挺多的,以下是网络收集一些开发中的常见问题及知识汇总,以便查阅,慢慢更新:). meta 基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 < ...

  10. CSS常用样式(三)

    一.2D变换 1.transform   设置或检索对象的转换 取值: none::以一个含六值的(a,b,c,d,e,f)变换矩阵的形式指定一个2D变换,相当于直接应用一个[a,b,c,d,e,f] ...