ファイルからJSON文字列を読み込み、解析してからMySQLデータベースに挿入しています。私のINSERTクエリは、次のエラーがスローされます。ユニコード文字列になるファイルをDB挿入から読み取る
SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE3\xADs' for column 'fname' at row 1
私は、エラーの原因となるコンテンツは、名前Ailís
(エラーがスローされるまで、私はIDをエコー)でí
であると考えています。
- ファイルUTF8は、私はUTF8コンテキスト
- を使用してファイルを読んでいます
- をエンコードされているように私は私のPDO接続がUTF8を持っているUTF8(それは)
- するデータのエンコーディングをチェックしています文字セット、ならびに
SET NAMES utf8
- データベースはUTF8が
- 符号化されたテーブルは、UTF8が
- 符号化カラムであるUTF8は に符号化されます
コード:
$opts = ['http' => ['header' => 'Accept-Charset: UTF-8, *;q=0']];
$context = stream_context_create($opts);
$post = file_get_contents('sample_data/11111a_json_upload.json',false, $context);
if(!mb_check_encoding($post, 'UTF-8'))
throw new Exception('Invalid encoding detected.');
$data = json_decode($post, true);
私はJSONをデコードする前に、私はまた、次の関数を挿入:私はRAWファイルを読み込むとき
static function clean_unicode_literals($string)
{
return preg_replace_callback('@\\\(x)?([0-9a-zA-Z]{2,3})@',
function ($m) {
if ($m[1]) {
$hex = substr($m[2], 0, 2);
$unhex = chr(hexdec($hex));
if (strlen($m[2]) > 2) {
$unhex .= substr($m[2], 2);
}
return $unhex;
} else {
return chr(octdec($m[2]));
}
}, $string);
}
、と私はブラウザに解析されたデータをエコーするとき、名前が正しく表示されます。したがって、問題は私の接続のどこかにあると思いますか?
私はそうのような新しいPDOインスタンスを作成:
public function __construct($db_user, $db_pass, $db_name, $db_host, $charset)
{
if(!is_null($db_name))
$dsn = 'mysql:host=' . $db_host . ';dbname=' . $db_name . ';charset=' . $charset;
else
$dsn = 'mysql:host=' . $db_host . ';charset=' . $charset;
$options = [
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"
];
try
{
$this->db_handler = new PDO($dsn, $db_user, $db_pass, $options);
$this->db_handler->exec('SET NAMES utf8');
$this->db_valid = true;
}
catch(PDOException $e)
{
$this->db_error = $e->getMessage();
$this->db_valid = false;
}
return $this->db_valid;
}
(私はトラブルシューティングだとのSET NAMESが二回あります...)
データベース、テーブル、カラム文字セットがutf8_general_ci
に設定されています。
私のIDEがPHPStormある、と私は、Windows 10上にWAMPのMySQL 5.7.14を実行しています
実際に挿入するコードはどこにありますか? – Sammitch