首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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类型,如MEDIUMBLOBLONGBLOB,确保能存储所需大小的文件。

示例代码

以下是一个简单的示例,展示如何在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类型的使用、优势、类型、应用场景以及常见问题及其解决方法。

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

相关·内容

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

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

9.7K20
  • 在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中上传图片这部分我没有参与,所以略过。

    1.3K20

    放弃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

    74020

    MySQL数据类型之TEXT与BLOB

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

    3.7K30

    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客户端正确显示。

    2.4K70

    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

    8620

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

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

    3.4K30

    MySQL怎么存文本不乱码?

    导读 MySQL里怎么存储那些看起来会乱码的字符? 我在“UTF8字符集的表怎么直接转UTF8MB4”一文中介绍了如何把表字符集由UTF8直接转换成UTF8MB4的几种方法。...如果是通过WEB接口存储数据,则建议在browser端、server端全都采用UTF8字符集,MySQL Server端采用UTF8/UTF8MB4均可(针对大多数文本,其实UTF8字符集就足够存储的了...其中,MySQL端的字符集设置比较让人头大,涉及到的字符集有好几个: character_set_server,server端默认字符集; character_set_database,database...MySQL采用UTF8MB4字符集时,存储文本实际消耗字节数是由文本内容的字节数决定的,并非总是需要4字节,列举几种情况: 输入字符集任意,且存储ASCII字符时,每个字符需要1byte; 输入字符集是...且存储的字符是高编码汉字时,每个字符需要4bytes; 输入字符集是binary,且存储的字符是高编码汉字时,每个字符需要4bytes; 总结建议 从前端到后端(浏览器=>WEB Server=>MySQL

    1.7K20

    MySQL 怎么存文本不乱码?

    导读 MySQL里怎么存储那些看起来会乱码的字符?...如果是通过WEB接口存储数据,则建议在browser端、server端全都采用UTF8字符集,MySQL Server端采用UTF8/UTF8MB4均可(针对大多数文本,其实UTF8字符集就足够存储的了...其中,MySQL端的字符集设置比较让人头大,涉及到的字符集有好几个: character_set_server,server端默认字符集; character_set_database,database...MySQL采用UTF8MB4字符集时,存储文本实际消耗字节数是由文本内容的字节数决定的,并非总是需要4字节,列举几种情况: 输入字符集任意,且存储ASCII字符时,每个字符需要1byte; 输入字符集是...UTF8MB4,且存储的字符是高编码汉字时,每个字符需要4bytes; 输入字符集是binary,且存储的字符是高编码汉字时,每个字符需要4bytes; 总结建议 从前端到后端(浏览器=>WEB Server=>MySQL

    1.9K10
    领券