【转载】MySQL -- SET NAMES utf8

     一直以 来只知道 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

时间: 2024-11-02 05:56:55

【转载】MySQL -- SET NAMES utf8的相关文章

PHP MYSQL乱码问题,使用SET NAMES utf8校正_php技巧

先记下,免得以后想不起来又到处去找! PHP操作数据库的时候,数据库中数据使用UTF8编码,在读出来的时候,显示的全是???????问号乱码,找了一些资料原来是在读取之前进行一次编码设置: 复制代码 代码如下: create table tablename ( id int not null auto_increment, title varchar(20) not null, contnet varchar(300) defalut null, primary key ('id') )begi

utf-8-求助啊``mysql_query('set names utf8');字符集乱码问号``

问题描述 求助啊``mysql_query('set names utf8');字符集乱码问号`` ``phpmyadmin下字符集乱码和问号,在下已血崩,网上查了很多方法,试过在编译器下添加header("Content-type:text/html;charset=utf-8"); page laguage='php' pageEncoding='utf-8'); 也试过mysql_query('set names utf8'); Mysql配置文件my.ini也设置了默认编码格式

MySQL的中文UTF8乱码问题_Mysql

从MySQL支持Unicode后,为了与时俱进,我们的web程序也开始考虑用UTF8了.其实UTF8也用了好几年了,程序基本能跑,没什么大问题,但是数据倒换的时候,总是遇到不爽的事情. [问题现象] 网页xxx.php用EditPlus另存为UTF8格式,MySQL在my.ini里设置default-character-set=utf8,建表时加了CREATE TABLE `xxx ` (myname varchar(255)) ENGINE=MyISAM DEFAULT CHARSET=utf

php页面,mysql数据库转utf-8乱码,utf-8编码问题总结_php实例

示例一: PHP页面转UTF-8编码问题 1.在代码开始出加入一行: header("Content-Type: text/html;charset=utf-8"); 2.PHP文件编码问题 点击编辑器的菜单:"文件"->"另存为",可以看到当前文件的编码,确保文件编码为:UTF-8,如果是ANSI,需要将编码改成:UTF-8. 3.PHP文件头BOM问题: PHP文件一定不可以有BOM标签,否则,会出现session不能使用的情况,并有类

深入理解mysql SET NAMES和mysql(i)_set_charset的区别_Mysql

说到, 尽量使用mysqli_set_charset(mysqli:set_charset)而不是"SET NAMES", 当然, 这个内容在PHP手册中也有叙及, 但是却没有解释为什么. 最近有好几个朋友问我这个问题, 到底为什么? 问的人多了, 我也就觉得可以写篇blog, 专门介绍下这部分的内容了. 首先, 很多人都不知道"SET NAMES"到底是做了什么, 我之前的文章深入MySQL字符集设置中, 曾经介绍过character_set_client/cha

php中mysql_query(“set names utf-8″)乱码

是在mysql中用utf8表示utf-8而已,就是指代一种编码. 在php中mysql_query("set names utf-8″);因为mysql中定义的是utf8而不是utf-8,所以这条语句是执行不成功的,效果和mysql_query("set names test")一样,所以你存储和获得的mysql编码并没有改变.改为    代码如下 复制代码 mysql_query("set names utf8″);就行了. 各们注意了前面是uft-8而后面是uf

MYSQL数据库使用UTF-8中文编码乱码的解决办法_Mysql

1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将"整理"设置为:"utf8_general_ci" 或执行语句: 复制代码 代码如下: CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;  创建数据表的时候:如果是该字段是存放中文的话,则需要将"整理"设置为:"utf8_general_ci", 如果该字段

mysql中字符集 utf8 和utf8mb4 有什么区别?

可以简单的理解 utf8mb4 是目前最大的一个字符编码,支持任意文字. 为什么会有UTF8MB4? 既然utf8应付日常使用完全没有问题,那为什么还要使用utf8mb4呢? 低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了.三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP).也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8

用于Mysql元数据的UTF8

元数据是"关于数据的数据".描述数据库的任何数据-作为数据库内容的对立面-是元数据.因此,列名.数据库名.用户名.版本名以及从SHOW语句得到的结果中的大部分字符串是元数据.还包括INFORMATION_SCHEMA数据库中的表中的内容,因为定义的那些表存储关于数据库对象的信息. 元数据表述必须满足这些需求: · 全部元数据必须在同一字符集内.否则,对INFORM一个TION_SCHEMA数据库中的表执行的SHOW命令和SELECT查询不能正常工作,因为这些运算结果中的同一列的不同行将