python往mysql的blob字段写入二进制数据
2015-01-06 22:25
1431 查看
Python Cookbook, 2nd EditionRecipe 7.10. Storing a BLOB in a MySQL DatabasePython code?
一直想在MySQL中直接存储二进制数据,尝试到今天也没有解决这个问题,但仍有几点要记录一下,比较乱:可惜设置不了0编号,就将就着在这里写下版本吧。Python 2.4.4,MySQLdb 1.2.1_p2,MySQL 5.0.32
不要使用'%r',比如'INSERT INTO mytbl VALUES (%r)',这样做就很没意思了,读取一个二进文件内容到data,然后再使用file.write('%r' % data)写入到文件,打开看以下你就会明白。使用'%r'还不如使用base64编码。
MySQLdb.escape_string对二进制数据使用没有问题,escape后的数据只增大了一点。据说新的版本下这个可以省略。
使用'INSERT INTO mytbl VALUES (%s)' % MySQLdb.escape_string(data)应该是对的,但会提示UnicodeDecodeError。
第4点中的错误,怀疑是数据库的charset关系,我的db的character_set_name()返回"latin1";也有可能是组织SQL命令字串时就出现的问题。
Python Codebook, Page 355, Chapter 8.7 Storing a BLOB in a MYSQL Database,有时间仔细看看。
使用MySQL的LOAD_FILE函数是跳过以上问题的好方法,看开始时我总是得到NULL,折腾了半天发现要使用这个函数需要得到file权限,这个权限必须设置给全局(又折腾了一会),(using ON
*.* syntax)。详细可以参见MySQL的GRANT语法。GRANT FILE ON *.* to you@localhost identified by "secret";
使用LOAD_FILE得到的结果正是我所需要的,如果第4步成功,也应该是这样。
更正:第5点中的错误是从cursors.py的146行产生的:query = query.encode(charset)。带二进制的MySQL命令字串是可以产生的,但对它使用execute就会有这样的问题。MySQL中倒是有binary的charset类型,但python中没有,所以不能在创建数据库时指定charset为binary。MySQL字符集相关资料可以参见这里。
万般无奈之下我决定抄下Python Codebook, Chapter 8.7.2的代码来运行,竟然没遇到折磨我的encode错误,再把程序中的二进制数据换成我测试用的图片数据,还是正常。仔细看下,原来我用execute的方式不一样:cursor.execute(query % binary_data)而codebook里是这样写的:cursor.execute(query, binary_data)看看"/usr/lib/python2.4/site-packages/MySQLdb/cursors.py"中的execute,就知道区别在那里了,codebook的代码当然没有encode错误,因为不会对二进制数据操作。终于结束摸索了,总结一下:插入BLOB不需要使用特别的CHARACTER SET,和这个问题无关
如果要插入二进制数据,使用"execure(query, binary_data)"的方式
在新的版本下不要对binary_data使用escape_string函数
从数据库中获取到的BLOB的数据类型是array,我通常使用array.tofile来直接保存到文件,当然也可以使用其它的方式,请自己查找python::array的资料
如果使用LOAD_FILE,请确保你的MySQL用户有FILE的权限,另外文件要可访问并且不要太大。Welcome to PicVew.com
不要使用'%r',比如'INSERT INTO mytbl VALUES (%r)',这样做就很没意思了,读取一个二进文件内容到data,然后再使用file.write('%r' % data)写入到文件,打开看以下你就会明白。使用'%r'还不如使用base64编码。
MySQLdb.escape_string对二进制数据使用没有问题,escape后的数据只增大了一点。据说新的版本下这个可以省略。
使用'INSERT INTO mytbl VALUES (%s)' % MySQLdb.escape_string(data)应该是对的,但会提示UnicodeDecodeError。
第4点中的错误,怀疑是数据库的charset关系,我的db的character_set_name()返回"latin1";也有可能是组织SQL命令字串时就出现的问题。
Python Codebook, Page 355, Chapter 8.7 Storing a BLOB in a MYSQL Database,有时间仔细看看。
使用MySQL的LOAD_FILE函数是跳过以上问题的好方法,看开始时我总是得到NULL,折腾了半天发现要使用这个函数需要得到file权限,这个权限必须设置给全局(又折腾了一会),(using ON
*.* syntax)。详细可以参见MySQL的GRANT语法。GRANT FILE ON *.* to you@localhost identified by "secret";
使用LOAD_FILE得到的结果正是我所需要的,如果第4步成功,也应该是这样。
更正:第5点中的错误是从cursors.py的146行产生的:query = query.encode(charset)。带二进制的MySQL命令字串是可以产生的,但对它使用execute就会有这样的问题。MySQL中倒是有binary的charset类型,但python中没有,所以不能在创建数据库时指定charset为binary。MySQL字符集相关资料可以参见这里。
万般无奈之下我决定抄下Python Codebook, Chapter 8.7.2的代码来运行,竟然没遇到折磨我的encode错误,再把程序中的二进制数据换成我测试用的图片数据,还是正常。仔细看下,原来我用execute的方式不一样:cursor.execute(query % binary_data)而codebook里是这样写的:cursor.execute(query, binary_data)看看"/usr/lib/python2.4/site-packages/MySQLdb/cursors.py"中的execute,就知道区别在那里了,codebook的代码当然没有encode错误,因为不会对二进制数据操作。终于结束摸索了,总结一下:插入BLOB不需要使用特别的CHARACTER SET,和这个问题无关
如果要插入二进制数据,使用"execure(query, binary_data)"的方式
在新的版本下不要对binary_data使用escape_string函数
从数据库中获取到的BLOB的数据类型是array,我通常使用array.tofile来直接保存到文件,当然也可以使用其它的方式,请自己查找python::array的资料
如果使用LOAD_FILE,请确保你的MySQL用户有FILE的权限,另外文件要可访问并且不要太大。Welcome to PicVew.com
相关文章推荐
- C语言写二进制数据到mysql的Blob字段
- Mysql C API把文件写入BLOB类型数据
- MySQL导出和导入含有二进制字段的数据
- spark-python从hdfs文本数据(美国历年出生人数)统计然后把结果数据写入mysql
- 从Mysql查询的结果,写入txt文件中,每个字段用|分隔,下一条数据要换行
- 如何用nodejs写入mysql 的blob格式的数据
- Python 在 MySQL 中读取、写入数据
- [置顶] 【python 数据库写入】python把数据框数据写入mongodb、mysql
- Python 输出JSON对象数组&写入数据到MySQL
- 用python将excel数据写入mysql
- BLOB类型的字段用于存储二进制数据
- scala实战之spark源码修改(能够将DataFrame按字段增量写入mysql数据表)
- 使用python查询MySQL数据并写入redis
- 把System.byte[]类型数据写入Oracle的blob类型字段中
- python mysql 插入的数据是字典时,可以直接插入到数据库,不要进行for循环读取每一个字段
- python将数据写入mysql乱码的解决办法
- MYSQL数据同步BlOB字段,出现乱码的问题
- python向mysql写入数据显示乱码问题解决
- mysql包含二进制字段的数据导出导入及可能遇到的问题