$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';"));
更新 2012 年 7 月 25 日 04:11 EST
现在我知道这是编码问题。
$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