python - 将二进制数据插入 longblob 列时出现 pymysql 编码错误

标签 python mysql pymysql

我正在尝试将二进制文件的内容插入到 longblob 列中:

Python代码:

conn = pymysql.connect(...)
cursor = conn.cursor()
with open('test.bz2', 'rb') as fp:
    data = fp.read()
cursor.execute('insert into test_t (test) values (%s)', [data])

错误堆栈跟踪:

Traceback (most recent call last):
  File "./doit2", line 9, in <module>
    cursor.execute('insert into test_t (test) values (%s)', [data])
  File "/u02/srm_tp/local/lib/python3.4/site-packages/pymysql/cursors.py", line 127, in execute
    result = self._query(query)
  File "/u02/srm_tp/local/lib/python3.4/site-packages/pymysql/cursors.py",     line 275, in _query
    conn.query(q)
  File "/u02/srm_tp/local/lib/python3.4/site-packages/pymysql/connections.py", line 763, in query
    sql = sql.encode(self.encoding)
UnicodeEncodeError: 'latin-1' codec can't encode character '\udcae' in position 45: ordinal not in range(256)

创建表脚本:

mysql> show create table test_t;
+--------+--------------------------------------------------------------------------+
| Table  | Create Table                                                             |
+--------+--------------------------------------------------------------------------+
| test_t | CREATE TABLE `test_t` (
  `test` longblob
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+--------+--------------------------------------------------------------------------+

默认编码:

=->python3 -c 'import sys; print(sys.getdefaultencoding())'
utf-8

添加“charset='utf8', use_unicode=True”来连接调用,将​​错误更改为:

Traceback (most recent call last):
  File "./doit2", line 13, in <module>
    cursor.execute('insert into test_t (test) values (%s)', [data])
  File "/u02/srm_tp/local/lib/python3.4/site-packages/pymysql/cursors.py", line 127, in execute
    result = self._query(query)
  File "/u02/srm_tp/local/lib/python3.4/site-packages/pymysql/cursors.py", line 275, in _query
    conn.query(q)
  File "/u02/srm_tp/local/lib/python3.4/site-packages/pymysql/connections.py", line 763, in query
    sql = sql.encode(self.encoding)
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcae' in position 45: surrogates not allowed

最佳答案

This应该做的伎俩:

conn = pymysql.connect(...)
conn.set_character_set('utf8')
cursor = conn.cursor()
cursor.execute('SET NAMES utf8;') 
cursor.execute('SET CHARACTER SET utf8;')
cursor.execute('SET character_set_connection=utf8;')
with open('test.bz2', 'rb') as fp:
    data = fp.read()
cursor.execute('insert into test_t (test) values (%s)', [data])

关于python - 将二进制数据插入 longblob 列时出现 pymysql 编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31227826/

相关文章:

python - Datetime 的 strftime 格式不正确

python - 不可散列类型 : 'dict' while applying a function with pandas?

python - 如何在 matplotlib 约束布局模式下检索轴的真实位置

MySQL Group 和 Concat 多列

mysql - switch 语句内的奇怪结果

mysql - pymysql3cursor.lastrowid 有时不起作用

python - 如何在 reportlab,python 中创建具有不同页面大小的 PDF 文档

mysql - 新手 : mysql join 2 tables to gether and count the results

python - PyMySQL 插入不起作用

python - 如何将变量传递给 MySQL 的 LIMIT 子句?