MySQL的/ PDO截断数据(MySQL/PDO truncates the data)

2019-06-26 13:09发布

$book是7KB字符串。 如果使用PHP PDO执行此查询exec ,该monograph列(LONGTEXT)数据被截断在6765字符:

echo strlen($book); // output 7157

$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};");

但是,如果我打印查询,并使用SQL客户端(绕过PHP)执行它时,它把所有的数据到数据库中。 这让我觉得这是PHP设置,我还不熟悉。

需要注意的是,如果我用准备好的语句同样是发生(包括与PDO :: PARAM_LOB)。

$book价值前倾倒exec https://gist.github.com/79d5fe1050bbb0e2fac8 (7157)。 ,在该数据库最终的实际数据https://gist.github.com/df49d4a9707660b8b60b (6765)。 我不明白,因为整个查询传递到MySQL(否则SQL语法错误会弹出),这样的数据截断如何在技术上是可行。

echo "UPDATE `chemicals` SET `monograph` = {$db->quote($book)} WHERE `id` = {$db->quote($c['id'])};";

如果我执行使用SQL客户端输出(https://gist.github.com/a05fe4c033e74897b82b),这是在数据库中结束了数据https://gist.github.com/88870fe26a3ae40e991e (7157,预期)。

PDO使用UTF8连接启动。

new PDO('mysql:dbname=[..];host=localhost;charset=utf8', 'root', '[..]', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';"));

UPDATE 4:11 ET 2012年7月25日

现在我知道这是编码问题。

$db->exec("UPDATE `chemicals` SET `monograph` = {$db->quote(utf8_decode($book))} WHERE `id` = {$db->quote($c['id'])};");

不过,我静不知道该怎么办才好。 我对MySQL连接是unicode了。

/etc/my.cnf被配置为使用以下设置服务器范围。

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

Answer 1:

有在这里做了两个百分点。 一个是理想的所有字符编码必须是UTF8 -这是服务器,客户端连接,并表。 二是PHP的strlen功能字节数为单位,而不是字符。

你的表字符集可能不被设置为UTF8 你可以做

SHOW CREATE TABLE chemicals;

检查。 你也应该把它们添加到您my.cnf

[mysqld]
character-set-client=utf8
character-set-results=utf8

了解更多关于MySQL的字符集,在这里:

MySQL的字符集



Answer 2:

原来,是因为它是一个编码问题。 该两种解决方案。 最明显的是固定编码匹配数据库/连接设置。 就我而言,我得到一个iso-8859-1的字符串,并将其解释为Unicode。

然而,它不应该是一个问题呢。 我又进一步发现, PDO::ATTR_EMULATE_PREPARES被默认设置为TRUE。

  • 你会发现这个话题作为一个有用的摘要,了解什么是后面的设置意味着, PDO MySQL的:使用PDO :: ATTR_EMULATE_PREPARES与否? 。
  • 本主题将解释为什么编码搞砸查询方式PDO参数化查询工作 。


文章来源: MySQL/PDO truncates the data