5

$book7kbの文字列です。このクエリが PHP PDO を使用して実行される場合execmonograph列 (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 を含む) を使用すると、同じことが起こることに注意してください。

$bookexec 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 07 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
4

2 に答える 2

1

ここで指摘すべき点は 2 つあります。UTF81 つは、理想的には、サーバー、クライアント、接続、およびテーブルのすべての文字エンコーディングがそうでなければならないということです。2 つは、PHP のstrlen関数が文字数ではなくバイト数をカウントすることです。

テーブルの文字セットが に設定されていない可能性がありますUTF8。できるよ

SHOW CREATE TABLE chemicals;

それを確認します。これらも に追加する必要がありますmy.cnf

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

MySQL 文字セットの詳細については、こちらをご覧ください。

MySQL 文字セット

于 2012-07-25T11:35:13.473 に答える
0

エンコードの問題であることが判明しました。2つのソリューションです。最も明白な方法は、データベース/接続設定に一致するようにエンコーディングを修正することです。私の場合、iso-8859-1文字列を取得して Unicode として解釈していました。

ただし、とにかく問題になるべきではありません。PDO::ATTR_EMULATE_PREPARESさらに進んで、デフォルトで TRUE に設定されていることを発見しました。

于 2012-07-26T06:28:36.503 に答える