$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