mysql字段怎么存对象 mysql存储语句

如何将一个java对象保存到数据库中?比如一个Map对象保存到mysql数据库的一个字段中???我学习Java还没那么深入,不过我想可以保存一个字段名,用的时候getString()出来,然后Class.forName("获取的字段"),回答不对见谅…………
如何在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.jpg17.jpg25.jpg33.jpg41.jpg4.jpg58.jpg66.jpg74.jpg82.jpg90.jpg99.jpgf8.tsv
10.jpg18.jpg26.jpg34.jpg42.jpg50.jpg59.jpg67.jpg75.jpg83.jpg91.jpg9.jpg微信图片_20190711095019.jpg
1111.jpg19.jpg27.jpg35.jpg43.jpg51.jpg5.jpg68.jpg76.jpg84.jpg92.jpgf1.tsv
11.jpg1.jpg28.jpg36.jpg44.jpg52.jpg60.jpg69.jpg77.jpg85.jpg93.jpgf2.tsv
12.jpg20.jpg29.jpg37.jpg45.jpg53.jpg61.jpg6.jpg78.jpg86.jpg94.jpgf3.tsv
13.jpg21.jpg2.jpg38.jpg46.jpg54.jpg62.jpg70.jpg79.jpg87.jpg95.jpgf4.tsv
14.jpg22.jpg30.jpg39.jpg47.jpg55.jpg63.jpg71.jpg7.jpg88.jpg96.jpgf5.tsv
15.jpg23.jpg31.jpg3.jpg48.jpg56.jpg64.jpg72.jpg80.jpg89.jpg97.jpgf6.tsv
16.jpg24.jpg32.jpg40.jpg49.jpg57.jpg65.jpg73.jpg81.jpg8.jpg98.jpgf7.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.ibd27460580K -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 BEGINDECLARE i,cnt INT DEFAULT 0;SELECT COUNT(*) FROM tt_image1 WHERE 1 INTO cnt;WHILE icnt DOSET @stmt = CONCAT('select image_file from tt_image1limit ',i,',1 into dumpfile ''/var/lib/mysql-files/image',i,'.jpg''');PREPARE s1 FROM @stmt;EXECUTE s1;DROP PREPARE s1;SET i = i1;END WHILE;END$$mysql DELIMITER ;mysql call sp_get_image;
tt_image2 类似,把 select 语句里 image_file 变为 unhex(image_file) 即可 。
总结
这里我举了个用 MySQL 来存放图片的例子,总的来说有以下三点:
占用磁盘空间大(这样会带来各种各样的功能与性能问题,比如备份,写入,读取操作等)
使用不易
还是推荐用文件路径来代替实际的文件内容存放
在mysql中怎样做到查询结果中带内嵌对象当分片索引不是纯整型的字符串时,只接受整型的内置 hash 算法是无法使用的 。为此,stringhash 按照用户定义的起点和终点去截取分片索引字段中的部分字符,根据当中每个字符的二进制 unicode 值换算出一个长整型数值,然后就直接调用内置 hash 算法求解分片路由:先求模得到逻辑分片号 , 再根据逻辑分片号直接映射到物理分片 。
用户需要在 rule.xml 中定义 partitionLength[] 和 partitionCount[] 两个数组和 hashSlice 二元组 。
在 DBLE 的启动阶段 , 点乘两个数组得到模数,也是逻辑分片的数量
并且根据两个数组的叉乘,得到各个逻辑分片到物理分片的映射表(物理分片数量由 partitionCount[] 数组的元素值之和)
此外根据 hashSlice 二元组,约定把分片索引值中的第 4 字符到第 5 字符(字符串以 0 开始编号,编号 3 到编号 4 等于第 4 字符到第 5 字符)字符串用于 “字符串-整型”的转换
在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值会被提取出来,取当中的第 4 个字符到第 5 字符,送入下一步
设置一个初始值为 0 的累计值,逐个取字符,把累计值乘以 31,再把这个字符的 unicode 值当成长整型加入到累计值中,如此类推直至处理完截取出来的所有字符,此时的累计值就能够代表用户的分片索引值,完成了 “字符串-整型” 的转换
对上一步的累计值进行求模,得到逻辑分片号
再根据逻辑分片号,查映射表,直接得到物理分片号
与MyCat的类似分片算法对比
请点击输入图片描述
两种算法在string转化为int之后,和 hash 分区算法相同 , 区别也继承了 hash 算法的区别 。
开发注意点
【分片索引】1. 必须是字符串
【分片索引】2. 最大物理分片配置方法是,让 partitionCount[] 数组和等于 2880
例如:
property name="partitionLength"1/propertyproperty name="partitionCount"2880/property

property name="partitionLength"1,1/propertyproperty name="partitionCount"1440,1440/property
【分片索引】3. 最小物理分片配置方法是,让 partitionCount[] 数组和等于 1
例如
property name="partitionLength"2880/propertyproperty name="partitionCount"1/property
【分片索引】4. partitionLength 和 partitionCount 被当做两个逗号分隔的一维数组,它们之间的点乘必须在 [1, 2880] 范围内
【分片索引】5. partitionLength 和 partitionCount 的配置对顺序敏感
property name="partitionLength"512,256/propertyproperty name="partitionCount"1,2/property

property name="partitionLength"256,512/propertyproperty name="partitionCount"2,1/property
是不同的分片结果
【分片索引】6. 分片索引字段长度小于用户指定的截取长度时,截取长度会安全减少到符合分片索引字段长度
【数据分布】1. 分片索引字段截取越长则越有利于数据均匀分布
【数据分布】2. 分片索引字段的内容重复率越低则越有利于数据均匀分布
运维注意点
【扩容】1. 预先过量分片,并且不改变 partitionCount 和 partitionLength 点乘结果,也不改变截取设置 hashSlice 时 , 可以避免数据再平衡,只需进行涉及数据的迁移
【扩容】2. 若需要改变 partitionCount 和 partitionLength 点乘结果或改变截取设置 hashSlice 时,需要数据再平衡
【缩容】1. 预先过量分片,并且不改变 partitionCount 和 partitionLength 点乘结果 , 也不改变截取设置 hashSlice 时,可以避免数据再平衡,只需进行涉及数据的迁移
【缩容】2. 若需要改变 partitionCount 和 partitionLength 点乘结果或改变截取设置 hashSlice 时,需要数据再平衡
配置注意点
【配置项】1. 在 rule.xml 中,可配置项为 property name="partitionLength"、property name="partitionCount" 和 property name="hashSlice"
【配置项】2.在 rule.xml 中配置 property name="partitionLength" 标签
内容形式为:物理分片持有的虚拟分片数[,物理分片持有的虚拟分片数,...物理分片持有的虚拟分片数]
物理分片持有的虚拟分片数必须是整型,物理分片持有的虚拟分片数从左到右与同顺序的物理分片数对应,partitionLength 和partitionCount 的点乘结果必须在 [1, 2880] 范围内
【配置项】3. 在 rule.xml 中配置 property name="partitionCount" 标签内容形式为:物理分片数[,物理分片数,...物理分片数]
其中物理分片数必须是整型,物理分片数按从左到右的顺序与同顺序的物理分片持有的虚拟分片数对应,物理分片的编号从左到右连续递进 , partitionLength 和 partitionCount 的点乘结果必须在 [1, 2880] 范围内
【配置项】4. partitionLength 和 partitionCount 的语义是:持有partitionLength[i] 个虚拟分片的物理分片有 partitionCount[i] 个
例如
property name="partitionLength"512,256/propertyproperty name="partitionCount"1,2/property
语义是持有 512 个逻辑分片的物理分片有 1 个,紧随其后,持有 256 个逻辑分片的物理分片有 2 个
【配置项】5.partitionLength 和 partitionCount 都对书写顺序敏感 ,
例如
property name="partitionLength"512,256/propertyproperty name="partitionCount"1,2/property
分片结果是第一个物理分片持有头512个逻辑分片,第二个物理分片持有紧接着的256个逻辑分片,第三个物理分片持有最后256个逻辑分片,相对的
property name="partitionLength"256,512/propertyproperty name="partitionCount"2,1/property
分片结果则是第一个物理分片持有头 256 个逻辑分片,第二个物理分片持有紧接着的 256 个逻辑分片,第三个物理分片持有最后 512 个逻辑分片
【配置项】6.partitionLength[] 的元素全部为 1 时,这时候partitionCount 数组和等于 partitionLength 和 partitionCount 的点乘,物理分片和逻辑分片就会一一对应,该分片算法等效于直接取余
【配置项】7.在 rule.xml 中配置标签 , 从分片索引字段的第几个字符开始截取到第几个字符:
若希望从首字符开始截取 k 个字符( k 为正整数),配置的内容形式可以为“ 0 : k ”、“ k ”或“ : k ”;
若希望从末字符开始截取 k 个字符( k 为正整数),则配置的内容形式可以为“ -k : 0 ”、“ -k ”或“ -k : ”;
若希望从头第 m 个字符起算截取 n 个字符( m 和 n 都是正整数),则先计算出 i = m - 1 和 j = in - 1 , 配置的内容形式为“ i : j ”;
若希望从尾第 m 个字符起算截取从尾算起的 n 个字符( m 和 n 都是正整数),则先计算出 i = -mn - 1,配置的内容形式可以为“ -m : i ”;
若希望不截取 , 则配置的内容形式可以为“ 0 : 0 ”、“ 0 : ”、“ : 0 ”或 “ : ”
mysql存图片麻烦吗? 用什么字段存?方法一:
把照片放进数据库,照片的格式最好是bmp,这样就可以在窗体上显示出来 , 不过这样数据库的体积会暴增 。
详细的使用方法请参考Access帮助中的 PictureData 属性(本文末尾有相关帮助) 。
而且,你可以直接用 commdlg API 函数来给图像框赋值 , 然后直接读取某个图像框的 PICTUREDATA 并存储到某个 IMAGE 字段中 。这样做的优点是显示、读取方便,缺点是如果图片精度高,占用的硬盘空间会爆大 。
详细示例请参考:
方法二:
设一个OLE字段,然后插入对象就行了(对着字段单击右键) 。但是要注意的是,用上述方法加入数据库的图片只能以手动方式保存 , 需要用程序读取的时候会碰到存储在ole字段中二进制数据与源文件不符的情况 。主要是因为ole引擎在图片的前面加了一段信息给他自己用 。
请参考:
;mode=3recordid=75FAB21E12DC
方法三:
将图片文件以二进制方式存储在数据库中,使用时调用 。详细情况请参考:
使用 ADO 的 STREAM 对象的 LoadFromFile 方法以及 SaveToFile 方法实现:
;mode=3recordid=74FAB51E13DC
使用 ADO 的 RECORDSET.FIELD 对象的 GetChunk 以及 AppendChunk 方法实现:
;mode=3recordid=75FAB01E
ASP 中使用的方法:
;mode=3recordid=79FAB31E
下列例程就是采用这种方法,在显示的时候把长二进制数据保存为临时文件用于显示
方法四:
不把照片放入数据库,只把照片的路径保存到数据库中,动态加载,这样可以支持很多种图片格式 。作法是在窗体上放一个图像控件,然后根据员工编号或别的有关联的字段去找出路径,用以下语句来加载图像:
图像1.Picture =路径名
路径名必须包括图象文件名 。
详细情况你可以参考 access xp 的示例 northwind.mdb 中的雇员窗体
你也可以参考:
mySql数据库和Sql数据库分别用什么数据类型存储对象(object 比如:HasTable ArrayList)?要能表示任意对象,只能用二进制了 。
先吧Session序列化为二进制数组,再写入数据库
【mysql字段怎么存对象 mysql存储语句】mysql字段怎么存对象的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql存储语句、mysql字段怎么存对象的信息别忘了在本站进行查找喔 。

    推荐阅读