微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

参见英文答案 > 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究竟与PHPPHP连接有什么关系?你所展示的代码有点不清楚.但根据你所展示的内容,或许像这样调整你的查询会有所帮助:

$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 collat​​ion_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 举报,一经查实,本站将立刻删除。

相关推荐