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