先看下面的执行结果:

(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.01sec)

(root@localhost)[(none)]mysql>setnames gbk;

Query OK,0 rows affected (0.00sec)

(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.01sec)

(root@localhost)[(none)]mysql>setnames utf8mb4;

Query OK,0 rows affected (0.00sec)

(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)

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 messagesto 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.

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

所以 default-character-set 的作用和 set names ‘xxx’ 的作用是一样的。

MySQL set names 命令_mysql set names 命令和 mysql 字符编码问题相关推荐

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

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

  2. mysql ndb 命令_Mysql入门基础命令

    1    Mysql基本操作 1.1    查询当前数据库 mysql> show databases; +--------------------+ | Database | +------- ...

  3. mysql数据库导入操作_mysql 导入数据库 命令操作

    mysql -uroot -D数据库名 1. 导入数据到数据库中得某个表 mysql -uroot -D数据库名 表名 D:\APMServ5.2.6\MySQL5.1\bin>mysqldum ...

  4. mysql的导入导出命令_mysql导入导出命令

    一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径): 1.导出数据和表结构: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql #/usr ...

  5. ps efgrep mysql 命令_mysql常用管理命令

    安装直接yum install mysql-server yum install mysql service mysqld start //启动mysql服务 登录mysql -u root -p 初 ...

  6. mysql配置命令_MySQL基本配置命令总结

    创建数据库 create databse 数据库名称; 显示MySQL中的数据库 show databases; 进入数据库 use 数据库名称; 显示数据库中的表 show tables; 显示表结 ...

  7. mysql数据基本指令_mysql数据库常用命令(详细)

    mysql数据库常用命令(详细) *************************************************** windows下mysql的启动与停止 启动MYSQL服务 n ...

  8. mysql集合查询的命令_MySQL数据库常用命令集合

    1.设置root密码 方法1: 用SET PASSWORD命令 mysql -u root SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpas ...

  9. mysql根据字长查询_MYSQL常用查命令

    MYSQL常用查命令: mysql> select version();        查看MySQL的版本号 mysql> select current_date();        查 ...

  10. mysql黑窗口常用命令_mysql数据库常用命令

    1.MySQL常用命令 create database name; 创建数据库 use databasename; 选择数据库 drop database name 直接删除数据库,不提醒 show ...

最新文章

  1. 来了解下AbstractList
  2. linux c 获取系统进程总数
  3. [css] 使用css写一个垂直翻转图片的效果
  4. LeetCode LCS 02. 完成一半题目(计数+排序)
  5. python输出50-150之间不能被5整除的整数代码解读
  6. PHP中的中文截取乱码问题_gb2312_utf-8
  7. bat中ERRORLEVEL的使用介绍
  8. [C/C++] ccpuid:CPUID信息模块 V1.02版,支持Mac OS X,支持纯C,增加CPUF常数
  9. Go语言实战-golang操作redis
  10. 【数据结构实验一】线性表
  11. 计算机网路vlan划分练习
  12. 章节1 概述 - Segger SystemView使用手册(译文)
  13. 如何实现一个去中心化的 Dropbox 存储
  14. 【每日英文】2021.9.23
  15. 关于echart 饼图显示不出来 挖坑总结
  16. 学计算机怎么介绍自己的产品,商品基本描述
  17. MarkMan – 马克鳗,让设计更有爱!
  18. malic-2021年寒假热身-05 D - 楼高莫近危阑倚(DFS+树状数组)
  19. ubuntu下80端口无权限问题
  20. Python版警察抓小偷游戏源代码,有多个难度级别

热门文章

  1. c++中友元函数详解
  2. 数据链路层:基本概念
  3. (NFS)mount.nfs: access denied by server while mounting localhost:/home/xuwq/minilinux/system
  4. Makefile文件试错
  5. Java面试题及答案,mysql可视化工具
  6. 万字长文!2020-2021京东Java面试真题解析
  7. go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...
  8. 调用百度 Echarts 显示重庆市地图
  9. struts2官方 中文教程 系列六:表单验证
  10. cordova 项目添加splash启动界面