【发布时间】:2015-07-05 06:45:01
【问题描述】:
我正在尝试将二进制文件的内容插入到 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
【问题讨论】: