Symfony 数据库连接 utf8

prepareStatement($query);
$resultset = $statement->executeQuery();
?>

Symfony 在处理 PHP 与 MySQL 连接的时候,用的可能是 latin1 编码,也就是说,用户在表单里提交一个多字节字符串,比如“你好”,经历了如下几步,才进入到数据库:

1、浏览器把用户在输入框输入的内容按 utf8 编码,然后提交到服务端,PHP 接收到这个字符串;
2、PHP 建立 MySQL 连接,这个时候,用的是默认连接,如果当时 MySQL 服务器的连接编码是 latin1(通常默认都是 latin1),那么,PHP 会把接收到的字符串按 latin1 转码,然后传输给数据库;
3、数据库接收到这个字符串,要把它存到表里,由于接收过来的是 latin1 编码的字符串,则就按照这个编码存到表里。

这时会有个问题,数据库、表、字符串字段都是 utf8_general_ci 的编码方式,用 phpMyAdmin 查看,按说是能正常看到中文的。但是,由于 PHP 与 MySQL 是用 latin1 通讯,所以存到表里的是 latin1 字节序的字符,因此得到的是乱码。但是并不妨碍前端显示,因为在 PHP 取数据的时候,会按 latin1 -> utf8 的转换方式还原回来。虽然可以在前端页面正常显示,但我们维护数据库,备份、导入导出的时候看到一大堆乱码,显然很麻烦。

所以,有了最开始的那串代码,它的作用是,让 PHP 与 MySQL 用 utf8 编码方式进行通讯,数据库在往表里写入的时候,就是按照 utf8 字节序写的,因此我们用 phpMyAdmin 或者导出数据库文本文件的时候,都可以正常看到中文。

才疏学浅,不知所云

Leave a Reply

Your email address will not be published.

*