返回
数据
分类

names utf8的内部执行原理,先说MySQL的字符集问题

日期: 2020-01-02 08:15 浏览次数 : 140

mysql使用set names搞定乱码难点的原理

先说MySQL的字符集难题。Windows下可通过改正my.ini内的 PHP代码 复制代码 代码如下: [mysql]必赢手机登录网址 , default-character-set=utf8 //顾客端的默许字符集 [mysqld] default-character-set=utf8 //服务器端默许的字符集 假使大家把多个都设为utf8,然后在MySQL Command Line Client里面输入“show variebles like“character_set_%”;”,可观察如下字符: 复制代码 代码如下: character_set_client latin1 character_set_connection latin1 character_set_database utf8 character_set_results latin1 character_set_server utf8 character_set_system utf8 假如大家经过应用UTF-8的PHP程序从数据Curry读取数据,很有超大大概是生机勃勃串“?????”或许是此外乱码。 消弭办法是,在连续数据库之后,读取数据此前,先进行生机勃勃项查询“SET NAMES UTF8”,即在PHP里为 mysql_query; //该句话料定要放在数据库服务器连接语句【$connection=mysql_connect($db_host,$db_user,$db_psw卡塔尔(英语:State of Qatar)or die之后 就可以突显符合规律。 到MySQL命令行输入“SET NAMES UTF8;”,然后施行“show variebles like“character_set_%”;”,开采原来为latin1的那多少个变量“character_set_client”、“character_set_connection”、“character_set_results”的值全体产生utf8了,原本是那3个变量在无事生非。 查阅手册,上边那句等于: SET character_set_client = utf8; SET character_set_results = utf8; SET character_set_connection = utf8; 看看那3个变量的效应: 新闻输入路径:client→connection→server; 音信输出路线:server→connection→results。 换句话说,每一个路径要透过3次变动字符集编码。以出现乱码的出口为例,server里utf8的多少,传入connection转为latin1,传入results转为latin1,utf-8页面又把results转过来。假诺三种字符集不相称,例如latin1和utf8,转化进程就为不可逆的,破坏性的。 但这里要声美赞臣(Meadjohnson卡塔尔(قطر‎点,“SET NAMES UTF8”效用只是临时的,MySQL重启后就苏醒暗中同意了。 接下来就提及MySQL在服务器上的结构难点了。岂不是大家每一趟对数据库读写都得加上“SET NAMESUTF8”,以保险数据传输的编码意气风发致?能否由此计划MySQL来到达那四个变量默许就为大家要想的字符集?手册上没说,笔者在英特网也没找到答案。所以,从服务器配置的角度来说,是不能省略掉那行代码的。 总计:为了让你的网页能在越多的服务器上健康地展现,依然拉长“SET NAMES UTF8”吧,尽管你以往从未有过增添那句也能健康访谈。

 

缓和乱码的法门,我们平常使用“set names utf8”,那么为何加上那句代码就足以解决了吧?上面跟着本身联合来浓烈set names utf8的内部实行原理

 

先说MySQL的字符集难点。Windows下可由此改变my.ini内的

 

PHP代码

[mysql] 

default-character-set=utf8    //客户端的默认字符集
[mysqld]

default-character-set=utf8    //服务器端默认的字符集

 

 

假若我们把四个都设为utf8,然后在MySQL Command Line Client里面输入“show variebles like“character_set_%”;”,可以看看到如下字符:

character_set_client   latin1
character_set_connection    latin1
character_set_database     utf8
character_set_results    latin1
character_set_server   utf8
character_set_system     utf8

 

借使我们经过应用UTF-8的PHP程序从数据Curry读取数据,很有望是后生可畏串“?????”可能是其余乱码。

 

排除办法是,在接连数据库之后,读取数据此前,先实施生机勃勃项查询“SET NAMES UTF8”,即在PHP里为

 

mysql_query("SET NAMES UTF8");   

 

 

//该句话确定要放在数据库服务器连接语句

【$connection=mysql_connect($db_host,$db_user,$db_psw)or die("连接服务器失败");】

之后

 

就可以展现正常(只要数据库里新闻的字符符合规律)。

 

到MySQL命令行输入“SET NAMES UTF8;”,然后施行“show variebles like“character_set_%”;”,开掘原先为latin1的那几个变量“character_set_client”、“character_set_connection”、“character_set_names utf8的内部执行原理,先说MySQL的字符集问题。results”的值全体成为utf8了,原本是那3个变量在肇事。

 

翻看手册,上面那句等于:

 

SET character_set_client = utf8;      

SET character_set_results = utf8;     

SET character_set_connection = utf8; 

 

寻访那3个变量的功效:

音讯输入路线:client→connection→server;

新闻输出路线:server→connection→results。

换句话说,种种路线要因而3次变动字符集编码。以现身乱码的输出为例,server里utf8的数目,传入connection转为latin1,传入results转为latin1,utf-8页面又把results转过来。假若二种字符集差异盟,举个例子latin1和utf8,转变进度就为不可逆的,破坏性的。

 

但此处要声澳优点,“SET NAMES UTF8”功能只是有时的,MySQL重启后就恢复生机私下认可了。

 

接下去就聊起MySQL在服务器上的布局难点了。岂不是我们每一趟对数据库读写都得加上“SET NAMESUTF8”,以保障数据传输的编码朝气蓬勃致?能还是不能够经过计划MySQL来达到那四个变量暗中同意就为我们要想的字符集?手册上没说,作者在网络也没找到答案。所以,从服务器配置的角度来讲,是不能省略掉那行代码的。

总结:为了让您的网页能在更加的多的服务器上平日地出示,依旧拉长“SET NAMES UTF8”吧,纵然你现在平素不增加这句也能寻常访谈。

names化解乱码难点的原理 解决乱码的艺术,我们平日选取set names utf8,那么为何加上这句代码就能够消除了呢?上面跟着我一块...