2017-10-10 17 views
4

ファイルから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を実行しています

+0

実際に挿入するコードはどこにありますか? – Sammitch

答えて

1

何かが間違いなくその入力文字列と間違っている:\xE3\xADs

最初のニブルEは、それがあるべきことを示しています3バイトのUTF-8シーケンスですが、2バイトしかありません。

そして、íは、2バイトのシーケンス\xC3\xADとまったく同じです。

clean_unicode_literalsはJSON仕様に従ってすべてのJSON文字列とドキュメントが有効なUTF-8であると考えられている理由が不思議です。

clean_unicode_literalsコールを削除してください。まだエラーが発生している場合は、ソースデータが破損しています。

関連する問題