今天在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这里!
时间: 2024-11-05 10:59:22