PDO以UTF-8字符切断字符串

时间:2014-05-15 17:14:52

标签: php mysql pdo

我正在使用PHP 5.5,当我尝试在MySQL数据库中插入UTF-8字符时,PDO会以第一个非ASCII字符将其删除。

我已将我的连接设置为:

(DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASS, array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING))

我已经尝试了每个人发布的SET NAMES,但这不起作用,因为问题不在MySQL方面。

当我通过phpMyAdmin插入并直接从MySQL控制台插入时,它可以工作! 当我用PDO选择带重音的字符串时,它可以工作!

问题仅出在INSERTUPDATE上专门使用PDO!

这是表的SQL。它全部是UTF-8,但也许有人知道设置和PDO之间的冲突

CREATE TABLE IF NOT EXISTS `mytable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_lang` int(11) NOT NULL DEFAULT '2',
  `id_tgroup_cat` int(11) NOT NULL,
  `fieldfor` int(11) NOT NULL,
  `colors` varchar(100) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=34 ;

我已经尝试将文本设为varchar字段,并且没有改变任何内容。

PHP中的实际插入:

    $query = $this->db->prepare("UPDATE mytable
                                    SET text = ?,
                                        colors = ?
                                    WHERE id = ?");
    $query->execute(array($text, $colors, $id));

其中$text = "référence"(仅保存数据库中的字母R但没有重音符号可以保存所有内容),$ colors是一个空字符串,用于测试目的,$id2

1 个答案:

答案 0 :(得分:3)

这是我的关键线索:

  

其中$ text =“référence”(仅保存数据库中的字母R,但是   没有重音它保存一切)和$ colors是一个空字符串   用于测试目的,$ id为2。

听起来像是UTF-8编码问题。虽然数据库是UTF-8,但从代码到数据库的整个链 - 包括连接 - 应该是UTF-8清理。

$this->db->prepare究竟与PHP的PHP连接有什么关系?你所展示的代码有点不清楚。但根据你所展示的内容,或许像这样调整你的查询会有所帮助:

$query = $this->db->prepare("SET collation_connection = utf8_bin;
                             SET NAMES utf8;
                             UPDATE mytable
                                SET text = ?,
                                    colors = ?
                                WHERE id = ?");

或许这个:

$this->db->exec("SET collation_connection = utf8_bin; SET NAMES utf8;");
$query = $this->db->prepare("UPDATE mytable
                                SET text = ?,
                                    colors = ?
                                WHERE id = ?");

请注意我强制添加SET collation_connection = utf8_bin;以及SET NAMES utf8;

通常,您需要确保从连接,数据库到表的整个链都是UTF8清理。我对a similar question here有详细的解答。

但在您的情况下,请检查实际的MySQL服务器my.cnf文件。以下将整个链设置为UTF-8:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

编辑:由于原始海报表明数据来自HTML5表单,我还认为检查实际HTML5文件本身的BOM(字节顺序标记)也会有所帮助。它应该设置为UTF8。有关what a BOM is are over here的更多详情。特别是Martin Code接受的答案解释了:

  

UTF-8 BOM是一个允许读者的字节序列(EF BB BF)   将文件标识为UTF-8文件。