【发布时间】:2014-05-15 17:14:51
【问题描述】:
我使用的是 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 选择重音字符串时,它可以工作!
问题仅出现在 INSERT 和 UPDATE 专门使用 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 ;
我已经尝试将 text 设为 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 是用于测试目的的空字符串,$id 是 2。
【问题讨论】:
-
var_dump($text)产生string(11) "référence"? -
是的,确实如此。
-
在该问题上也尝试过解决方案@MarcusAdams - 没有成功。不过,杰克可能会有所作为。