我正在使用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 ;
我已经尝试将文本设为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
。
答案 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文件。