MySql数据库中文字符乱码问题之set names utf8

原创 2018年04月17日 20:58:34

利用php链接数据库实现“查询”和“添加”,英文字符相安无事,中文确出现乱码,学习发现原因如下:

首先给出解决办法:

原代码:

$conn = mysqli_connect('localhost', 'root', 'passworld', 'test');

$query = mysqli_query($conn, 'select * from users;');

修改之后:

$conn = mysqli_connect('localhost', 'root', 'passworld', 'test');

mysqli_query($conn, 'set names utf8');

$arr = "select * from users";

$query = mysqli_query ($conn, $arr); 

核心就是在进行数据库查询时加了一个'set names utf8'。

经过学习,解释如下:

mysql5提供了以下几个设置字符集的系统变量:

character_set_client 客户端字符集

character_set_connection 客户端与服务器端连接采用的字符集

character_set_results SELECT查询返回数据的字符集

character_set_database 数据库采用的字符集

乱码问题一般是由于以上几个变量设置错误照成的,所以只要理解这几个变量,就可以告别乱码了。

使用上述变量,要理解这个核心思想

 character_set_client、character_set_connection、character_set_database编码要一致;

 character_set_results则保证与SELECT返回的结果与当前程序的编码一致。

我们可以在程序中使用 set names来同时设置character_set_client, character_set_connection, character_set_results这三个系统变量。

例如 set names 'utf8' 等同于 :

set  character_set_client = 'utf8'

set  character_set_connection = 'utf8'

set  character_set_results = 'utf8'

一般情况下,当数据库与数据库表的字符集为utf8,我们再在程序里设置set names 'utf8'命令,这样就能保证无乱码了,但是,这里还要注意character_set_results变量的值,character_set_results的字符值是用来显示返回给用户的编码的。

例如,你的数据库(character_set_database)用的是utf8的字符集,那么你就要保证character_set_client,character_set_connection也是utf8的字符集。而你的程序也许采用的并不是utf8,比如你的程序用的是gbk,那么你若把character_set_results也设置为utf8的话就会出现乱码问题。此时你应该把character_set_results设置为gbk。这样就能保证数据库返回的结果与你的程序的编码一致。

在Navicat中利用SHOW VARIABLES LIKE 'character%';命令可以查看当前数据库情况:


PHP PDO 安全执行 set names utf8 的正确方法

PDO 注入方法 其他的比如直接执行 `set names utf8`是老版本的PHP,因为不支持绑定,所以才只能这样。但存在注入漏洞。 老版本PHP 的 PDO 注入方法,,,(将PHP升级到最新稳...
  • default7
  • default7
  • 2015-08-22 22:42:51
  • 6043

MySql中SET NAMES utf8详解(乱码原理)

不多说,先上图 分析: set names utf8之前, character_set_client     | gbk character_set_connection| gbk ch...
  • kakarot5
  • kakarot5
  • 2014-10-14 23:00:08
  • 5184

mysql_query('set names utf8')解决浏览器或者数据库中文乱码的问题?

在mysql数据库中有3个变量: character_set_client character_set_connection character_set_results 你可以分别理解为:客户...
  • huanleyan
  • huanleyan
  • 2014-02-22 11:27:17
  • 3452

set names utf8 详解

以为pconnect有问题,迷惑了好长时间,但是最后竟然发现自己错将set names utf8写成set names utf-8了,真糊涂! 下面文章偷来的,仅供参考! 新的主机的Mysql是5...
  • huangjianxiang1875
  • huangjianxiang1875
  • 2012-08-19 11:27:55
  • 2177

SQL出现乱码?加上“SET NAMES UTF8”吧

一、SQL出现乱码解决办法为了让你的网页能在更多的服务器上正常地显示,还是加上“SET NAMES UTF8”吧。 在MySQL Command Line Client里面输入“show varia...
  • qq_34648000
  • qq_34648000
  • 2016-11-05 17:15:25
  • 1055

为了让你的网页能在更多的服务器上正常地显示,还是加上“SET NAMES UTF8”吧

为了让你的网页能在更多的服务器上正常地显示,还是加上“SET NAMES UTF8”吧2007-05-28 09:18 ...
  • wzwsj1986
  • wzwsj1986
  • 2007-08-02 23:50:00
  • 15309

mysql_query("SET NAMES 'utf8'",$link);解决php中文乱码

解决php中文乱码 mysql_query("SET NAMES 'utf8'",$link);   有效解决php中文乱码 mysql_query("SET NAMES 'utf8'");     ...
  • ktz666
  • ktz666
  • 2010-06-13 17:01:00
  • 3251

关于对php中使用set names utf8语句的理解

解决乱码的方法,我们经常使用“set names utf8”,那么为什么加上这句代码就可以解决了呢?下面跟着我一起来深入set names utf8的内部执行原理 先说MySQL的字符集问题。W...
  • cxk_mz
  • cxk_mz
  • 2017-08-15 08:15:16
  • 180

mysqli_query("set names gb2312")设置客户端字符集

$id=mysqli_connect("localhost","root","root"); //数据库连接 mysqli_select_db("db_php",$id); //选择数据库mysqli...
  • XavierDarkness
  • XavierDarkness
  • 2016-11-17 20:40:19
  • 2182

mysql set names utf8解决乱码的方法(转)

解决乱码的方法,我们经常使用“set names utf8”,那么为什么加上这句代码就可以解决了呢?下面跟着我一起来深入set names utf8的内部执行原理 先说MySQL的字符集问题。Win...
  • xiaoxu21cn
  • xiaoxu21cn
  • 2012-04-16 14:13:53
  • 968
收藏助手
不良信息举报
您举报文章:MySql数据库中文字符乱码问题之set names utf8
举报原因:
原因补充:

(最多只允许输入30个字)