加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2021-08-28 03:45:54 所属栏目:大数据 来源: https://www.jb51.cc
导读:参见英文答案 UTF-8 all the way through????????????????????????????????????13个 我正在使用PHP 5.5,当我尝试在MysqL数据库中插入UTF-8字符时,PDO会在第一个非ASCII字符处将其删除. 我已将我的连接设置为: (DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME

参见英文答案 > 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 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.

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读