一直想在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的权限,另外文件要可访问并且不要太大。
Org: http://www.diybl.com/course/7_databases/mysql/Mysqljs/200838/103222.html
分享到:
相关推荐
例如,如果你想插入一个图像文件到BLOB字段,你需要先将图像文件读入QByteArray,然后在SQL插入语句中使用这个数组。 以下是一个简单的示例,展示了如何在Qt中插入BLOB数据到MySQL: ```cpp // 假设已连接到MySQL...
在 MySQL 数据库中,BLOB(Binary Large OBject)是一种二进制大对象类型,常用于存储图像、音频、视频和其他类型的文件。然而,在实际应用中,我们经常需要将 BLOB 数据转换为文件,以便在客户端上进行处理和显示。...
总结来说,从Oracle的BLOB类型字段中提取并转换到MySQL的过程涉及到查询、导出、上传等多个步骤。在实际操作中,需要对数据库API有深入理解,并注意数据的兼容性和性能优化。通过以上方法,你可以顺利地在两个数据库...
MySQL是一个广泛使用的开源关系型数据库管理系统,它提供了对BLOB(Binary Large Object)类型的支持,用于存储大块二进制数据。本教程将深入探讨如何在Java环境下,批量地从MySQL数据库中下载存储在Blob字段中的...
在Python中,可以使用`io`和`pymysql`库实现: ```python import io import pymysql from PIL import Image # 读取图片并转换为二进制 with Image.open('product_image.jpg') as img: byte_arr = io.BytesIO...
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:blobfile-0.4.3-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Python如何操作Oracle的Blob字段,
资源分类:Python库 所属语言:Python 资源全名:blobfile-0.16.7-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
"blobfile"是一个Python库,主要设计用于处理云存储服务中的大对象(Binary Large Object,简称BLOB)。在云计算环境中,BLOB通常用来存储图片、视频、音频等非结构化数据。这个库提供了方便的API接口,让开发者能够...
基于存储过程的MySQL数据库BLOB字段访问是指在MySQL数据库中使用存储过程来访问和处理二进制数据的方法。这种方法可以使得数据库的二进制数据处理变得更加方便和高效。 MySQL数据库提供了BLOB数据类型,可以用来...
MySQL中的BLOB类型是用于存储大量二进制数据的字段,比如图像、音频或文档等。BLOB全称为Binary Large Object,它提供了多种子类型,包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。这四种类型的区别主要在于它们能够...
mysql导出工具,可导出无注释插入语句,表中字段有blob类数据,插入语句前还有锁表操作语句,适合多种场景
在MySQL中,Blob类型字段常用于存储大块的非结构化数据。本实例将详细介绍如何在MySQL数据库中插入Blob数据,并提供源码示例。 1. **Blob类型介绍** MySQL中的Blob类型有四种变体:TinyBlob、Blob、MediumBlob和...
Python-TextBlob是Python中的一款强大文本处理库,它构建在NLTK(Natural Language Toolkit)之上,旨在为开发者提供一个简单易用的接口来执行常见的自然语言处理任务。TextBlob的出现极大地简化了NLP任务的实现,...
Java中 Blob的插入与读取
本文将详细介绍如何在JSP页面上实现`BLOB`类型数据的上传,并将其存储到MySQL数据库中。 首先,理解`BLOB`类型:`BLOB`是用于存储非结构化数据的SQL数据类型,它可以存储最大4GB的二进制数据。在Java中,我们使用`...
在这个场景中,我们关注的是如何使用Java Server Pages(JSP)来操作MySQL数据库中的Blob(Binary Large Object)字段,这是一个用于存储大容量二进制数据如图片、文档或音频文件的特殊字段类型。以下是关于这个主题...
在数据库管理与应用开发中,处理BLOB(Binary Large Object)类型字段是一项常见的需求,尤其是在存储大量二进制数据如图像、音频或视频文件时。本文将深入探讨如何判断一个BLOB字段是否为空,这是一个在数据库操作...
`mysql_blob_tools`是一个针对MySQL数据库中Blob类型数据进行分析和统计的工具。它可以帮助用户处理和理解存储在Blob字段中的大量非结构化数据。 Blob类型在MySQL中有四种变体:TinyBlob、Blob、MediumBlob和...
在 Oracle 数据库中,BLOB 类型对应的数据库类型是 BLOB,在 MySQL 中对应的类型是 BLOB。 MyBatis 提供了对 CLOB 和 BLOB 类型的内置支持,通过将 CLOB 类型映射到 Java 的 String 类型,BLOB 类型映射到 byte[] ...