首页
学习
活动
专区
圈层
工具
发布

mysql blob存图片

基础概念

MySQL中的BLOB(Binary Large Object)是一种数据类型,用于存储大量的二进制数据,如图像、音频、视频等。BLOB类型有四种:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们的区别在于能存储的最大数据长度不同。

优势

  1. 灵活性:BLOB类型可以存储任意大小的二进制数据,适用于多种类型的数据存储。
  2. 集成性:直接在数据库中存储二进制数据,便于数据的管理和检索。
  3. 安全性:数据存储在数据库中,可以通过数据库的安全机制进行保护。

类型

  • TINYBLOB:最大长度为255字节。
  • BLOB:最大长度为65,535字节(64KB)。
  • MEDIUMBLOB:最大长度为16,777,215字节(16MB)。
  • LONGBLOB:最大长度为4,294,967,295字节(4GB)。

应用场景

  1. 图像存储:将图片直接存储在数据库中,便于管理和检索。
  2. 文件存储:存储各种类型的二进制文件,如PDF、Word文档等。
  3. 多媒体数据:存储音频、视频等多媒体数据。

遇到的问题及解决方法

问题1:存储图片时出现乱码

原因:通常是由于字符编码问题导致的。

解决方法: 确保数据库和表的字符集设置为utf8mb4,并且连接数据库时也使用相同的字符集。

代码语言:txt
复制
CREATE TABLE images (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    image BLOB
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

问题2:查询图片时速度慢

原因:BLOB类型的数据通常较大,查询时会导致性能问题。

解决方法:

  1. 分页查询:避免一次性查询大量数据。
  2. 索引优化:对于非BLOB字段建立索引,提高查询效率。
  3. 存储优化:将BLOB数据存储在文件系统中,数据库中只存储文件路径。

问题3:存储大文件时超出最大长度限制

原因:选择的BLOB类型最大长度不足以存储大文件。

解决方法: 选择合适的BLOB类型,如MEDIUMBLOB或LONGBLOB,确保能存储所需大小的文件。

示例代码

以下是一个简单的示例,展示如何在MySQL中存储和检索图片:

存储图片

代码语言:txt
复制
import mysql.connector
from mysql.connector import Error

try:
    connection = mysql.connector.connect(host='localhost',
                                         database='testdb',
                                         user='root',
                                         password='password')

    cursor = connection.cursor()

    with open('image.jpg', 'rb') as file:
        image_data = file.read()

    sql_insert_blob_query = """ INSERT INTO images
                                  (name, image) VALUES (%s,%s)"""

    insert_blob_tuple = ('image1.jpg', image_data)
    result = cursor.execute(sql_insert_blob_query, insert_blob_tuple)
    connection.commit()
    print("Image and file inserted successfully as a BLOB into MySQL database", result)

except Error as e:
    print("Error while connecting to MySQL", e)

finally:
    if connection.is_connected():
        cursor.close()
        connection.close()
        print("MySQL connection is closed")

检索图片

代码语言:txt
复制
import mysql.connector
from mysql.connector import Error

try:
    connection = mysql.connector.connect(host='localhost',
                                         database='testdb',
                                         user='root',
                                         password='password')

    cursor = connection.cursor()

    sql_select_blob_query = """SELECT name, image FROM images WHERE id = %s"""

    cursor.execute(sql_select_blob_query, (1,))
    record = cursor.fetchall()

    for row in record:
        print("Image Name: ", row[0])
        with open(row[0], 'wb') as file:
            file.write(row[1])

except Error as e:
    print("Error while connecting to MySQL", e)

finally:
    if connection.is_connected():
        cursor.close()
        connection.close()
        print("MySQL connection is closed")

参考链接

通过以上信息,您应该能够更好地理解MySQL中BLOB类型的使用、优势、类型、应用场景以及常见问题及其解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 在Ionic和Android中上传Blob图片

    [记录点滴]在Ionic和Android中上传Blob图片 0x00 摘要 本文是开发中的简略记录,具体涉及知识点有:Blob,Ionic,Android和Lua。...起因是因为刚刚看到一篇关于Blob的文章你不知道的 Blob ,突然回忆起来在开发过程中也曾经使用过这种图片,所以就翻了翻代码,整理记录下来。...0x01 Blob Blob(Binary Large Object)表示二进制类型的大对象,通常是影像、声音或多媒体文件。...MySql/Oracle数据库中,就有一种Blob类型,专门存放二进制数据。...0x02 项目简述 项目涉及方面比较多,有Ionic,Android,ios,后台处理图片部分是Lua。客户端需要上传小图片到后台。因为ios中上传图片这部分我没有参与,所以略过。

    2.1K20

    Redis是否可以存图片、视频?

    一、Redis是否可以用于存储图片、视频? 前几天看到某大型家电工厂的工业互联网系统架构图,发现用MongoDB存储图片及视频。...那Redis同样也是Json类型的远程数据字典服务器,也可以用于存储图片、视频。实际Redis可以用512MB的空间存储用于存储字符串型的数据。...虽然技术上可以这么做,但Redis原本就是内存型数据库,用于存储图片、视频是非常不划算的。建议多利用HDFS、NAS、对象存储等分布式的云存储系统。 二、Redis如何存储真实对象的名称?...像MongoDB一样,后起之秀,一般对复制、分片是原生支持,比起Mysql等关系数据库系统的复杂配置,Redis已经可以原生支持这两个功能,而且配置非常简单。

    10.7K20

    放弃General存放图像,VFP的BLOB存图存文件也是非常香

    Blob 的单字符缩写是“W”。...这里是关于 Blob 的一些细节: Blob 的功能与 Memo 类似:你不能在其上建立索引,它接收 Null 值,在一个表或者游标中的 Blob 字段有一个 2GB 数据的限制(当然了,FPT 文件的总大小也只能有...在一个 BROWSE 窗口或者 Grid 中,一个 Blob 字段中如果是空的,则显示为 "blob",否则则显示为“Blob”。...在一个 General 字段中存储图像需要有一个关联到一个 ActiveX Server 的文件,而存储在一个 Blob 字段中就简单了,它们很容易去更新,跟使用 APPEND GENERAL 不同,你可以使用象下面这样的东西来把一幅图片放入到一个...(picture,"1.gif") 显示Blob 字段中的图像 要在一个表单上显示存储在一个 Blob 字段中的图像,只要简单的把一个 Image 控件的 PictureVal 属性设置为这个 Blob

    1.2K20

    MySQL数据类型之TEXT与BLOB

    二者之间的主要差别是BLOB能用来保存二进制数据,比如照片;而TEXT只能保存字符数据,比如一遍文章或日记。...TEXT和BLOB中又分别包括TEXT,MEDIUMTEXT,LONGTEXT和BLOB,MEDIUMBLOB,LONGBLOB三种不同的类型,他们之间的主要区别是存储文本长度不用和存储字节不用,用户应该根据实际情况选择能够满足需求的最小存储类型...可以使用合成的(Synthetic)索引来提高大文本字段(BLOB或TEXT)的查询性能。...合成的散列索引对于那些BLOB或TEXT数据列特别有用。用散列标识符值查找的速度比搜索BLOB列的本身速度快很多。 创建一张表,来介绍合成索引的使用方法。 ?...在不必要的时候避免检索大型的BLOB或TEXT值。 把BLOB或TEXT列分离到单独的表中。

    4.5K30

    mysql 5.7 溢出页 FIL_PAGE_TYPE_BLOB

    其实代码里面存在 if (page_type == FIL_PAGE_TYPE_BLOB || page_type == FIL_PAGE_SDI_BLOB) 之类的代码基本上就能说明5.7的溢出页(FIL_PAGE_TYPE_BLOB...~但是还是水一篇~FIL_PAGE_TYPE_BLOBFIL_PAGE_TYPE_BLOB 的结构和FIL_PAGE_SDI_BLOB基本上一样, 只不过前者记录的是这一页存在多少数据, 而后者记录的是...不知道为啥这么设计, 没发现它两的优势.好了, 还是来看看FIL_PAGE_TYPE_BLOB的结构吧SIZE: 这个溢出页在本页中记录的大小.PAGENO: 下一页的pageno, 如果是4294967295...('>3LQ',self.read(20))if self.table.mysqld_version_id > 50744: # 8.0环境_tdata = first_blob(self.f,PAGENO...github.com/ddcw/ibd2sql/archive/refs/heads/main.zipunzip main.zipcd ibd2sql-mainpython3 main.py /data/mysql

    61320

    如何使用FormData上传压缩裁剪后的图片Blob对象

    在前端页面,我们通常会遇到需要用户上传图片的操作,可能还会在前端进行图片编辑的操作(比如头像的选区裁剪),然后如果图片过大的话,我们还会对图片进行压缩。...这些功能我们通常通过Canvas来进行,最后使用Canvas API函数toDataURL来得到图片的Base64字符串,然后当我们要上传到后台的时候,会面临2种选择: 直接将图片的Base64字符串Post...到后端进行处理和保存 在前端将Base64字符串转换成二进制的Blob对象形式,再使用常规的文件上传形式(即FormData)来将其上传到后端 第一种方式对前端来说比较简单,主要的处理逻辑在后端。...= null; try { blob = new Blob([buff], { type: fileType });...生成的表单数据中,上传文件对应的filename会被设置为blob: ?

    4.7K30

    消失的图片:别让 blob: URL 成为你系统里的“内存幻象”

    但你是否遇到过这种诡异的情况:图片在上传时显示正常,但切换了一下页面路由,或者刷新了一下会话,图片就变成了裂图,控制台无情地抛出 net::ERR_FILE_NOT_FOUND?...这背后的根因在于对 Blob URL 生命周期 的误解。...一、 核心误区:blob: URL 并不是持久资源很多开发者潜意识里把 blob:http://localhost:3000/xxx 当作一个普通的 URL,认为只要字符串在,资源就在。...真相是:blob: URL 是一个指向内存的指针。它仅在创建它的当前文档(Document)生命周期内有效。...不要对正常的 http 链接或普通的字符串执行回收操作,否则可能误伤其他正常的图片渲染。

    50810

    Nginx+lua+mysql实时存日志

    刚开始的时候看了Nginx和mysql的连接模块。比如说nginx-mysql-module,可以连接mysql。...mysql访问阶段属于内容生成阶段,所以代理运行的时间和状态,mysql都无法获取的到。因此,这种通过nginx直连mysql的方式无法达到我们的要求。...Mysql 访问权限的问题 不但访问Mysql的Mysql用户需要有操作对应数据库的权限,还需要调用Mysql命令的用户具有访问mysql的权限。...Mysql客户端显示数据的编码,连接Mysql用的编码(即数据存入mysql时,数据的编码),Mysql存储用的编码(字段,表,数据库三种格式可能不同)。...不管Mysql存储用的编码是什么,只要Mysql客户端显示数据的编码和连接Mysql用的编码相同,数据就能通过mysql客户端正确显示。

    3.3K70
    领券