Python 将二进制数据插入longblob列时pymysql编码错误

Python 将二进制数据插入longblob列时pymysql编码错误,python,mysql,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]) 错误堆栈跟踪: conn = pymysql.connect(...) curso

我正在尝试将二进制文件的内容插入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])
错误堆栈跟踪:

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])
默认编码:

=->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
回溯(最近一次呼叫最后一次):
文件“/doit2”,第13行,在
cursor.execute('插入测试(测试)值(%s)'[data])
文件“/u02/srm_tp/local/lib/python3.4/site packages/pymysql/cursors.py”,执行中的第127行
结果=self.\u查询(查询)
文件“/u02/srm_tp/local/lib/python3.4/site packages/pymysql/cursors.py”,第275行,在
连接查询(q)
文件“/u02/srm_tp/local/lib/python3.4/site packages/pymysql/connections.py”,查询中的第763行
sql=sql.encode(self.encoding)
UnicodeEncodeError:“utf-8”编解码器无法对位置45中的字符“\udcae”进行编码:不允许使用代理
应该做到这一点:

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])
我们应该这样做:

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])
我们应该这样做:

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])
我们应该这样做:

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])


看起来这是一个pymysql错误。我从0.6.4升级到了0.6.6(目前最新版本),这个问题不再存在。

看起来像是一个pymysql错误。我从0.6.4升级到了0.6.6(目前最新版本),这个问题不再存在。

看起来像是一个pymysql错误。我从0.6.4升级到了0.6.6(目前最新版本),这个问题不再存在。

看起来像是一个pymysql错误。我从0.6.4升级到了0.6.6(目前最新版本),问题不再存在。

pymysql没有set\u character\u set函数。我尝试将“charset='utf8',use_unicode=True”添加到connect调用中,错误更改为:UnicodeEncodeError:'utf-8'编解码器无法对位置45中的字符'\udcae'进行编码:不允许代理尝试连接
charset=“utf8”
,例如:
db=pymysql.connect(host=“localhost”,user=“root”,passwd=“”,db=“testdb”,使用unicode=True,charset=“utf8”)
是的,我做了。抱歉,在我完成输入响应之前按Enter键。现在我得到了:UnicodeEncodeError:“utf-8”编解码器无法对位置45中的字符“\udcae”进行编码:不允许代理尝试运行
yourstring.encode('utf-8')
,然后再尝试将其放入数据库。这是奇怪的部分-我这里不处理字符串。该文件是以二进制形式打开的,当我从中读取时,“data”是bytes.pymysql没有set\u character\u set函数。我尝试将“charset='utf8',use_unicode=True”添加到connect调用中,错误更改为:UnicodeEncodeError:'utf-8'编解码器无法对位置45中的字符'\udcae'进行编码:不允许代理尝试连接
charset=“utf8”
,例如:
db=pymysql.connect(host=“localhost”,user=“root”,passwd=“”,db=“testdb”,使用unicode=True,charset=“utf8”)
是的,我做了。抱歉,在我完成输入响应之前按Enter键。现在我得到了:UnicodeEncodeError:“utf-8”编解码器无法对位置45中的字符“\udcae”进行编码:不允许代理尝试运行
yourstring.encode('utf-8')
,然后再尝试将其放入数据库。这是奇怪的部分-我这里不处理字符串。该文件是以二进制形式打开的,当我从中读取时,“data”是bytes.pymysql没有set\u character\u set函数。我尝试将“charset='utf8',use_unicode=True”添加到connect调用中,错误更改为:UnicodeEncodeError:'utf-8'编解码器无法对位置45中的字符'\udcae'进行编码:不允许代理尝试连接
charset=“utf8”
,例如:
db=pymysql.connect(host=“localhost”,user=“root”,passwd=“”,db=“testdb”,使用unicode=True,charset=“utf8”)
是的,我做了。抱歉,在我完成输入响应之前按Enter键。现在我得到了:UnicodeEncodeError:“utf-8”编解码器无法对位置45中的字符“\udcae”进行编码:不允许代理尝试运行
yourstring.encode('utf-8')
,然后再尝试将其放入数据库。这是奇怪的部分-我这里不处理字符串。该文件是以二进制形式打开的,当我从中读取时,“data”是bytes.pymysql没有set\u character\u set函数。我尝试将“charset='utf8',use_unicode=True”添加到connect调用中,错误更改为:UnicodeEncodeError:'utf-8'编解码器无法对位置45中的字符'\udcae'进行编码:不允许代理尝试连接
charset=“utf8”
,例如:
db=pymysql.connect(host=“localhost”,user=“root”,passwd=“”,db=“testdb”,使用unicode=True,charset=“utf8”)
是的,我做了。抱歉,在我完成输入响应之前按Enter键。现在我得到了:UnicodeEncodeError:“utf-8”编解码器无法对位置45中的字符“\udcae”进行编码:不允许代理尝试运行
yourstring.encode('utf-8')
,然后再尝试将其放入数据库。这是奇怪的部分-我这里不处理字符串。文件是以二进制打开的,当我从中读取时,“数据”是字节。