存儲文件到mysql,存儲文件到我的iphone 去哪找

本文目錄一覽:

學習怎樣把視頻文件存儲到mysql數據庫

背景

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 來存放圖片的例子,總的來說有以下三點:

佔用磁盤空間大(這樣會帶來各種各樣的功能與性能問題,比如備份,寫入,讀取操作等)

使用不易

還是推薦用文件路徑來代替實際的文件內容存放

如何把數據文件導入mysql

工具:navicat for MySQL

步驟:

1、打開navicat for MySQL,連接到數據庫所在服務器。如本圖就是連接到本地數據庫。

2、創建一個空的數據庫。在localhost處點右鍵,選擇“新建數據庫”,彈出窗口中填寫新建的數據庫名稱,字符集一般選擇UTF8即可(可根據實際情況更改),最後點擊確定按鈕,即可創建成功。

3、創建成功後,雙擊新建的數據庫,使之變成綠色,即連接狀態。

4、在badkano_test處點擊鼠標右鍵,選擇“運行sql文件”。

5、彈出窗口點“…”然後選擇要導入的sql文件,點擊打開。

6、最後點“開始”按鈕,等待導入步驟執行完成即可。

如何把文件存放在mysql數據庫中

1、mysql如果使用myisam存儲引擎,數據庫文件類型就包括.frm、.myd、.myi,默認存放位置是c:\documents

and

settings\all

users\application

data\mysql\mysql

server

5.1\data

2、mysql如果使用innodb存儲引擎,mysql數據庫文件類型就包括.frm、ibdata1、.ibd,存放位置有兩個,

.frm文件默認存放位置是c:\documents

and

settings\all

users\application

data\mysql\mysql

server

5.1\data,

ibdata1、.ibd文件默認存放位置是mysql安裝目錄下的data文件夾

如何將原始的plt文件存儲到Mysql數據庫中

MySQL數據庫的導入,有兩種方法:

1)

先導出數據庫SQL腳本,再導入;

2)

直接拷貝數據庫目錄和文件。

在不同操作系統或MySQL版本情況下,直接拷貝文件的方法可能會有不兼容的情況發生。

所以一般推薦用SQL腳本形式導入。下面分別介紹兩種方法。

2.

方法一

SQL腳本形式

操作步驟如下:

2.1.

導出SQL腳本

在原數據庫服務器上,可以用phpMyAdmin工具,或者mysqldump命令行,導出SQL腳本。

2.1.1

用phpMyAdmin工具

導出選項中,選擇導出“結構”和“數據”,不要添加“DROP

DATABASE”和“DROP

TABLE”選項。

選中“另存為文件”選項,如果數據比較多,可以選中“gzipped”選項。

將導出的SQL文件保存下來。

2.1.2

用mysqldump命令行

命令格式

mysqldump

-u用戶名

-p

數據庫名

數據庫名.sql

範例:

mysqldump

-uroot

-p

abc

abc.sql

(導出數據庫abc到abc.sql文件)

提示輸入密碼時,輸入該數據庫用戶名的密碼。

2.2.

創建空的數據庫

通過主控界面/控制面板,創建一個數據庫。假設數據庫名為abc,數據庫全權用戶為abc_f。

2.3.

將SQL腳本導入執行

同樣是兩種方法,一種用phpMyAdmin(mysql數據庫管理)工具,或者mysql命令行。

2.3.1

用phpMyAdmin工具

從控制面板,選擇創建的空數據庫,點“管理”,進入管理工具頁面。

在”SQL”菜單中,瀏覽選擇剛才導出的SQL文件,點擊“執行”以上載並執行。

注意:phpMyAdmin對上載的文件大小有限制,php本身對上載文件大小也有限制,如果原始sql文件

比較大,可以先用gzip對它進行壓縮,對於sql文件這樣的文本文件,可獲得1:5或更高的壓縮率。

gzip使用方法:

#

gzip

xxxxx.sql

得到

xxxxx.sql.gz文件。

提示輸入密碼時,輸入該數據庫用戶名的密碼。

3

直接拷貝

如果數據庫比較大,可以考慮用直接拷貝的方法,但不同版本和操作系統之間可能不兼容,要慎用。

3.1

準備原始文件

用tar打包為一個文件

3.2

創建空數據庫

3.3

解壓

在臨時目錄中解壓,如:

cd

/tmp

tar

zxf

mydb.tar.gz

3.4

拷貝

將解壓後的數據庫文件拷貝到相關目錄

cd

mydb/

cp

*

/var/lib/mysql/mydb/

對於FreeBSD:

cp

*

/var/db/mysql/mydb/

3.5

權限設置

將拷貝過去的文件的屬主改為mysql:mysql,權限改為660

chown

mysql:mysql

/var/lib/mysql/mydb/*

chmod

660

/var/lib/mysql/mydb/*

如何把csv文件批量導入到mysql數據庫

通過命令行導入(要求列與列之間以 英文逗號 分割,若字段中含有 , 則以 ” 包裹)

load data infile ‘D:/mysql-5.7.29-winx64/files/ratings_5.csv’ into table ratings fields terminated by ‘,’ optionally enclosed by ‘”‘ escaped by ‘”‘ lines terminated by ‘\r\n’;

踩坑一:文件路徑用 \ 分割會報錯,用 / 可(用 \\ 應該也可)

踩坑二:load data 命令報錯

ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement

在 my.ini 中加入(空字符串代表允許從一切目錄導入)

[mysqld]

secure-file-priv=”

然後再 Windows 的服務中重新啟動 mysql

踩坑三:csv 文件中第一行是諸如 userId 這樣的列名

如果你的 csv 文件不大,直接使用 notepad++ 打開後刪除第一行即可

但在我們這裡,千萬級別的文件 notepad++ 無法打開,這時可以考慮兩種方法

1. 將 csv 文件傳入 Linux 服務器刪去第一行

由於不知道如何在 Win 10 中做這個操作,只能通過 Linux 中轉執行

sed -i ‘1d’ ratings.csv

檢驗是否成功,可以打印出第一行觀察

cat ratings.csv | head -n 1

2. 通過工具把大的 csv 分成多個 notepad 能夠打開的較小文件,對第一個文件刪除第一行並依次導入

工具:splitcsv

親測 5000000 條數據的 csv 文件可以在 notepad++ 中打開(只能同時打開 3 個)

這個工具還有個小坑:ratings_0.csv 的最後一行和 ratings_1.csv 的第一行是重複的,請手動刪除

原創文章,作者:FRAK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/133978.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FRAK的頭像FRAK
上一篇 2024-10-04 00:02
下一篇 2024-10-04 00:02

相關推薦

發表回復

登錄後才能評論