将 HTML 插入 mysql 数据库显示类型错误
Inserting HTML into mysql Database showing Type Error
我正在使用 Flask 开发 Webapp。在某些时候,我必须将某个 HTML 脚本插入到 MySQL 数据库中:
<h3>Welcome!</h3>
<p>Some text</p>
当我将它插入数据库时(当它被 flask 的 'render_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
) 但它仍然显示相同的错误。为什么?感谢您提供的任何答案。
将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()
我正在使用 Flask 开发 Webapp。在某些时候,我必须将某个 HTML 脚本插入到 MySQL 数据库中:
<h3>Welcome!</h3>
<p>Some text</p>
当我将它插入数据库时(当它被 flask 的 'render_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
) 但它仍然显示相同的错误。为什么?感谢您提供的任何答案。
将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()