PDO连接数据库的中文乱码问题

时间:2021-10-18 06:37:38

今天在lamp环境下遇到一个非常严重的问题:在本地浏览器客户端中,从服务器数据库里查询出来的内容,只要是中文全都显示成问号 '?????'。

让我十分疑惑,因为 mysql从数据库到数据表全都utf8_general_ci,网站文件php css js html 也全采用utf8编码,而且经过网上资料各种排查试验无果。

 

而且有一个奇怪的现象,就是:

“在客户端新插入的数据,存在数据库中是乱码的,但显示在客户端是不乱码。之前在本地(windows)开发测试时插入的数据,只要是中文,客户端统统显示问号。”

 

问题的原因就很明显了,这说明在存入数据时就出现了问题,并不是数据库自身的原因。mysql php apache中好像跟apache又没什么关系,所以问题肯定出在了php操作数据库的代码里!

 

我是采用pdo来操控数据库的,于是搜索了一下pdo怎样设置utf8编码,在php-pdo官方文档中,好像并没有提及,但是在 User Contributed Notes 中发现这么一段

<?php 
//If you use the UTF-8 encoding, you have to use the fourth parameter :

$db = new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
?>

在实例化PDO时,需要提供第四个参数,来设置编码。

array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'')

再实验用php往数据库中插入数据,发现数据库中新插入的数据不再乱码了,并且客户端展示的数据库中文内容也不再显示问号,原来一切问题都出现在数据库和客户端中间的桥梁--PDO这里