2017-11-27 80 views
0

は、私は、MySQL JSON列にJSONオブジェクトを挿入しようとしていると私は取得しています:MYSQL:無効なJSONテキスト: "無効なエスケープ文字(文字列内)"

"summary":"Summary of Qualifications:\nAccomplished and results-driven General Business Director with a consistent track record."

I:Invalid JSON text: "Invalid escape character in string."

問題の文字は、オブジェクトのこの部分で\nですJSON_OBJECT、JSON_QUOTEを試してみましたが、私の最近の試行には、

summary.replace("\n", "\\n")が含まれています。既存のエスケープ文字を適切なものに置き換える方法はありますか?エスケープ文字。

Node、Express、JawsDBを使用しています。

編集:ここでは、実際の挿入コードがあります:

const fields = '(myField)'; 
const values = `('${JSON.stringify(field.contents || {})}')`; 
db.query('INSERT INTO mydb ' + fields + ' VALUES ' + values, 
    err => { 
     if (err) { 
      console.log(values); 
      throw(err) ; 
     } 
    } 
); 
+0

代わりに、私はstringfyをjsonと言い、mysqlのvarcharカラムに入れて、再検索時にjson.parseを使って文字列を解析します。 –

+0

'\ n'が問題になるとは何でしょうか?どのようにインサートを実際にやっていますか?プレースホルダ? (例えば、 'VALUES(?)')? –

+0

@ Michael-sqlbotが実際のコードを追加しました。ここにプレースホルダを使用しています。また、それはオブジェクトの違反行#を教えてくれます。代わりに\ nの前にコロンを置くことができます。 –

答えて

1

あなたが危険な(SQLインジェクション)で文字列の連結、およびエラーが発生しやすい(予期しない/正しくない文字列エスケープ、問題にクエリを構築しています文字列に埋め込まれた引用符')の練習。

プレースホルダを使用するようにリライトあなたのクエリは、正常に動作するはずです:

db.query('INSERT INTO mydb ' + fields + ' VALUES (?)', [ JSON.stringify(field.contents || {}) ], err ... 

根本的な問題は、それがASCIIの0x10(改行を意味MySQLのリテラル文字列式で、\n\ + nを意味するものではないことにされました)。 JSONでは、引用文字列内の改行文字は無効です - JSON文字列の改行は\ + nという2つの文字としてシリアル化されます。また、MySQLの文字列パーサーはこのパターンをJSONと同じ意味で認識します基本的に偶然ですが、この慣習は一般的です。ここでは、MySQLに2つの文字を送信しようとしているが、パーサーがそれを解釈するので、それはあなたに噛まれます。

あなたは サーバが+ nリテラル \として解釈し、文字列、中 \\\を倍にすることによってこの問題を回避ハッキング を働いたが、データベース・ドライバ・モジュールは引用任意の必要を処理することが可能とするためにエスケープしている可能性があなたはもっと正しいアプローチです。