14

UTF-8でエンコードされた文字列をUTF-8でエンコードされたテーブルに挿入すると、誤った文字列値が返されます。

PDOException:SQLSTATE [HY000]:一般エラー:1366不正な文字列値:'\ xF0 \ x9D \ x84 \ x8E i...'行1の列'body_value'に対して:INSERT INTO

mb_detect_encodingがUTF-8でエンコードされていると主張する文字列に文字があります。この文字列をMySQLテーブルに挿入しようとしています。MySQLテーブルは(とりわけ)として定義されています。DEFAULT CHARSET=utf8

編集: Drupalは常にSET NAMES utf8オプションで行いますCOLLATE(少なくともMySQLと通信する場合)。

編集2:関連性があると思われる詳細。PostgreSQLデータベースからテキストを取得します。オブジェクトに貼り付け、mb_detect_encodingを使用してUTF-8であることを確認し、node_saveを使用してオブジェクトをデータベースに永続化します。そのため、インポートをトリガーするHTTPリクエストがありますが、データはブラウザから取得されません。

編集3:データは2つのテーブルで非正規化されます:

SELECT character_set_nameFROMinformation_schema。COLUMNSC WHERE table_schema = "[database]" AND table_name IN( "field_data_body"、 "field_revision_body")AND column_name = "body_value";

>+--------------------+
| character_set_name |
+--------------------+
| utf8               |
| utf8               |
+--------------------+

編集4:キャラクターが「新しい」である可能性はありますか?私はUnicodeとUTF-8の関係について少し曖昧ですが、このウィキペディアの記事は、キャラクターがごく最近標準化されたことを示唆しています。

「文字列値が正しくない」とどうして失敗するのかわかりません。

4

4 に答える 4

25

(U+1D10E) は、BMP (Basic Multilingual Plane) の外側 (U+FFFF の上) にある文字 Unicode であるため、UTF-8 で 3 バイトで表すことはできません。MySQL charset utf8 は、3 バイトで表現できる場合、UTF-8 文字のみを受け入れます。これを MySQL に保存する必要がある場合は、MySQL 文字セット utf8mb4 を使用する必要があります。MySQL 5.5.3 以降が必要です。ALTER TABLE を使用して、問題なく文字セットを変更できます。文字を格納するにはより多くのスペースが必要なため、文字列のサイズを小さくする必要がある場合があるいくつかの問題が発生します。http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-upgrading.htmlを参照してください。

于 2012-08-14T08:29:30.057 に答える
4

PDO 接続で、文字セットを設定します。

new PDO('mysql:host=localhost;dbname=the_db;charset=utf8mb4', $user, $password);
于 2012-08-13T15:08:38.853 に答える
3

エラーを修正しました: SQLSTATE[HY000]: General error: 1366 Incorrect string value ... with this method:

データベースに utf8mb4_unicode_ci を使用します データベース すべてのテーブルに utf8mb4_unicode_ci を設定 しますテーブル

列に longblog データ型を設定します(テキスト、ロングテキストではありません....コンテンツの 4 バイトを格納するには大きなデータ型が必要です) 田畑

今は大丈夫です。laravel を使用している場合は、引き続き config/database.php を編集します。

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

ララベル

関数 strtolower を使用する場合は、mb_strtolower に置き換えます 注意: <meta charset="utf-8">head タグを付ける必要があります

于 2019-08-28T04:22:22.927 に答える