Skip to content

Instantly share code, notes, and snippets.

@njujerry
Last active April 19, 2017 09:10
Show Gist options
  • Save njujerry/3c4021f43ed96a6cdaaf3434e250ce24 to your computer and use it in GitHub Desktop.
Save njujerry/3c4021f43ed96a6cdaaf3434e250ce24 to your computer and use it in GitHub Desktop.
Mysql乱码问题关键点总结

Mysql乱码问题关键点总结

1、 PHP 程序在查询数据库之前,首先执行 mysql_query("SET NAMES xxxx"); 其中 xxxx 是你网页的编码(charset=xxxx),如果网页中 charset=utf8,则 xxxx=utf8,如果网页中 charset=gb2312,则xxxx=gb2312,几乎所有 WEB 程序,都有一段连接数据库的公共代码,放在一个文件里,在这文件里,加入 mysql_query("SET NAMES xxxx") 就可以了。

2、 SET NAMES 显示客户端发送的 SQL 语句中使用什么字符集。因此,SET NAMES 'utf-8' 语句告诉服务器“将来从这个客户端传来的信息采用字符集 utf-8”。它还为服务器发送回客户端的结果指定了字符集(例如,如果你使用一个 SELECT 语句,它表示列值使用了什么字符集)。

3、http头和html标签中设置编码的区别: http 标头是服务器以 http 协议传送 HTML 信息到浏览器前所送出的字串。而 标签是属于 HTML 信息的,所以 header() 发送的内容先到达浏览器,通俗点就是header() 的优先级高于html标签 (不知道可不可以这样讲)。假如一个 php 页面既有header("content-type:text/html; charset=xxx"),又有<meta charset=YYY>,浏览器就只认前者 http 标头的XXX而不认 meta中的YYY 了。当然这个函数只能在 php 页面内使用。

4、apache的default charset的影响 Apache 根目录的 conf 文件夹里,有整个 Apache 的配置文档 httpd.conf。 用文本编辑器打开 httpd.conf,第 708 行(不同版本可能不同)有 AddDefaultCharset xxx,xxx为编码名称。这行代码的意思:设置整个服务器内的网页文件 http 标头里的字符集为你默认的 xxx字符集。有这行,就相当于给每个文件都加了一行 header("content-type:text/html; charset=xxx")。这下就明白为什么明明 设置了是 utf-8,可浏览器始终采用 gb2312 的原因。 如果网页里有 header("content-type:text/html; charset=xxx"),就把默认的字符集改为你设置的字符集,所以这个函数永远有用。如果把 AddDefaultCharset xxx 前面加个"#",注释掉这句,而且页面里不含 header("content-type…"),那这个时候就轮到 meta 标签起作用了。 下面列出以上的优先顺序: header("content-type:text/html;charset=xxx") >apache的配置文件中的 AddDefaultCharset xxx>html的meta标签

如果你是 web 程序员,建议给你的每个页面都加个header("content-type:text/html; charset=xxx"),这样就可以保证它在任何服务器都能正确显示,可移植性也比较强。

5、 从mysql5开始,多了几个设置字符集的系统变量: character_set_client:客户端字符集 character_set_connection:客户端与服务器端连接和操作的SQL语句采用的字符集 character_set_results:SELECT查询返回数据的字符集 character_set_database:数据库采用的字符集

set names实际上就是同时设置了character_set_client, character_set_connection, character_set_results这三个系统变量。

—>>设置某个变量的值可以通过如下命令: 【set @@character_set_client = 'gbk'】

6、具体设置,四个一致: a、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致; b、要保证通讯的字符集与数据库的字符集一致,即character_set_client, character_set_connection与character_set_database一致; c、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致; d、要保证程序编码与浏览器编码一致,即程序编码与 <meta http-equiv="Content-Type" content="text/html; charset=XXX"/>一致。

7、 如果网站已经运作了好久,已有很多旧数据,不能再更改简体中文的设定,那么建议将页面的编码设为 GBK, GBK与GB2312的区别就在于:GBK能比GB2312显示更多的字符,要显示简体码的繁体字,就只能用GBK. 使用mysql+php产生乱码的原因都了解得很清楚了,那么解决就不困难了. mysql+php产生乱码的解决办法: 如果安装mysql的编码已不能更改,很多朋友是购买虚拟主机建立网站,无权更改MYSQL的安装编码,这一关我们可以跳过,因为只要后面的步聚正确,一样能解决乱码问题 修改数据库编码,如果是数据库编码不正确,可以在phpmyadmin 执行如下命令: ALTER DATABASE ‘test’ DEFAULT CHARACTER SET utf8 COLLATE utf8_bin 以上命令就是将test数据库的编码设为utf8. 修改表的编码: ALTER TABLE ‘category’ DEFAULT CHARACTER SET utf8 COLLATE utf8_bin 以上命令就是将一个表category的编码改为utf8. 修改字段的编码: ALTER TABLE ‘test’ CHANGE ‘dd’ ‘dd’ VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL 以上命令就是将test表中 dd的字段编码改为utf8. 如果是这种情况容易解决,只需检查下页面,修改源文件的charset即可. 这种情况也是修改页面charset即可. 在连接数据库的语句中. mysql_connect(‘localhost’,'user’,'password’); mysql_select_db(‘my_db’); mysql_query("set names utf8"); //select 数据库之后加多这一句 为了避免PHP页面乱码的发生,PHP页面开始第一句 header("content-type:text/html; charset=utf-8");

//强行指定页面的编码,以避免乱码

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment