當前位置:首頁 » 數據倉庫 » mysql資料庫blob
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

mysql資料庫blob

發布時間: 2023-05-23 09:58:33

① php mysql blob數據怎樣讀取出來

MySQL中,BLOB是個類型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,這幾個類型之間的唯一區別是在存儲文件的最大大小上不同。
MySQL的四種BLOB類型
TinyBlob: 最大 255位元組
Blob: 最大 65K
MediumBlob:最大 16M
LongBlob: 最大 4G
注意:如果你存儲的文件過大,資料庫的性能會下降很多。
2、PHP操作BLOB案例
<?php
mysql_connect( "localhost", "root", "password"); //連和答接資料庫
mysql_select_db( "database"); //選定資料庫
//數據插入孝棚梁:
$CONTENT="測試內巧運容"; //$CONTENT為新聞內容
$COMPRESS_CONTENT = bin2hex(gzcompress($CONTENT));
$result=mysql_query( "insert into news (content) value ('$COMPRESS_CONTENT')");//數據插入到資料庫news表中
//展示:
$query = "select data from testtable where filename=$filename";
$result = mysql_query($query);
$COMPRESS_CONTENT=@gzuncompress($result["COMPRESS_CONTENT"]);
echo $COMPRESS_CONTENT;
?>

[2]存儲圖片
<?php
mysql_connect( "localhost", "root", "password"); //連接資料庫
mysql_select_db( "database"); //選定資料庫
//存儲:
$filename="" //這里填入圖片路徑
$COMPRESS_CONTENT = addslashes(fread(fopen($filename, "r"), filesize($filename)));//打開文件並規范化數據存入變數$data中
$result=mysql_query( "insert into news (content) value ('$COMPRESS_CONTENT')");//數據插入到資料庫test表中
//展示:
ob_end_clean();
Header( "Content-type: image/gif");
$query = "select data from testtable where filename=$filename";
$result = mysql_query($query);
echo $result["COMPRESS_CONTENT"];
?>

② 如何往mysql裡面存blob

以下的文章主要介紹的是MySQLtext與blob欄位類型的不同之處的比較,同時本文也有對MySQLtext與blob欄位類型的實際應用的介紹,如果你褲鄭態對MySQLtext與blob欄位類型相關的實際操作有興趣的話,你就可以對以下的文章點擊觀看了。1.blob是二進制大對象,可以容納可變數數量的數據,其中blob分為4中類型:TINYBLOB,BLOB,mediumblob和LongBlob,他們容納的長度是不同的.Text同樣也分為四種類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT2.blob被視為二進制字元叢轎串,Text被視為非二進制字元串;blob列沒有字元集,並且排序和比較基於列值位元組的數值值。TEXT列有一個字元集,並且根據字元集的校對規則對值進行排序和比較。在MySQLTEXT或BLOB列的存儲或檢索過程中,不存在大小寫轉換,當未運行在嚴格模式時,如果你為BLOB或TEXT列分配一個超過該列類型的最大長度的值值,值被截取以保證適合。如果截掉的字元不是空格,將會產生一條警告。使用嚴格SQL模式,會產生錯誤,並且值將被拒絕而不是截取並給出警告.在大多數方面,可以將BLOB列視為能夠足夠大的VARBINARY列。同樣,可以將TEXT列視為VARCHAR列。3.BLOB和TEXT在以下幾個方面不同於VARBINARY和VARCHAR.BLOB和TEXT列不能有默認值.當保存或檢索BLOB和TEXT列的值時不刪除尾部空格。(這與VARBINARY和VARCHAR列相同).對於BLOB和TEXT列的索引,必須指定索引前綴的長度。對於CHAR和VARCHAR,前綴長度是可選的.LONG和LONGVARCHAR對應MEDIUMTEXT數據類型。這是為了保證兼容性。如果TEXT列類型使用BINARY屬性,將為列分配列字元集的二元校對規則.MySQL連接程序/ODBC將BLOB值定義為LONGVARBINARY,將MySQLTEXT值定義為LONGVARCHAR。由於BLOB和TEXT值可能會非常長,使用它們時可能遇到一些約束.BLOB或TEXT對象的最大大小由其類型確定,但在客戶端和伺服器之間實際可以傳遞的最大值由可用內存數量和通信緩存區大小確定。你可以通過更改max_allowed_packet變數的值更改消息緩存區的大小,但必須同時修改伺服器和客戶端程序。例如,可以使用MySQL和MySQLmp來更改客戶端胡源的max_allowed_packet值.

③ mysql使用blob存儲base64格式文件

1.MySQL有四種BLOB類型:
·tinyblob:僅255個字元
·blob:最大限制到65K位元組
·mediumblob:限制到16M位元組
·longblob:可達4GB
2.mybatis對茄純肆應mysql blob的類型
byte[] imgbytes對應了mysql imgbytes blob類型

3.將base64轉顫轎成二褲旦進制的byte數組。直接就可存儲到mysql中

④ 使用java語言操作,如何來實現MySQL中Blob欄位的存取

/**
* Title: BlobPros.java
* Project: test
* Description: 把圖片存入mysql中的blob欄位,並取出
* Call Mole: mtools資料庫中的tmp表
* File: C:downloadsluozsh.jpg
* Copyright: Copyright (c) 2003-2003
* Company: uniware
* Create Date: 2002.12.5
* @Author: ChenQH
* @version 1.0 版本*
*
* Revision history
* Name Date Description
* ---- ---- -----------
* Chenqh 2003.12.5 對圖片進行存取
*
* note: 要把資料庫中的Blob欄位設為longblob
*
*/

//package com.uniware;

import java.io.*;
import java.util.*;
import java.sql.*;

public class BlobPros
{
private static final String URL = "jdbc:mysql:/碧慧或/10.144.123.63:3306/mtools?user=wind&password=123&useUnicode=true";
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private File file = null;

public BlobPros()
{
}

/**
* 向資料庫中插入一個新的BLOB對象(圖片)
* @param infile 要輸入的數據文件
* @throws java.lang.Exception
*/
public void blobInsert(String infile) throws Exception
{
FileInputStream fis = null;
try
{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(URL);

file = new File(infile);
fis = new FileInputStream(file);
//InputStream fis = new FileInputStream(infile);
pstmt = conn.prepareStatement("insert into tmp(descs,pic) values(?,?)");
pstmt.setString(1,file.getName()); //把傳悔伍過來的第一個參數設為文件名
//pstmt.setBinaryStream(2,fis,(int)file.length()); //這種方法原理上會丟數據,因為file.length()返回的是long型
pstmt.setBinaryStream(2,fis,fis.available()); //第二個參數為文件的內碧爛容
pstmt.executeUpdate();
}
catch(Exception ex)
{
System.out.println("[blobInsert error : ]" + ex.toString());
}
finally
{
//關閉所打開的對像//
pstmt.close();
fis.close();
conn.close();
}
}

/**
* 從資料庫中讀出BLOB對象
* @param outfile 輸出的數據文件
* @param picID 要取的圖片在資料庫中的ID
* @throws java.lang.Exception
*/

public void blobRead(String outfile,int picID) throws Exception
{
FileOutputStream fos = null;
InputStream is = null;
byte[] Buffer = new byte[4096];

try
{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(URL);
pstmt = conn.prepareStatement("select pic from tmp where id=?");
pstmt.setInt(1,picID); //傳入要取的圖片的ID
rs = pstmt.executeQuery();
rs.next();

file = new File(outfile);
if(!file.exists())
{
file.createNewFile(); //如果文件不存在,則創建
}
fos = new FileOutputStream(file);
is = rs.getBinaryStream("pic");
int size = 0;
/* while(size != -1)
{
size = is.read(Buffer); //從資料庫中一段一段的讀出數據
//System.out.println(size);
if(size != -1) //-1表示讀到了文件末
fos.write(Buffer,0,size);
} */
while((size = is.read(Buffer)) != -1)
{
//System.out.println(size);
fos.write(Buffer,0,size);
}

}
catch(Exception e)
{
System.out.println("[OutPutFile error : ]" + e.getMessage());
}
finally
{
//關閉用到的資源
fos.close();
rs.close();
pstmt.close();
conn.close();
}
}

public static void main(String[] args)
{
try
{

BlobPros blob = new BlobPros();
//blob.blobInsert("C:Downloadsluozsh1.jpg");
blob.blobRead("c:/downloads/1.jpg",47);
}
catch(Exception e)
{
System.out.println("[Main func error: ]" + e.getMessage());
}
}
}

⑤ 如何把文件傳入mysql中的blob欄位中

1、用戶上傳文檔後,把文檔存儲到某個路徑下,然後在資料庫中存儲這個路徑和文檔名
2、用戶上傳文檔後,進行二進制讀取(流處理),然後把讀取出來的二進制存儲到資料庫中

首先我們要進行讀取文件

$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");

然後把 $myfile 存儲到mysql中
sql ="insert into table_name (fn) values($myfile)""
這樣就把文檔轉變成二進制之後,存儲到了mysql資料庫,下次取出時,只需要把取出的數據存儲到一個文檔中

⑥ 什麼是blob,mysql blob大小配置介紹

BLOB介紹

BLOB (binary large object),二進制大對象,是一個可模鍵以存儲二進制文件的容器。在計算機中,BLOB常常是資料庫中用來存儲二進制文件的欄位類型。BLOB是一
個大文件,典型的BLOB是一張圖片或一個聲音文件,由於它們的尺寸,必須使用特殊的方式來處理(例如:上傳、下載或者存放到一個資料庫)。根據Eric Raymond的
說法,處理BLOB的主要思想就是讓文件處理器(如資料庫管理器)不去理會文件是什麼,而是關心如何去處理它。但也有專家強調,這種處理大數據對象的方法是數輪把雙
刃劍,它有可能引發一些問題,如存儲的二進制文件過大,會使資料庫的性能下降。在資料庫中存放體積較大的多媒體對象就是應用程序處理BLOB的典型例子。
mysql BLOB類型
MySQL中,BLOB是個類型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,這幾個類型薯碼信之間的唯一區別是在存儲文件的最大大小上不同。
MySQL的四種BLOB類型
類型 大小(單位:位元組)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G

⑦ 關於mysql中的blob欄位

取二進制數據:
一樣的sql語句,查詢出來即可。只不過二進制數據是個數據塊,需要得到數據塊的大小和數據指針。
bool CMySqlAccess::GetBinaryField(int nCol,char* &pDataOut,int& nDataLen)
{
if (m_ItemMySqlRow[nCol] != NULL)
{
unsigned long *FieldLength = mysql_fetch_lengths(m_pMySqlResult);
nDataLen = (int)FieldLength[nCol];
pDataOut = (char*)(m_ItemMySqlRow[nCol]);
return true;
}
else
{
return false;
}
}
像通常一樣查詢後,得到結果集,然後得到第nCol列結果,返回二進制指針結果和二進制長度。返回後必須立馬處理或者存儲一份。否則mysql將數據銷毀,指針所指數據則無效了。
存二進制數據:
mysql語句接受的sql語句都是string,以'\0'結尾的。如果冒然插入二進制數據到sql語句中,要麼報錯,要麼存儲錯誤。此處可以通過mysql提供的函數將數據轉換一下即可。
char* CMySqlAccess::ConvertBinaryToString(char* pBinaryData,int nLen)
{
static char s_BinaryData[10240];
mysql_real_escape_string(m_pMySqlConn,s_BinaryData,pBinaryData,nLen);
return s_BinaryData;
}
上面這個函數只能單線程使用啊,將一塊二進制數據轉換為mysql可識別的string數據。這樣就直接可以通過mysql的sql語句insert,update來對blob數據進行更新和插入了,sql語句用法不變。

⑧ mysql數據類型中blob和binary的區別

MySQL 數據類型細分下來,大概有以下幾類:

  • 數值,典型代表為 tinyint,int,bigint

  • 浮點/定點,典型代表為 float,double,decimal 以及相關的同義詞

  • 字元串,典型代表為 char,varchar

  • 時間日期,典型代表為 date,datetime,time,timestamp

  • 二進制,典型代表為 binary,varbinary

  • 位類型

  • 枚舉類型

  • 集合類型

  • 大對象,比如 text,blob

  • json 文檔類型

  • 一、數值類型(不是數據類型,別看錯了)如果用來存放整數,根據范圍的不同,選擇不同的類型。


  • 注意:timestamp 代表的時間戳是一個 int32 存儲的整數,取值范圍為 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999';datetime 取值范圍為 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。

  • 綜上所述,日期這塊類型的選擇遵循以下原則:

  • 1. 如果時間有可能超過時間戳范圍,優先選擇 datetime。2. 如果需要單獨獲取年份值,比如按照年來分區,按照年來檢索等,最好在表中添加一個 year 類型來參與。3. 如果需要單獨獲取日期或者時間,最好是單獨存放,而不是簡單的用 datetime 或者 timestamp。後面檢索時,再加函數過濾,以免後期增加 SQL 編寫帶來額外消耗。

  • 4. 如果有保存毫秒類似的需求,最好是用時間類型自己的特性,不要直接用字元類型來代替。MySQL 內部的類型轉換對資源額外的消耗也是需要考慮的。

    示例 5

  • 建立表 t5,對這些可能需要的欄位全部分離開,這樣以後寫 SQL 語句的時候就很容易了。

  • 當然了,這種情形佔用額外的磁碟空間。如果想在易用性與空間佔用量大這兩點來折中,可以用 MySQL 的虛擬列來實時計算。比如假設 c5 欄位不存在,想要得到 c5 的結果。mysql-(ytt/3305)->alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1 Duplicates: 0 Warnings: 0



  • 五、二進制類型

  • binary 和 varbinary 對應了 char 和 varchar 的二進制存儲,相關的特性都一樣。不同的有以下幾點:

  • binary(10)/varbinary(10) 代表的不是字元個數,而是位元組數。

  • 行結束符不一樣。char 的行結束符是 ,binary 的行結束符是 0x00。

  • 由於是二進制存儲,所以字元編碼以及排序規則這類就直接無效了。

  • 示例 6

    來看這個 binary 存取的簡單示例,還是之前的變數 @a。

    切記!這里要提前計算好 @a 佔用的位元組數,以防存儲溢出。


  • 六、位類型

  • bit 為 MySQL 里存儲比特位的類型,最大支持 64 比特位, 直接以二進制方式存儲,一般用來存儲狀態類的信息。比如,性別,真假等。具有以下特性:

  • 1. 對於 bit(8) 如果單純存放 1 位,左邊以 0 填充 00000001。2. 查詢時可以直接十進制來過濾數據。3. 如果此欄位加上索引,MySQL 不會自己做類型轉換,只能用二進制來過濾。

  • 示例 7

  • 創建表 c1, 欄位性別定義一個比特位。mysql-(ytt/3305)->create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)



  • mysql-(ytt/3305)->select cast(gender as unsigned) 'f1' from c1;+------+| f1 |+------+| 0 || 1 |+------+2 rows in set (0.00 sec)


  • 過濾數據也一樣,二進制或者直接十進制都行。mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = b'1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = '1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)


  • 其實這樣的場景,也可以定義為 char(0),這也是類似於 bit 非常優化的一種用法。

  • mysql-(ytt/3305)->create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)


  • 那現在我給表 c1 簡單的造點測試數據。

  • mysql-(ytt/3305)->select count(*) from c1;+----------+| count(*) |+----------+| 33554432 |+----------+1 row in set (1.37 sec)


  • 把 c1 的數據全部插入 c2。

  • mysql-(ytt/3305)->insert into c2 select if(gender = 0,'',null) from c1;Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432 Duplicates: 0 Warnings: 0


  • 兩張表的磁碟佔用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 1.9G4085684 933M -rw-r----- 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r----- 1 mysql mysql 916M 12月 11 10:22 c2.ibd


  • 檢索方式稍微有些不同,不過效率也差不多。所以說,字元類型不愧為萬能類型。


  • 七、枚舉類型

  • 枚舉類型,也即 enum。適合提前規劃好了所有已經知道的值,且未來最好不要加新值的情形。枚舉類型有以下特性:

  • 1. 最大佔用 2 Byte。2. 最大支持 65535 個不同元素。3. MySQL 後台存儲以下標的方式,也就是 tinyint 或者 smallint 的方式,下標從 1 開始。4. 排序時按照下標排序,而不是按照裡面元素的數據類型。所以這點要格外注意。

  • 示例 8

  • 創建表 t7。mysql-(ytt/3305)->create table t7(c1 enum('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.03 sec)



  • 八、集合類型

    集合類型 SET 和枚舉類似,也是得提前知道有多少個元素。SET 有以下特點:

  • 1. 最大佔用 8 Byte,int64。2. 內部以二進制位的方式存儲,對應的下標如果以十進制來看,就分別為 1,2,4,8,...,pow(2,63)。3. 最大支持 64 個不同的元素,重復元素的插入,取出來直接去重。4. 元素之間可以組合插入,比如下標為 1 和 2 的可以一起插入,直接插入 3 即可。

  • 示例 9

    定義表 c7 欄位 c1 為 set 類型,包含了 8 個值,也就是下表最大為 pow(2,7)。

  • mysql-(ytt/3305)->create table c7(c1 set('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.02 sec)


  • 插入 1 到 128 的所有組合。

  • mysql-(ytt/3305)->INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS ( SELECT 1 AS cnt UNION ALL SELECT cnt + 1 FROM ytt_number WHERE cnt < pow(2, 7) )SELECT *FROM ytt_number;Query OK, 128 rows affected (0.01 sec)Records: 128 Duplicates: 0 Warnings: 0

  • 九、數據類型在存儲函數中的用法

    函數里除了顯式聲明的變數外,默認 session 變數的數據類型很弱,隨著給定值的不同隨意轉換。

  • 示例 10

  • 定義一個函數,返回兩個給定參數的乘積。定義里有兩個變數,一個是 v_tmp 顯式定義為 int64,另外一個 @vresult 隨著給定值的類型隨意變換類型。


    簡單調用下。

  • mysql-(ytt/3305)->select ytt_sample_data_type(1111,222) 'result';+--------------------------+| result |+--------------------------+| The result is: '246642'. |+--------------------------+1 row in set (0.00 sec)


  • 總結

    本篇把 MySQL 基本的數據類型做了簡單的介紹,並且用了一些容易理解的示例來梳理這些類型。我們在實際場景中,建議選擇適合最合適的類型,不建議所有數據類型簡單的最大化原則。比如能用 varchar(100),不用 varchar(1000)。

⑨ mysql中欄位類型為blob怎樣變為字元串

按照以下語句模板帶入,即可把blob類型變為字元串類型,不再需要別的操作。

createtabletest(idblob);
selectcount(*)asto_charfromtest;

⑩ MySql Blob圖片類型存儲Bug解決

先在本地裝了個Mysql,又裝了個navicat管理工具,又新建了個工程來測試:
簡單的測試方法,就是放一個按鈕,點擊一下,讀取遠程圖片,然後存到資料庫,再讀取出來顯示到界面上。
管理工具隨意建了個表“D1”,弄了三個id,img,name三個欄位。
示例代碼如下,因為測試,代碼就沒寫的太規范:
protected
void
btnTest_Click(object
sender,
EventArgs
e)
{
string
url
=
"http://www..com/img/_jgylogo3.gif";
bool
result
=
false;
int
id
=
0;
string
conn
=
"host=127.0.0.1;Port=3306;Database=test;uid=root;pwd=123456";
//
string
conn
=
"server=.;database=demo;uid=sa;pwd=123456";
using
(MAction
action
=
new
MAction("d1",
conn))
{
WebClient
wc
=
new
WebClient();
try
{
//if
(action.Fill(2))
//{
byte[]
data
=
wc.DownloadData(url);
action.Set("img",
data);
action.Set("name",
"ldf");
result
=
action.Insert(InsertOp.ID);
id
=
action.Get<int>("id");
//}
}
catch
(Exception
err)
{
Log.WriteLogToTxt(err);
}
}
if
(result)//再開一個讀取試試
{
using
(MAction
action
=
new
MAction("d1",
conn))
{
if
(action.Fill(id))
{
Response.BinaryWrite(action.Get<byte[]>("img"));
}
}

}
解決與調試經過:
經本地測試,調試,發現對blob類型的參數賦值時,拋出異常:索引超出了數組界限。
異常太迷惑,網上搜了一下,有人說是:Mysql.dll的版本問題,花了一個csdn積分下了一個6.2.3版本,還是不頂用。
然後無意識的進行調試,估計運氣問題,竟然讓我發現了問題所在,只能說是運氣好。
看一段小代碼,對參數的賦值,參數多資料庫支持時,類似這種寫法:
DbParameter
para
=
_fac.CreateParameter();//通過工廠廣告獲得當前資料庫類型的參數
para.ParameterName
=
parameterName;
para.Value
=
value
==
null
?
DBNull.Value
:
value;
para.DbType
=
dbType;
if
(size
>
-1)//設定長度。
{
para.Size
=
size;
}
para.Direction
=
direction;
這代碼其實很簡單:
產生了一個參數,然後賦參數名,參數值,參數類型,參數大小和參數指向。
而Mysql竟然在對參數Size賦值的問題處理上有些Bug。
當我調試跳過對para.Size賦值時,竟然正常了。
於是代碼改成了這樣:
if
(dbType
!=
DbType.Binary
&&
size
>
-1)//mysql不能設定長度,否則會報索引超出了數組界限錯誤。
然後我測試了下其它資料庫,發現指定size是正常的,最後得出一結論:
經過測試,其它資料庫類型對Size的賦值是正常的,唯Mysql有問題,為此,在編寫進行多資料庫支持的框架時,總會時不時的遇到好多問題,別糾結,始終要解決。