参见英文答案 > UTF-8 all the way through 13个
我正在使用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选择带重音的字符串时,它可以工作!
问题仅出在使用PDO的INSERT和UPDATE上!
这是表的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.
解决方法:
这是我的关键线索:
Where $text = “référence” (only saves the letter R in the database but
without accents it saves everything) and $colors is an empty string
for test purposes and $id is 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接受的答案解释了:
The UTF-8 BOM is a sequence of bytes (EF BB BF) that allows the reader
to identify the file as an UTF-8 file.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。