假如数据库已经设置了utf-8 ,php文件也设置了utf-8 ,但在php文件的查询语句中未添加了 mysql_query("set names utf8")语句,此时php页面显示正常的汉字,没有乱码。但是会发现用可视化工具连接数据库查看数据时,虽然可视化工具也已经设置了utf8编码,但在可视化工具上显示的就是乱码。因此怀疑实际上存入数据库的真实内容就是乱码,而之所以在浏览器显示正常,可能中间又经过了一个逆转化过程,把存在数据库真实乱码数据由转化为了正常数据,然后返回给浏览器,所以浏览器看上去是正常汉字,但实际上数据库中存的内容缺不是正常汉子。

原理分析:【纯属个人理解,不一定准确】

在mysql数据库中有3个变量:
character_set_client
character_set_connection
character_set_results
你可以分别理解为:客户端、连接器、返回值

客户端 :通常有cmd下的命令行,或者浏览器
连接器 :这个比较抽象,我们看不到,应该是在mysql数据库中的
返回值 :
就是以什么样的字符编码来给客户端

我们一般在cmd下set names gbk 或者php文件中 mysql_query('set names utf8'),其实就是相当于同时设置上面所说的3个变量的值为 gbk 或者 utf8 ,也就是客户端、连接器、返回值都为一样的字符编码,如果你足够耐心也可以再mysql命令行下分别设置这3个变量的值,比如:
set
character_set_client =gbk;
set character_set_connection = gbk;
set
character_set_results = gbk;

现在分析最开头提出的问题:数据库已经设置了utf-8 ,php文件也设置了utf-8 ,但未添加了mysql_query("set names utf8")语句,用浏览器查看,如果你的浏览器应该是urf8字符集,那在浏览器上显示正常汉字,但可视化的数据库连接工具显示的是乱码。我怀疑数据库中的内容就是乱码。

其实,问题应该就是出在连接器这个环节上。字符集设置有个限制,那就是字符集编码的大小,应该是这个规律: 客户端 <= 连接器 <= 服务端

那么我在说下连接器的作用,连接器就是接受客户端传来的数据,先接受保存起来,在转换成服务端所需的字符编码。比如客户端是GBK ,连接器也是GBK,服务端是UTF8,那么 连接器就会把客户端传来的GBK数据先存储起来,转换成服务器的UTF8后传给服务器。

那么回到字符集设置规律上,GBK存储汉字需要2个字节,UTF8存储汉字需要3个字节 ,如果你的客户端是UTF8,而连接器是GBK,那么就会在存储上出现问题,所以存入数据库后就会乱码【连接器接收到客户端数据是二进制码,一律认为是GBK码(但实际上客户端可能设置的是utf8码),把这个实际是utf8码的数据当成了GBK码利用公式f(x)转换为了自己认为的utf8码,也就是把真实的utf8数据进行了f(x)转换,也就成了乱码。本来如果不转换就没问题,但它多余的做了一步转换工作,所以最终存在数据库中的数据是乱码了。当我们从浏览器要求取数据时,由于连接器又进行了一步逆转换f'(x),所以数据库中的乱码数据又在页面恢复正常了】。

总结:由上面的分析可见,如果数据库已经设置了utf8编码,在浏览器页面存入数据库数据时,一定要加上mysql_query("set names utf8")语句,这样连接器才不会多余的进行一次f(x)转换,存入数据库的数据才是正常的汉字数据,否则虽然在浏览器看到的数据可能是正常汉字,但数据库中存的可能是乱码。总之,一定要保持连接器和数据库的字符集一样,而mysql_query("set names utf8")语句就是起到这个作用。

PHP+MySql字符问题原理分析的更多相关文章

  1. MySQL索引结构原理分析

    我们在学习MySQL的时候经常会听到索引这个词,大概也知道这是什么,但是深究下去又说不出什么道道来.下面将会比较全面的介绍一下关于索引! 1 索引是什么? 这里用百度百科的一句话来说,在关系数据库中, ...

  2. 干货 MySQL常见的面试题 + 索引原理分析

    常见的面试必备之MySQL索引底层原理分析: MySQL索引的本质 MySQL索引的底层原理 MySQL索引的实战经验 面试 1)问题:数据库中最常见的慢查询优化方式是什么? 回答:加索引 2)问题: ...

  3. MYSQL索引结构原理、性能分析与优化

    [转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...

  4. 【转】由浅入深探究mysql索引结构原理、性能分析与优化

    摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...

  5. Mysql报错注入原理分析(count()、rand()、group by)

    Mysql报错注入原理分析(count().rand().group by) 0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截 ...

  6. Mysql数据库事务的隔离级别和锁的实现原理分析

    Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...

  7. 【MySQL 原理分析】之 Trace 分析 order by 的索引原理

    一.背景 昨天早上,交流群有一位同学提出了一个问题.看下图: 我不是大佬,而且当时我自己的想法也只是猜测,所以并没有回复那位同学,只是接下来自己做了一个测试验证一下. 他只简单了说了一句话,就是同样的 ...

  8. flink-----实时项目---day07-----1.Flink的checkpoint原理分析 2. 自定义两阶段提交sink(MySQL) 3 将数据写入Hbase(使用幂等性结合at least Once实现精确一次性语义) 4 ProtoBuf

    1.Flink中exactly once实现原理分析 生产者从kafka拉取数据以及消费者往kafka写数据都需要保证exactly once.目前flink中支持exactly once的sourc ...

  9. 数据库MySQL 之 索引原理与慢查询优化

    数据库MySQL 之 索引原理与慢查询优化 浏览目录 索引介绍方法类型 聚合索引辅助索引 测试索引 正确使用索引 组合索引 注意事项 查询计划 慢查询日志 大数据量分页优化 一.索引介绍方法类型 1. ...

随机推荐

  1. MySQL锁监视器

    还在为看不懂何登成的加锁处理分析文章感到羞愧吗? 还在因为何大师的笔误,陷入深深的迷茫吗? 只要你拥有大于5.6.16版本的MySQL,锁监视器你值得拥有! 快速入门 开启 set GLOBAL in ...

  2. 【EasyX】RGB to Gray

    code: #include <graphics.h> #include <conio.h> void main() { initgraph(, ); // 读取图片 load ...

  3. 006-Selenium简介

    1.产生背景 Selenium工具诞生的时间已经超过了10年,目前已经在软件开发公司中得到大规模的应用.2004年,在ThoughtWorks公司,一个名为Jason Huggins的测试同行为了减少 ...

  4. 创建高性能移动 web 站点

    如果你的网站3秒钟没有响应,人们就会失去兴趣了.为了满足响应快这个愿望,需要一个不同的方法在手机上进行分析,设计和测试. 这篇文章将会对Johan Johansson在2013年4月提出" ...

  5. target标签对于优化用户体验的作用

    最近开始关注target="_blank"标签,是源于对咨询区的采纳工作.帖子内容页是在原页面加载,这样问题就来了,每采纳完一个问题,必须得后退好几次才可以,很不方便.后来按ctr ...

  6. Java 集合系列 16 HashSet

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  7. Laravel

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...

  8. struts2视频学习笔记 13-14(自定义局部和全局类型转换器(转换Date格式))

    课时13 自定义类型转换器 局部(对某个action类) package tutorial; import java.util.Date; public class HelloWorld { priv ...

  9. php solr 扩展

    安装php的solr扩展 下载地址: http://pecl.php.net/get/solr windows下载地址: http://downloads.php.net/pierre/php_sol ...

  10. 关于php用simplexml_load_string解析xml出现乱码的小结

    最近在做项目时需要通过xml接口读取合作伙伴数据到数据库,在xml解析环节出现有些特殊中文字符乱码的现象.后采取下面的办法终于解决. 1.curl 抓取过来的字符是unicode编码,需要先转换为ut ...