图片如何存放在oracle数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图片如何存放在oracle数据库相关的知识,希望对你有一定的参考价值。

1、使用blob将图片保存为二进制格式,(可以用浏览器来转换)随后用base64编码来保存图片,再将base64编码保存进数据库的clob类型字段上。

2、然后要用一个数据名称System.Data.OracleClient。

3、创建一个储存文件,然后把相关代码写入比如string execSql="insert into clob_table(clob_id,) values(1,:clob_pic);"编写代码的时候注意,后缀的符号(;")也要写入,不然无法进行下一步指令。

4、之前上面用的是base64编码,当显示图片的时候要将图片输出到浏览器流中,不然在base64里面是看不到图片。

5、在输出的时候要把图片转换成二进制(buffur即二进制编码)。

6、随后上传即可,然二进制流也可以存成文件(File)存到FTP服务器,当需要的时候可以根据路径进行下载的。

参考技术A

1、使用blob将图像保存为二进制格式(可以使用浏览器转换),然后使用base64编码保存图像,然后将base64编码保存到数据库的clob类型字段。

2、然后使用数据名称System.Data.OracleClient(程序集System.Data.OracleClient)。

3、将映像保存到oracle数据库中创建一个存储文件,然后编写相关代码,如字符串execSql =“插入clob_table(clob_id),值(1,:clob_pic);”编写代码时,注意后缀符号(;“)是也写了,否则下一步不能发。

4、以前,上面是base64编码。显示图像时,应将图像输出到浏览器流。否则,您无法在base64中看到图像。

5、在输出时将图像转换为二进制(buffur或二进制代码)。

6、然后上传它,但二进制流也可以作为文件(File)保存到FTP服务器,可以根据需要的路径下载。

参考技术B 实现思路:将图片通过IO的形式转换为二进制,之后存储在BLOB(大数据)字段中进行实现。
备注:其实现在一般都不这么存储,这个转换的效率低,而且占用大量的存储空间。可以换一种思路:将图片保存在项目的路径下,之后再数据库中只保存图片的相对路径,之后需要的时候,直接将oracle数据转换成相应的图片路径,这种实现更快捷一些,如果图片放的为位置统一,实现一个方法接口即可快速的存储和读取。
参考技术C 图片存储到数据有二种:一种是存储图片路径,一种是将图片流存储到数据库。前者的类型可以用varchar2,后者的类型我给忘了。 参考技术D 以BLOB方式存放, 需要用特殊的jdbc方法

Oracle中的数据类型

 

Oracle中的数据类型

/*
   ORACLE 中的数据类型;
   
   char     长度固定 范围:1-2000

   VARCHAR2 长度可变 范围:1-4000
   
   LONG    长度可变   最大的范围2gb  长字符类型
   
   number  数字  number(p,s)
   
   Date  日期类型,精确到秒
   
   TIMESTAMP 存储日期,时间,时区,妙值,精确到小数
   
   CLOB 字符数据
   
   BLOB 存放二进制数据,视频图片等
   
   BFILE :用于将二进制数据存储在数据库外部的操作系统文件中
   
   所谓固定长度:

   所谓固定长度:是指虽然输入的字段值小于该字段的限制长度,
   但是实际存储数据时,会先自动向右补足空格后,
   才将字段值的内容存储到数据块中。
   这种方式虽然比较浪费空间,
   但是存储效率较可变长度类型要好。同时还能减少数据行迁移情况发生。
   
   
   所谓可变长度:是指当输入的字段值小于该字段的限制长度时,
   直接将字段值的内容存储到数据块中,
   而不会补上空白,这样可以节省数据块空间。
   
*/



--储字节或字符?

 CREATE TABLE T1(
   NAME CHAR(4) --默认的是字节
 );
 
  INSERT INTO T1 VALUES(AB);
  INSERT INTO T1 VALUES(ABCD);
  INSERT INTO T1 VALUES(我爱中国);   --这个就会报错
  INSERT INTO T1 VALUES(我爱);       --这样就是正确滴呀
  
  SELECT * FROM T1;
  SELECT LENGTH(ltrim(rtrim(NAME))) FROM T1 WHERE NAME=AB --2
  SELECT LENGTH(NAME) FROM T1 WHERE NAME=AB --4
  
   SELECT NAME FROM T1 WHERE NAME=NAB; --没有值滴呀;
   
    SELECT NAME FROM T1 WHERE NAME=AB; 
  
  
  
  --同样的比较;
   CREATE TABLE T2(
   NAME CHAR(4 CHAR) --默认的是字节
 );
 
  INSERT INTO T2 VALUES(ABCD);
  INSERT INTO T2 VALUES(ABCDABCD); --报错
  INSERT INTO T2 VALUES(我爱中国); ----正常插入
  
  SELECT * FROM T2;
 
  --一个汉字占几个字符,具体的还要看 编码方式
  /*
    数据库的NLS_CHARACTERSET 为AL32UTF8,即一个汉字占用三到四个字节。如果NLS_CHARACTERSET为ZHS16GBK,则一个字符占用两个字节。
  */


--NCHAR   --注意N 开头的都是unicode 字符类型的数据滴呀 
/*
这是一个包含UNICODE格式数据的定长字符串。NCHAR字段最多可以存储2,000字节的信息。它的最大长度取决于国家字符集。另外查询时,如果字段是NCHAR类型,则需要如下书写

SELECT translated_description FROM product_descriptions

WHERE translated_name = N‘LCD Monitor 11/PM‘;

*/


 CREATE TABLE N1(
   NAME NCHAR(4) --默认的是字节
 );
 
  INSERT INTO N1 VALUES(AB);
  INSERT INTO N1 VALUES(ABCD);
  INSERT INTO N1 VALUES(我爱中国);   --插入成功
  INSERT INTO N1 VALUES(我爱);       --插入成功
  
  SELECT * FROM N1;

/*
  N 在这里表示 Unicode,就是双字节字符。对于西文字符,用一个字节来存储过足够了,对于东方文字字符,
  就需要两个字节来存储。
  Unicode 为了统一、规范、方便、兼容,就规定西文字符也用两个字节来存储。
*/
-- N 不能乱加滴呀
  SELECT * FROM N1
  WHERE NAME =N我爱  ;  --这样查询的话,你必须加上两个空格;才能查到值滴呀;
  
  SELECT * FROM N1
  WHERE NAME =我爱;
  
  SELECT * FROM N1
  WHERE NAME =AB;
  
  
  SELECT * FROM N1
  WHERE NAME =NAB  ;
  
  
  SELECT LENGTH(AB) FROM DUAL;  --2
  
  SELECT LENGTH(AB  ) FROM DUAL;  --4
  
  SELECT LENGTH(NAME) FROM N1 WHERE NAME =AB; --长度为4


/*
 不要使用VARCHAR数据类型。使用VARCHAR2数据类型。虽然VARCHAR数据类型目前是VARCHAR2的同义词,
 VARCHAR数据类型将计划被重新定义为一个单独的数据类型用于可变长度的字符串相比,具有不同的比较语义。

1.4: VARCHAR2类型

变长字符串,与CHAR类型不同,它不会使用空格填充至最大长度。VARCHAR2最多可以存储4,000字节的信息。

1.5: NVARCHAR2类型

这是一个包含UNICODE格式数据的变长字符串。 NVARCHAR2最多可以存储4,000字节的信息。

*/


DECLARE 
   I INT :=1;
   J VARCHAR2(20) :=1;  
   BEGIN
       DBMS_OUTPUT.put_line(I || J);  --结果为 11
   END;
   
   
   DECLARE 
   I INT :=1;
   J VARCHAR2(20) :=1;  
   BEGIN
       DBMS_OUTPUT.put_line(I + J);  --结果:2 ,存在隐私转换和显示转换的问题滴呀
   END;
   

   
   DECLARE 
   I VARCHAR2(20) :=1;
   J VARCHAR2(20) :=1;  
   BEGIN
       DBMS_OUTPUT.put_line(I + J);  --结果还是我们的2 关键看我们使用符号滴呀
   END;


    DECLARE 
   I INT :=1;
   J INT :=1;  
   BEGIN
       DBMS_OUTPUT.put_line(I ||  J);  --结果是11 ,+ 是用于数值类型之间加减,||是用于字符串之间的加减;
                                       --这个才是问题的关键滴呀
   END;



  --时间格式的转换滴呀

SELECT SYSDATE FROM DUAL;  --默认的格式是这样的:   2016/6/22 16:12:07

--然后使用我们的TO_CHAR 来进行我们时间格式的转化滴:  2016-06-22 04:06:02
SELECT TO_CHAR(SYSDATE,YYYY-MM-DD HH:MM:SS) FROM DUAL;



--将数值类型转换成字符串类型;

--强制显示为当地的货币类型
SELECT TO_CHAR(1200,L99,999.99) FROM DUAL;

SELECT TO_CHAR(SAL,$00,000,00) FROM EMP;

 

这里再补充一些;

 

--这里还有我们的number 数据类型的值;
--INTEGER是NUMBER的子类型,它等同于NUMBER(38,0),用来存储整数。若插入、更新的数值有小数,则会被四舍五入。
--FLOAT类型也是NUMBER的子类型

/*
它存储变长字符串,最多达2G的字符数据(2GB是指2千兆字节, 而不是2千兆字符),与VARCHAR2 或CHAR 类型一样,存储在LONG 类型中的文本要进行字符集转换。ORACLE建议开发中使用CLOB替代LONG类型。支持LONG 列只是为了保证向后兼容性。CLOB类型比LONG类型的限制要少得多。 LONG类型的限制如下: 1.一个表中只有一列可以为LONG型。(Why?有些不明白) 2.LONG列不能定义为主键或唯一约束, 3.不能建立索引 4.LONG数据不能指定正则表达式。 5.函数或存储过程不能接受LONG数据类型的参数。 6.LONG列不能出现在WHERE子句或完整性约束(除了可能会出现NULL和NOT NULL约束)


*/

 

以上是关于图片如何存放在oracle数据库的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库中如何查询关联数据并导出指定数据?

oracle undo表空间该如何估算,设计多大合适?

用JAVA怎样将保存在数据库BLOB类型的图片取出来转换为图片然后在页面展示啊

如何在java中读取oracle blob

ORACLE数据库BLOB如何转化类型

Oracle中的数据类型