新聞中心
如何向MySQL中插入圖片文件
背景
創(chuàng)新互聯(lián)公司服務(wù)項目包括墨江網(wǎng)站建設(shè)、墨江網(wǎng)站制作、墨江網(wǎng)頁制作以及墨江網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,墨江網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到墨江省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
MySQL 一直以來都有 TEXT、BLOB 等類型用來存儲圖片、視頻等大對象信息。比如一張圖片,隨便一張都 5M 以上。視頻也是,隨便一部視頻就是 2G 以上。
假設(shè)用 MySQL 來存放電影視頻等信息,一部是 2G,那么存儲 1000 部就是 2TB,2TB 也就是 1000 條記錄而已,但是對數(shù)據(jù)庫性能來說,不僅僅是看記錄數(shù)量,更主要的還得看占用磁盤空間大小。空間大了,所有以前的經(jīng)驗啥的都失效了。
所以一般來說存放這類信息,也就是存儲他們的存放路徑,至于文件本身存放在哪里,那這就不是數(shù)據(jù)庫考慮的范疇了。數(shù)據(jù)庫只關(guān)心怎么來的快,怎么來的小。
舉例
雖然不推薦 MySQL 這樣做,但是也得知道 MySQL 該怎么做才行,做到心里有數(shù)。比如下面一張微信圖片,大概 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 設(shè)置到最大)
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`";
檢查下三張表記錄數(shù)
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。所以這里從存儲空間來看,存放路徑最占優(yōu)勢。
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 變?yōu)?unhex(image_file) 即可。
總結(jié)
這里我舉了個用 MySQL 來存放圖片的例子,總的來說有以下三點:
占用磁盤空間大(這樣會帶來各種各樣的功能與性能問題,比如備份,寫入,讀取操作等)
使用不易
還是推薦用文件路徑來代替實際的文件內(nèi)容存放
mysql數(shù)據(jù)庫怎么導入sql文件
第一步:打在開始界面中找到mysql
第二步:雙擊打開mysql軟件。,并輸入密碼。
第三步:如果sql文件的內(nèi)容中有創(chuàng)建數(shù)據(jù)庫的語句或者你想將表存放在你已有的數(shù)據(jù)庫,在這里就不用創(chuàng)建數(shù)據(jù)庫。
第四步:輸入“show databases;”就能看到自己創(chuàng)建的數(shù)據(jù)庫。
第五步:輸入“use 數(shù)據(jù)庫名”,開始使用這個數(shù)據(jù)庫。
第六步:開始導入sql文件,輸入“source sql文件的路徑”(注意你的文件路徑要是復制來的,要將"\"全部換成“/”)
第七步:輸入“show tables”,你就會看到你導入的表了。
如何把數(shù)據(jù)文件導入mysql
工具:navicat for MySQL
步驟:
1、打開navicat for MySQL,連接到數(shù)據(jù)庫所在服務(wù)器。如本圖就是連接到本地數(shù)據(jù)庫。
2、創(chuàng)建一個空的數(shù)據(jù)庫。在localhost處點右鍵,選擇“新建數(shù)據(jù)庫”,彈出窗口中填寫新建的數(shù)據(jù)庫名稱,字符集一般選擇UTF8即可(可根據(jù)實際情況更改),最后點擊確定按鈕,即可創(chuàng)建成功。
3、創(chuàng)建成功后,雙擊新建的數(shù)據(jù)庫,使之變成綠色,即連接狀態(tài)。
4、在badkano_test處點擊鼠標右鍵,選擇“運行sql文件”。
5、彈出窗口點“...”然后選擇要導入的sql文件,點擊打開。
6、最后點“開始”按鈕,等待導入步驟執(zhí)行完成即可。
linux上mysql怎樣導入sql數(shù)據(jù)庫文件?
首先通過xshell連接數(shù)據(jù)庫服務(wù)器,執(zhí)行命令mysql -u root -p 命令,按照提示輸入密碼。連接上數(shù)據(jù)庫。\x0d\x0a\x0d\x0a在連接終端上執(zhí)行命令create database JD_Model;\x0d\x0a執(zhí)行完成后,驗證數(shù)據(jù)庫是否創(chuàng)建成功。執(zhí)行命令show database;查看是否有JD_Model數(shù)據(jù)庫。\x0d\x0a\x0d\x0a將準備好的數(shù)據(jù)庫文件20151010.sql文件通過xftp工具,上傳至/root目錄下,并等待上傳完畢。\x0d\x0a\x0d\x0a在連接數(shù)據(jù)庫的終端執(zhí)行命令use JD_Model。\x0d\x0a使用JD_Model數(shù)據(jù)庫。具體操作如下圖所示。\x0d\x0a\x0d\x0a執(zhí)行命令source /root/20151010.sql。執(zhí)行數(shù)據(jù)庫導入命令。\x0d\x0a待導入完畢,執(zhí)行下一步操作。\x0d\x0a\x0d\x0a確定數(shù)據(jù)表是否創(chuàng)建成功,即數(shù)據(jù)文件是否導入成功。\x0d\x0a執(zhí)行命令 show tables;查看數(shù)據(jù)庫下的表。
mysql數(shù)據(jù)庫怎么導入數(shù)據(jù)庫文件
步驟如下:
首先使用MySQL提供的命令行界面來導入數(shù)據(jù)庫,確保自己的電腦中安裝了MySQL數(shù)據(jù)庫,可以通過命令行來確認是否安裝了MySQL數(shù)據(jù)庫,當然,第一步是打開Mysql的數(shù)據(jù)庫服務(wù),使用命令行來打開:如下圖所示:
啟動MySQL后,找到需要用到的腳本文件,也就是數(shù)據(jù)庫文件,首先得建立一個數(shù)據(jù)庫,這樣才可以導入腳本,如下圖所示:
在將腳本拷到本地磁盤的根目錄,這樣方便進入找到腳本,這里以D盤來說明,使用test.sql:接著來到命令行,使用SOURCE d:/test.sql;來導入數(shù)據(jù)庫,先進入mysql,如下圖所示:
首先要在數(shù)據(jù)庫中建立好數(shù)據(jù)庫,然后導入腳本,所以先建立一個數(shù)據(jù)庫,不要腳本是不知道要往哪個數(shù)據(jù)庫中導入腳本的,如下圖所示:
然后就可以輸入導入.sql文件命令:
mysql USE 數(shù)據(jù)庫名;
mysql SOURCE d:/test.sql;
如下圖所示:
看到上面的畫面,說明mysql數(shù)據(jù)庫已經(jīng)導入成功了。
navicat for mysql怎么導入sql文件
首先創(chuàng)建一個數(shù)據(jù)庫(因為我導入的sql文件只有建表和插入數(shù)據(jù)的語句)。
在連接名處點擊右鍵,接建數(shù)據(jù)庫。
請點擊輸入圖片描述
輸入數(shù)據(jù)庫的名稱,這里我選擇utf-8編碼,因為我安裝的mysql時有特意選擇utf-8.
請點擊輸入圖片描述
雙擊你新建的數(shù)據(jù)庫,使之顯示綠色狀態(tài)。然后在該數(shù)據(jù)庫的名稱上面點擊右鍵,選擇運行Sql文件。
請點擊輸入圖片描述
然后點擊如圖所示的圖標來查找你要運行的sql文件。
請點擊輸入圖片描述
注意當你要運行的sql文件有多個的時候,一定要注意它們的先后順序。比如先有建表的sql,才有插入數(shù)據(jù)的sql.
請點擊輸入圖片描述
選中之后,點擊確定,它就會運行sql語句。如果成功,會有如下相關(guān)的信息顯示。點擊關(guān)閉。
請點擊輸入圖片描述
此時點擊你的運行sql文件的數(shù)據(jù)庫,然后F5刷新,就能看到sql的效果了(比如有表結(jié)構(gòu)和數(shù)據(jù))。
請點擊輸入圖片描述
網(wǎng)頁名稱:mysql怎么插入文件,mysql寫入文件
本文網(wǎng)址:http://ef60e0e.cn/article/dsieojh.html