PHP+MySql字符问题原理分析
假如数据库已经设置了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字符问题原理分析的更多相关文章
- MySQL索引结构原理分析
我们在学习MySQL的时候经常会听到索引这个词,大概也知道这是什么,但是深究下去又说不出什么道道来.下面将会比较全面的介绍一下关于索引! 1 索引是什么? 这里用百度百科的一句话来说,在关系数据库中, ...
- 干货 MySQL常见的面试题 + 索引原理分析
常见的面试必备之MySQL索引底层原理分析: MySQL索引的本质 MySQL索引的底层原理 MySQL索引的实战经验 面试 1)问题:数据库中最常见的慢查询优化方式是什么? 回答:加索引 2)问题: ...
- MYSQL索引结构原理、性能分析与优化
[转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...
- 【转】由浅入深探究mysql索引结构原理、性能分析与优化
摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...
- Mysql报错注入原理分析(count()、rand()、group by)
Mysql报错注入原理分析(count().rand().group by) 0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截 ...
- Mysql数据库事务的隔离级别和锁的实现原理分析
Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...
- 【MySQL 原理分析】之 Trace 分析 order by 的索引原理
一.背景 昨天早上,交流群有一位同学提出了一个问题.看下图: 我不是大佬,而且当时我自己的想法也只是猜测,所以并没有回复那位同学,只是接下来自己做了一个测试验证一下. 他只简单了说了一句话,就是同样的 ...
- 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 ...
- 数据库MySQL 之 索引原理与慢查询优化
数据库MySQL 之 索引原理与慢查询优化 浏览目录 索引介绍方法类型 聚合索引辅助索引 测试索引 正确使用索引 组合索引 注意事项 查询计划 慢查询日志 大数据量分页优化 一.索引介绍方法类型 1. ...
随机推荐
- WebSocket 浅析
版权声明:本文由史燕飞原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/241 来源:腾云阁 https://www.qclo ...
- java 集合(Map3)
Map接口下的实现类: HashMap 1.存储原理: 向HashMap中添加元素时,首先会调用hashCode(),算的哈希值,然后 算出该元素在哈希表中的存储位置. 情况1 情况2(java 集 ...
- java线程中断和终止线程运行
ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程 ...
- Git入门及上传项目到github中
最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...
- 词法分析器--DFA(c++实现)
语言名为TINY 实例程序: begin var x,y:interger; x:=; read(x); then x:=x-y; x:=x+y; write(x); end TINY语言扫描程序的D ...
- mysql知识初篇(一)
mysql介绍 (1) mysql数据库是瑞典AB开发. (2) mysql--> sun --> oracle. (3) mysql数据库的特点. 1. 开源. 2. 免费. 3. 跨平 ...
- Combination Sum [LeetCode]
Problem Description: http://oj.leetcode.com/problems/combination-sum/ Basic idea: It seems complicat ...
- Provisioning Profile 导入真机
双击Provisioning Profile文件. 然后在xcode中运行. 会自动导入手机.
- Sql语句统计多表个数并求和
) FROM ((SELECT BaseID FROM dbo.Life_cheliang WHERE BaseCreateDate BETWEEN '2015-6-5' AND '2015-6-11 ...
- C语言实现进制转换
#include<stdio.h> int main() { char ku[16]={'0','1','2','3','4','5','6','7','8','9','A','B ...