一直以 来只知道 mysql_query("S ET NAMES UTF8");  是设定数据库编码的,但是一直不清楚“SET NAMES UTF8”到底是什么。直到今天才知道 SET NAMES xxx 也是 mysql 语句。

真的感觉到自己的功课还没做到家,现有知识储备比较匮乏。现将所查相关资料记下:

1、SET NAMES ‘charset_name’

SET NAMES xxx 用于显式设置客户端之后发送的 SQL 语句使用什么字符集。因此,SET NAMES 'cp1251' 语句告诉服务器将来从这个客户端传来的信息采用字符集 cp1251 。同时它还为服务器发送回客户端的结果指定了该字符集。(例如,当你执行 SELECT 语句,列值以你指定的字符集显式)

2、连接字符集和校对

(1) 一些字符集和校对规则系统变量与客户端和服务器的交互有关。

  • 服务器字符集和校对规则对应 character_set_server 和 collation_server 变量的值。
  • 默认数据库字符集和校对规则对应 character_set_database 和 collation_database 变量的值。

在客户端和服务器的连接处理中,也涉及了字符集和校对规则变量。 
每一个客户端有一个连接相关的字符集和校对规则变量。

(2)什么是“连接

客户端 通过“连接”发送 SQL 语句到服务器 ,例如查询。服务器通过连接发送响应给客户端,例如结果集。 
对于客户端连接,相关的为连接的字符集和校对规则的问题,这些问题均能够通过系统变量来解决。

(3) 当查询离开客户端后,在查询中使用哪种字符集?

服务器使用 character_set_client 变量作为客户端发送的查询中使用的字符集。

(4) 服务器接收到查询后如何转换字符集?

转换时,服务器使用 character_set_connection 和 collation_connection 系统变量。它将客户端发送的查询从 character_set_client 系统变量指定的字符集转换到 character_set_connection 指定的字符集(除非字符串文字具有象 _latin1 或 _utf8 的引介词)。collation_connection 对于字符串比较是有用的。但对于列值字符串比较不起作用,因为会采用更高的优先级校对规则。

(5)服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?

character_set_results 变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。

=========================================
两外一篇文章中的部分内容如下:(摘录+个人总结)

如果在 mysql 配置文件中不对字符编码进行设置或者按照如下设置

?
1
2
3
4
5
[mysql] 
default-character-set=utf8    //客户端的默认字符集
[mysqld]
default-character-set=utf8    //服务器端默认的字符集

则在 mysql 中可以查看到如下信息:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | latin1                           |
| character_set_connection | latin1                           |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | latin1                           |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)
mysql>

此时若通过程序从数据库里按照UTF-8编码方式读取数据,很有可能是一串“?????”或者是其他乱码。

解决办法是,在连接数据库之后且读取数据之前,先执行 SET NAMES UTF8 命令。
在 mysql 命令行中执行 SET NAMES UTF8; 后重新查看字符编码信息,结果如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)
mysql>

可以看到发生变化的变量为

  • character_set_client
  • character_set_connection
  • character_set_results

手册上说,上面那句 SET NAMES UTF8; 作用相当于:

?
1
2
3
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

而这 3 个变量正对应了编码转换 路径 中的3个部分:

  • 信息输入路径:client→connection→server
  • 信息输出路径:server→connection→results

换句话说,在每个路径上信息都要经过3次字符集编码转换。 
所以,在两种字符集不兼容的情况下,如果进行了相应的转换,则会出现乱码。

注:

  1. SET NAMES UTF8 的作用只是临时的,mysql 重启后就恢复默认了。
  2. 设置字符编码的时候使用的是 utf8 并非 utf-8 。
原文地址:http://haohao5788.blog.sohu.com/180073685.html

【转载】MySQL -- SET NAMES utf8相关推荐

  1. php mysql utf 8_PHP+MySQL中对UTF-8,UTF8(utf8),set names gbk 的理解

    问题一:在我们进行数据库操作时会发现,数据库中表的编码用的是utf-8,但是在进行dos命令是要使用set names gbk (一)Mysql中默认字符集设置有四级:服务器级,数据库级,表级,和字段 ...

  2. mysql语句:SET NAMES UTF8

    一直以来只知道mysql_query("SET NAMES UTF8");是设定数据库编码的,但是一直不清楚"SET NAMES UTF8"是什么. 直到今天才 ...

  3. 为了让你的网页能在更多的服务器上正常地显示,还是加上“SET NAMES UTF8”吧...

    为了让你的网页能在更多的服务器上正常地显示,还是加上"SET NAMES UTF8"吧 Repinted:http://blog.csdn.net/class1/archive/2 ...

  4. linux 设置mysql 数据库编码utf8

    GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; UTF8: CREATE DATABASE ` ...

  5. 永远不要在 MySQL 中使用 UTF-8

    转载自  永远不要在 MySQL 中使用 UTF-8 最近我遇到了一个 bug,我试着通过 Rails 在以"utf8"编码的 MariaDB 中保存一个 UTF-8 字符串,然后 ...

  6. 为了让你的网页能在更多的服务器上正常地显示,还是加上“SET NAMES UTF8”吧

    Repinted:http://blog.csdn.net/class1/archive/2006/12/30/1469298.aspx 为了让你的网页能在更多的服务器上正常地显示,还是加上" ...

  7. mysql set names没反应_MYSQL使用的时候遇到的一些问题

    1.  之前使用的时候遇到编码有问题.在MYSQL的命令行里输入了status结果显示如下: Server characterset:latin1 Db     characterset:utf8 C ...

  8. mysql 服务器 utf8_MySQL编码设置方法 MySQL编码为utf8设置方法

    由上图可见database和server的字符集使用了latin1编码方式,不支持中文,即存储中文时会出现乱码.以下是命令行修改为utf-8编码的过程,以支持中文. (1)关闭mysql服务 [pla ...

  9. linux下配置mysql默认编码utf8

    linux下配置mysql默认编码utf8 下面是需要在对应地方加入的配置 [client] default-character-set=utf8[mysqld] character-set-serv ...

最新文章

  1. MySQL参数优化辅助工具_mysqltuner.pl
  2. DGA短域名(360样本) mark下 下次分析可以参考
  3. 翻译:创建 Windows8 应用 Part I: Hello, world!
  4. eclipse去掉javascript校验
  5. 第12章 与Spring集成
  6. Java开发中JDBC连接数据库代码和步骤
  7. python 按从小到大的顺序组合成一个字典_将Python字典排列组合成字典列表
  8. python 表单中值为空的还需要传入么_牛掰!100行Python,自动动手打造一款多国语言翻译软件...
  9. 显示分类对应的文章数目,为空的设置为0,按文章数目排序
  10. 电流纹波率取r = 0.4的原因 // 《精通开关电源设计》P48:r的最优值
  11. InstallShield使用完全教程
  12. 【Tableau Desktop 企业日常技巧12】Tableau CA或者CDA 考试真题(附带国外面试题目)
  13. 模拟器:思科 配置静态路由+下一跳如何配置,使三个路由器相互通信
  14. 对组件、模块、子系统、系统、框架、架构 定义浅析
  15. 什么是公约数/公因数
  16. python概率编程_TensorFlow新功能:TensorFlow Probability概率编程工具箱介绍
  17. CSS实现的带头像的彩色垂直菜单源码
  18. win11电脑中文用户名修改成英文用户名
  19. 研究生“计算机通信新技术”课程复习题(2016年)
  20. 『小项目』打字小游戏

热门文章

  1. java元类_元类 - 一心不乱 - 博客园
  2. 云原生的本质_什么是云原生?云原生和传统软件有什么区别?有什么特征
  3. 计算机关机键消失了,如何解决Windows7电脑中的关机键不见了
  4. oracle 加号 用法,Oracle的加号(+)表示法和ansi JOIN符号之间的区别?
  5. 最长回文串之中心扩散法
  6. 三坐标测量圆直径_基于三坐标测量机的渐开线齿轮,测量方法
  7. spine纹理解包 黑底_本期全欧美阵容!种草了艾玛罗的斑马纹,海狸的针织Bra【海报街拍】...
  8. Spring中的InitializingBean接口
  9. MySQL中的调度器
  10. 使用IE浏览器访问JSP界面,当使用断点时相关的样式会显示,当不适用断点时,相关的样式不会显示