f(isset($_POST['submit'])$_POST['submit']=='提交'){

創新互聯建站主營梅州網站建設的網絡公司,主營網站建設方案,成都app開發,梅州h5小程序制作搭建,梅州網站營銷推廣歡迎梅州等地區企業咨詢
3 //判斷是否是提交過來的
4 $intext = $_POST['intext'];
5 if($intext!=null||$intext!=''){
6 $link = mysql_connect("localhost", "root", "123456");
7 //數據庫配置信息 第一個參數數據庫位置第二個是用戶名第三個是密碼
8 mysql_select_db("szn_test");
9 //設置要使用的數據庫
10 $sql = "select * from demo where res = '".$intext."'";
特征碼是一個二進制字段,一般數據庫提供一個二進制字段來存儲二進制數據,比如SQL Server中的BINARY,VERBINARY;MYSQL用Blob;Oracle用blob或者bfile。
背景
MySQL 一直以來都有 TEXT、BLOB 等類型用來存儲圖片、視頻等大對象信息。比如一張圖片,隨便一張都 5M 以上。視頻也是,隨便一部視頻就是 2G 以上。
假設用 MySQL 來存放電影視頻等信息,一部是 2G,那么存儲 1000 部就是 2TB,2TB 也就是 1000 條記錄而已,但是對數據庫性能來說,不僅僅是看記錄數量,更主要的還得看占用磁盤空間大小。空間大了,所有以前的經驗啥的都失效了。
所以一般來說存放這類信息,也就是存儲他們的存放路徑,至于文件本身存放在哪里,那這就不是數據庫考慮的范疇了。數據庫只關心怎么來的快,怎么來的小。
舉例
雖然不推薦 MySQL 這樣做,但是也得知道 MySQL 該怎么做才行,做到心里有數。比如下面一張微信圖片,大概 5M 的樣子。
root@ytt:/var/lib/mysql-files# ls -sihl 微信圖片_20190711095019.jpg274501 5.4M -rw-r--r-- 1 root root 5.4M Jul 11 07:17 微信圖片_20190711095019.jpg
拷貝 100 份這樣的圖片來測試
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信圖片_20190711095019.jpg "$i".jpg;done;
root@ytt:/var/lib/mysql-files# ls
100.jpg ? 17.jpg ?25.jpg ?33.jpg ?41.jpg ?4.jpg ? 58.jpg ?66.jpg ?74.jpg ?82.jpg ?90.jpg ?99.jpg ?f8.tsv
10.jpg ? ?18.jpg ?26.jpg ?34.jpg ?42.jpg ?50.jpg ?59.jpg ?67.jpg ?75.jpg ?83.jpg ?91.jpg ?9.jpg ? 微信圖片_20190711095019.jpg
1111.jpg ?19.jpg ?27.jpg ?35.jpg ?43.jpg ?51.jpg ?5.jpg ? 68.jpg ?76.jpg ?84.jpg ?92.jpg ?f1.tsv
11.jpg ? ?1.jpg ? 28.jpg ?36.jpg ?44.jpg ?52.jpg ?60.jpg ?69.jpg ?77.jpg ?85.jpg ?93.jpg ?f2.tsv
12.jpg ? ?20.jpg ?29.jpg ?37.jpg ?45.jpg ?53.jpg ?61.jpg ?6.jpg ? 78.jpg ?86.jpg ?94.jpg ?f3.tsv
13.jpg ? ?21.jpg ?2.jpg ? 38.jpg ?46.jpg ?54.jpg ?62.jpg ?70.jpg ?79.jpg ?87.jpg ?95.jpg ?f4.tsv
14.jpg ? ?22.jpg ?30.jpg ?39.jpg ?47.jpg ?55.jpg ?63.jpg ?71.jpg ?7.jpg ? 88.jpg ?96.jpg ?f5.tsv
15.jpg ? ?23.jpg ?31.jpg ?3.jpg ? 48.jpg ?56.jpg ?64.jpg ?72.jpg ?80.jpg ?89.jpg ?97.jpg ?f6.tsv
16.jpg ? ?24.jpg ?32.jpg ?40.jpg ?49.jpg ?57.jpg ?65.jpg ?73.jpg ?81.jpg ?8.jpg ? 98.jpg ?f7.tsv
我們建三張表,分別用 LONGBLOB、LONGTEXT 和 VARCHAR 來存儲這些圖片信息
mysql show create table tt_image1G
*************************** 1. row ***************************
Table: tt_image1
Create Table: CREATE TABLE `tt_image1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` longblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql show create table tt_image2G
*************************** 1. row ***************************
Table: tt_image2
Create Table: CREATE TABLE `tt_image2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql show create table tt_image3G
*************************** 1. row ***************************
Table: tt_image3
Create Table: CREATE TABLE `tt_image3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
我們來給三張表插入 100 張圖片(插入前,建議把 max_allowed_packet 設置到最大)
tt_image1
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;
do mysql -S /var/run/mysqld/mysqld.sock -e "insert into ytt.tt_image1(image_file)
values (load_file('/var/lib/mysql-files/$i.jpg'))";done;
tt_image2
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;
do mysql -S /var/run/mysqld/mysqld.sock -e "insert into ytt.tt_image2(image_file)
values (hex(load_file('/var/lib/mysql-files/$i.jpg')))";done;
tt_image3
root@ytt:/var/lib/mysql-files# aa='begin;';for i in `seq 1 100`;
do aa=$aa"insert into ytt.tt_image3(image_file) values
('/var/lib/mysql-files/$i.jpg');";
done;aa=$aa'commit;';mysql -S /var/run/mysqld/mysqld.sock -e "`echo $aa`";
檢查下三張表記錄數
mysql select 'tt_image1' as name ,count(*) from tt_image1 union allselect 'tt_image2',count(*) from tt_image2 union all select 'tt_image3', count(*) from tt_image3;+-----------+----------+| name ? ? ?| count(*) |+-----------+----------+| tt_image1 | ? ? ?100 || tt_image2 | ? ? ?100 || tt_image3 | ? ? ?100 |+-----------+----------+3 rows in set (0.00 sec)
看下文件大小,可以看到實際大小排名,LONGTEXT 字段存儲的最大,LONGBLOB 字段縮小到一半,最小的是存儲圖片路徑的表 tt_image3。所以這里從存儲空間來看,存放路徑最占優勢。
root@ytt:/var/lib/mysql/ytt# ls -silhS tt_image*274603 1.1G -rw-r----- 1 mysql mysql 1.1G Jul 11 07:27 tt_image2.ibd274602 545M -rw-r----- 1 mysql mysql 544M Jul 11 07:26 tt_image1.ibd274605 ?80K -rw-r----- 1 mysql mysql 112K Jul 11 07:27 tt_image3.ibd
那么怎么把圖片取出來呢?
tt_image3 肯定是最容易的
mysql select * from tt_image3;+----+----------------------------+| id | image_file ? ? ? ? ? ? ? ? |+----+----------------------------+| ?1 | /var/lib/mysql-files/1.jpg |+----+----------------------------+...100 rows in set (0.00 sec)
tt_image1 直接導出來二進制文件即可,下面我寫了個存儲過程,導出所有圖片。
mysql DELIMITER $$mysql USE `ytt`$$mysql DROP PROCEDURE IF EXISTS `sp_get_image`$$mysql CREATE DEFINER=`ytt`@`localhost` PROCEDURE `sp_get_image`()mysql BEGIN ? ? ?DECLARE i,cnt INT DEFAULT 0; ? ? ?SELECT COUNT(*) FROM tt_image1 WHERE 1 INTO cnt; ? ? ?WHILE i cnt DO ? ? ? ?SET @stmt = CONCAT('select image_file from tt_image1 ?limit ',i,',1 into dumpfile ''/var/lib/mysql-files/image',i,'.jpg'''); ? ? ? ?PREPARE s1 FROM @stmt; ? ? ? ?EXECUTE s1; ? ? ? ?DROP PREPARE s1; ? ? ?SET i = i + 1; ? ? ?END WHILE; ? ? ?END$$mysql DELIMITER ;mysql call sp_get_image;
tt_image2 類似,把 select 語句里 image_file 變為 unhex(image_file) 即可。
總結
這里我舉了個用 MySQL 來存放圖片的例子,總的來說有以下三點:
占用磁盤空間大(這樣會帶來各種各樣的功能與性能問題,比如備份,寫入,讀取操作等)
使用不易
還是推薦用文件路徑來代替實際的文件內容存放
創建數據庫
選擇開始菜單中→程序→【Management SQL Server 2008】→【SQL Server Management Studio】命令,打開【SQL Server Management Studio】窗口,并使用Windows或 SQL Server身份驗證建立連接。
在【對象資源管理器】窗口中展開服務器,然后選擇【數據庫】節點
右鍵單擊【數據庫】節點,從彈出來的快捷菜單中選擇【新建數據庫】命令。
執行上述操作后,會彈出【新建數據庫】對話框。在對話框、左側有3個選項,分別是【常規】、【選項】和【文件組】。完成這三個選項中的設置會后,就完成了數據庫的創建工作,
在【數據庫名稱】文本框中輸入要新建數據庫的名稱。例如,這里以“新建的數據庫”。
在【所有者】文本框中輸入新建數據庫的所有者,如sa。根據數據庫的使用情況,選擇啟用或者禁用【使用全文索引】復選框。
在【數據庫文件】列表中包括兩行,一行是數據庫文件,而另一行是日記文件。通過單擊下面的【添加】、【刪除】按鈕添加或刪除數據庫文件。
切換到【選項頁】、在這里可以設置數據庫的排序規則、恢復模式、兼容級別和其他屬性。
切換到【文件組】頁,在這里可以添加或刪除文件組。
完成以上操作后,單擊【確定】按鈕關閉【新建數據庫】對話框。至此“新建的數據”數據庫創建成功。新建的數據庫可以再【對象資源管理器】窗口看到。
解決方法一般有兩種:
1、將圖片保存的路徑存儲到數據庫;
2、將圖片以二進制數據流的形式直接寫入數據庫字段中。
以下為具體方法:
一、保存圖片的上傳路徑到數據庫:
string
uppath="";//用于保存圖片上傳路徑
//獲取上傳圖片的文件名
string fileFullname =
this.FileUpload1.FileName;
//獲取圖片上傳的時間,以時間作為圖片的名字可以防止圖片重名
string
dataName =
DateTime.Now.ToString("yyyyMMddhhmmss");
//獲取圖片的文件名(不含擴展名)
string
fileName = fileFullname.Substring(fileFullname.LastIndexOf("\\") +
1);
//獲取圖片擴展名
string type =
fileFullname.Substring(fileFullname.LastIndexOf(".") +
1);
//判斷是否為要求的格式
if (type == "bmp" || type == "jpg" || type == "jpeg"
|| type == "gif" || type == "JPG" || type == "JPEG" || type == "BMP" || type ==
"GIF")
{
//將圖片上傳到指定路徑的文件夾
this.FileUpload1.SaveAs(Server.MapPath("~/upload")
+ "\\" + dataName + "." +
type);
//將路徑保存到變量,將該變量的值保存到數據庫相應字段即可
uppath
= "~/upload/" + dataName + "." +
type;
}
二、將圖片以二進制數據流直接保存到數據庫:
引用如下命名空間:
using
System.Drawing;
using System.IO;
using
System.Data.SqlClient;
設計數據庫時,表中相應的字段類型為iamge
保存:
//圖片路徑
string
strPath = this.FileUpload1.PostedFile.FileName.ToString
();
//讀取圖片
FileStream fs = new System.IO.FileStream(strPath,
FileMode.Open, FileAccess.Read);
BinaryReader br = new
BinaryReader(fs);
byte[] photo =
br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
//存入
SqlConnection
myConn = new SqlConnection("Data Source=.;Initial Catalog=stumanage;User
ID=sa;Password=123");
string strComm = " INSERT INTO
stuInfo(stuid,stuimage) VALUES(107,@photoBinary
)";//操作數據庫語句根據需要修改
SqlCommand myComm = new SqlCommand(strComm,
myConn);
myComm.Parameters.Add("@photoBinary", SqlDbType.Binary,
photo.Length);
myComm.Parameters["@photoBinary"].Value =
photo;
myConn.Open();
if (myComm.ExecuteNonQuery()
0)
{
this.Label1.Text =
"ok";
}
myConn.Close();
讀取:
...連接數據庫字符串省略
mycon.Open();
SqlCommand
command = new
SqlCommand("select stuimage from stuInfo where stuid=107",
mycon);//查詢語句根據需要修改
byte[] image = (byte[])command.ExecuteScalar
();
//指定從數據庫讀取出來的圖片的保存路徑及名字
string strPath =
"~/Upload/zhangsan.JPG";
string strPhotoPath =
Server.MapPath(strPath);
//按上面的路徑與名字保存圖片文件
BinaryWriter bw = new
BinaryWriter(File.Open(strPhotoPath,FileMode.OpenOrCreate));
bw.Write(image);
bw.Close();
//顯示圖片
this.Image1.ImageUrl
= strPath;
采用這兩種方式可以根據實際需求靈活選擇。
一般都是在數據庫中存儲照片文件的路徑,不會直接把照片文件存儲到數據庫中。
網頁題目:mysql怎么存人臉 mysql人臉識別
新聞來源:http://www.yijiale78.com/article32/hhcppc.html
成都網站建設公司_創新互聯,為您提供微信小程序、關鍵詞優化、ChatGPT、品牌網站建設、全網營銷推廣、云服務器
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯