string sql = "insert into t_img(img) values (@img)";
string strconn = SystemConfigurationConfigurationManagerConnectionStrings["fengdongDB"]ToString();
SqlConnection sqlConn = new SqlConnection(strconn);
SqlCommand sqlComm = new SqlCommand(sql, sqlConn);
sqlCommParametersAdd("@img", SqlDbTypeImage);//添加参数
sqlCommParameters["@img"]Value = fileData;//为参数赋值
sqlConnOpen();
sqlCommExecuteNonQuery();
sqlConnClose();
2Oracle数据库。在Oracle数据库中我们可以使用BLOB字段类型,最大可以存储4G的数据。 例
byte[] fileData = thisFileUpload1FileBytes;
string sql = "insert into t_img(imgid,IMGDATA) values(100,:IMGDATA)";
string strconn = SystemConfigurationConfigurationManagerConnectionStrings["ConnectionStringForOracle"]ToString();
OracleConnection oraConn = new OracleConnection(strconn);
OracleCommand oraComm = new OracleCommand(sql, oraConn);
oraCommParametersAdd(":IMGDATA", OracleTypeBlob);//添加参数
oraCommParameters[":IMGDATA"]Value = fileData;//为参数赋值
oraConnOpen();
oraCommExecuteNonQuery();
oraConnClose(); 3Access数据库。在Access中我们使用OLE对象字段类型,最大支持1G的数据。 例
byte[] fileData = thisFileUpload1FileBytes;
string sql = "insert into t_img(IMGDATA) values()";
string strconn = SystemConfigurationConfigurationManagerConnectionStrings["ConnectionStringForAccess"]ToString();
OleDbConnection oleConn = new OleDbConnection(strconn);
OleDbCommand oleComm = new OleDbCommand(sql, oleConn);
oleCommParametersAdd("imgdata", OleDbTypeBinary);
oleCommParameters["imgdata"]Value = fileData;
oleConnOpen();
oleCommExecuteNonQuery();
oleConnClose();
1、打开开始菜单栏,在菜单栏上找到我们已经安装的SQL server 2008,单击打开它。
2、打开SQL server 2008数据库,来到登录界面,在这里我们只需要输入登录服务器名(电脑IP地址)、登录身份、账号、密码,然后单击登录。
3、成功登录进入SQL 数据库,可以看到连接的数据库基本信息,展开数据库结点,单击数据库然后使用鼠标右键,在d出的菜单中选择附加。
4、接着d出附加数据库的界面,这里我们只需要单击界面上的添加按钮就可以了。
5、单击添加按钮后,新d出来一个框,让你选择你要附加的数据文件路径,选择到我们要附加的数据库文件,单击确定按钮。
6、返回到附加数据库的界面,这是我们可以从界面上看到选择的附加数据库文件信息,然后在上方可以修改要附加的数据库名称。
7、单击确定按钮后,数据库的附加功能就启动了,这时候我们可以从界面上看到附加的进度。
sql中有数据类型image。在sql2005帮助中对此解释如下:Microsoft SQL Server 2005 将超过 8,000 个字符的字符串和大于 8,000 字节的二进制数据存储为名为 text 和
image 的特殊数据类型。超过 4,000 个字符的 Unicode 字符串存储为 ntext 数据类型。
例如,您需要将一个大型客户信息文本文件 (txt) 导入 SQL Server
数据库。应将这些数据作为一个数据块存储起来,而不是集成到数据表的多个列中。为此,可以创建一个 text
数据类型的列。但是,如果必须存储公司徽标,它们当前存储为标记图像文件格式 (TIFF) 图像 (tif) 且每个图像的大小为 10 KB,则可以创建一个
image 数据类型的列。
如果要存储的文本数据是 Unicode 格式,那么应使用 ntext
数据类型。例如,一个为国际客户创建的套用信函很可能包含用于各种不同语言的国际拼写和字符。这种数据应存储在 ntext 列中。
每个 text 和 ntext 数据值都具有排序规则。排序规则定义各种属性,例如比较规则以及是否区分大小写或重音。text
值的排序规则还指定了代码页,代码页定义用于表示每个字符的位模式。每个 ntext 值均使用对所有排序规则都相同的 Unicode
代码页。每个数据库都有默认的排序规则。当创建 text 或 ntext 列时,除非使用 COLLATE
子句指定了特定的排序规则,否则将为其指定数据库的默认排序规则。当组合或比较两个具有不同排序规则的 text 或 ntext
值时,根据排序规则的优先规则来确定 *** 作所使用的排序规则。
image 数据中的数据被存储为位串,SQL Server 不对其进行解释。对 image
列中的数据的任何解释都必须由应用程序来完成。例如,应用程序可以用 BMP、TIFF、GIF 或 JPEG 格式将数据存储在 image 列中。从 image
列中读取数据的应用程序必须能够识别数据的格式并正确显示数据。image 列所做的全部工作就是提供一个位置,以存储组成图像数据值的位流。
通常情况下,text、ntext 或 image 字符串是存储在数据行外的大型(最高可达 2 GB)字符或二进制字符串。数据行只包括一个
16 字节的文本指针,该指针指向一个树的根节点,该树由映射存储串片段的页的内部指针构成。
使用 SQL Server,可将中小型 text、ntext 和 image
值存储在一个数据行中,从而提高查询访问这些值的速度。
当 text、ntext 或 image 字符串存储在数据行中时,SQL Server
无须访问单独的页或页集合来读写这些字符串。这使得对 text、ntext 或 image 行内字符串的读取几乎与对 varchar、nvarchar 或
varbinary 字符串的读取一样快。
若要在数据行中存储 text、ntext 或 image 字符串,必须先使用 sp_tableoption 存储过程启用 text in
row 选项。
背景
MySQL 一直以来都有 TEXT、BLOB 等类型用来存储、视频等大对象信息。比如一张,随便一张都 5M 以上。视频也是,随便一部视频就是 2G 以上。
假设用 MySQL 来存放**视频等信息,一部是 2G,那么存储 1000 部就是 2TB,2TB 也就是 1000 条记录而已,但是对数据库性能来说,不仅仅是看记录数量,更主要的还得看占用磁盘空间大小。空间大了,所有以前的经验啥的都失效了。
所以一般来说存放这类信息,也就是存储他们的存放路径,至于文件本身存放在哪里,那这就不是数据库考虑的范畴了。数据库只关心怎么来的快,怎么来的小。
举例
虽然不推荐 MySQL 这样做,但是也得知道 MySQL 该怎么做才行,做到心里有数。比如下面一张微信,大概 5M 的样子。
root@ytt:/var/lib/mysql-files# ls -sihl 微信_20190711095019jpg274501 54M -rw-r--r-- 1 root root 54M Jul 11 07:17 微信_20190711095019jpg
拷贝 100 份这样的来测试
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信_20190711095019jpg "$i"jpg;done;
root@ytt:/var/lib/mysql-files# ls
100jpg 17jpg 25jpg 33jpg 41jpg 4jpg 58jpg 66jpg 74jpg 82jpg 90jpg 99jpg f8tsv
10jpg 18jpg 26jpg 34jpg 42jpg 50jpg 59jpg 67jpg 75jpg 83jpg 91jpg 9jpg 微信_20190711095019jpg
1111jpg 19jpg 27jpg 35jpg 43jpg 51jpg 5jpg 68jpg 76jpg 84jpg 92jpg f1tsv
11jpg 1jpg 28jpg 36jpg 44jpg 52jpg 60jpg 69jpg 77jpg 85jpg 93jpg f2tsv
12jpg 20jpg 29jpg 37jpg 45jpg 53jpg 61jpg 6jpg 78jpg 86jpg 94jpg f3tsv
13jpg 21jpg 2jpg 38jpg 46jpg 54jpg 62jpg 70jpg 79jpg 87jpg 95jpg f4tsv
14jpg 22jpg 30jpg 39jpg 47jpg 55jpg 63jpg 71jpg 7jpg 88jpg 96jpg f5tsv
15jpg 23jpg 31jpg 3jpg 48jpg 56jpg 64jpg 72jpg 80jpg 89jpg 97jpg f6tsv
16jpg 24jpg 32jpg 40jpg 49jpg 57jpg 65jpg 73jpg 81jpg 8jpg 98jpg f7tsv
我们建三张表,分别用 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 (000 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 (000 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 (000 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/mysqldsock -e "insert into ytttt_image1(image_file)
values (load_file('/var/lib/mysql-files/$ijpg'))";done;
tt_image2
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;
do mysql -S /var/run/mysqld/mysqldsock -e "insert into ytttt_image2(image_file)
values (hex(load_file('/var/lib/mysql-files/$ijpg')))";done;
tt_image3
root@ytt:/var/lib/mysql-files# aa='begin;';for i in `seq 1 100`;
do aa=$aa"insert into ytttt_image3(image_file) values
('/var/lib/mysql-files/$ijpg');";
done;aa=$aa'commit;';mysql -S /var/run/mysqld/mysqldsock -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 (000 sec)看下文件大小,可以看到实际大小排名,LONGTEXT 字段存储的最大,LONGBLOB 字段缩小到一半,最小的是存储路径的表 tt_image3。所以这里从存储空间来看,存放路径最占优势。
root@ytt:/var/lib/mysql/ytt# ls -silhS tt_image274603 11G -rw-r----- 1 mysql mysql 11G Jul 11 07:27 tt_image2ibd274602 545M -rw-r----- 1 mysql mysql 544M Jul 11 07:26 tt_image1ibd274605 80K -rw-r----- 1 mysql mysql 112K Jul 11 07:27 tt_image3ibd那么怎么把取出来呢?
tt_image3 肯定是最容易的
mysql> select from tt_image3;+----+----------------------------+| id | image_file |+----+----------------------------+| 1 | /var/lib/mysql-files/1jpg |+----+----------------------------+100 rows in set (000 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 来存放的例子,总的来说有以下三点:
占用磁盘空间大(这样会带来各种各样的功能与性能问题,比如备份,写入,读取 *** 作等)
使用不易
还是推荐用文件路径来代替实际的文件内容存放
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)