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

利用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%';命令可以查看当前数据库情况:


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页