Oracle中的数据类型和数据类型之间的转换
- 格式:pdf
- 大小:141.02 KB
- 文档页数:4
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=N'AB'; --没有值滴呀;
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 =N'AB ';
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 列只是为了保证
1.⼀个表中只有⼀列可以为LONG型。(Why?有些不明⽩)
2.LONG列不能定义为主键或唯⼀约束,
3.不能建⽴索引
4.LONG数据不能指定正则表达式。
5.函数或存储过程不能接受LONG数据类型的参数。
6.LONG列不能出现在WHERE⼦句或完整性约束(除了可能会出现NULL和NOT NULL约束)
*/
ORACLE 之间类型的转换
--trunc
--数值类型函数
SELECT ABS(-5) FROM DUAL; --5
SELECT CEIL(2.1) FROM DUAL; --3
SELECT FLOOR(2.9) FROM DUAL; --2
--ROUND 按指定的精度 对⼗进制进⾏四舍五⼊;
SELECT ROUND(12.111,1) FROM DUAL; --12.1
SELECT ROUND(12.999,1) FROM DUAL; --13