代码之家  ›  专栏  ›  技术社区  ›  MisterMM23

将HTML插入mysql数据库时显示类型错误[重复]

  •  -3
  • MisterMM23  · 技术社区  · 6 年前

    我正在使用Flask开发一个Webapp。在某种程度上,我必须将某个HTML脚本插入MySQL数据库:

    <h3>Welcome!</h3>
    <p>Some text</p>
    

    当我将其插入数据库时(当它由flask的“render\u template”函数返回时):

    \n\n<h3>Welcome!</h3>\n\n\n\n<p>Some text</p>
    

    我得到以下错误:

    TypeError: ProgrammingError(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '\\\\\\\\n\\\\n<h3>Welcome!</h3>\\\\n\\\\n\\\\n\\\\n<p>Some text' at line 1") is not JSON serializable

    首先,我不明白“JSON serializable”是什么意思,我想知道我做错了什么。我已经试过取消换行符了( \n )但它仍然显示相同的错误。为什么?我很感谢你能提供的任何答案。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Ron Norris    6 年前

    将HTML写入数据库时常用的解决方案:

    1) 只需将数据库字段类型转换为blob,以便它接受二进制数据,然后将HTML编码为二进制(下面的示例)。 2) 将数据库字段保留为文本字段,但base64对数据进行编码,以便数据库不会抱怨非法字符。

    # Example for case 1.
    # Note that you need to make sure the database field is a blob:
    html = '<h3>Welcome!</h3>\n<p>Some text</p>'
    bin = html.encode()
    dbhandle.execute('INSERT INTO script (various fields, binhtml) VALUES (..., bin)')
    # When you read back the data, remember to decode.
    dbhandle.execute('SELECT binhtml FROM script WHERE...')
    resultset = dbhandle.fetchall()
    htmlresult = resultset.decode()
    
    # Example for case 2.
    # Database field can be a text/varchar type because base64 ensures it will work.
    import base64
    html = '<h3>Welcome!</h3>\n<p>Some text</p>'
    # Convert HTML into base64 encoded *text* so it can be stored in text field.
    encoded =  base64.b64decode(html.encode()).decode()
    # Do the database INSERT.
    ...
    # Retrieve the stored text from the database and convert back to HTML
    dbhandle.execute('SELECT encodedhtml FROM script WHERE...')
    resultset = dbhandle.fetchall()
    htmlresult = base64.b64decode(resultset).decode()