當(dāng)前位置:
首頁 >
Oracle中的数据类型和数据类型之间的转换
發(fā)布時(shí)間:2025/5/22
29
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Oracle中的数据类型和数据类型之间的转换
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
Oracle中的數(shù)據(jù)類型
/*ORACLE 中的數(shù)據(jù)類型;char 長度固定 范圍:1-2000VARCHAR2 長度可變 范圍:1-4000LONG 長度可變 最大的范圍2gb 長字符類型number 數(shù)字 number(p,s)Date 日期類型,精確到秒TIMESTAMP 存儲(chǔ)日期,時(shí)間,時(shí)區(qū),妙值,精確到小數(shù)CLOB 字符數(shù)據(jù)BLOB 存放二進(jìn)制數(shù)據(jù),視頻圖片等BFILE :用于將二進(jìn)制數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫外部的操作系統(tǒng)文件中所謂固定長度:所謂固定長度:是指雖然輸入的字段值小于該字段的限制長度,但是實(shí)際存儲(chǔ)數(shù)據(jù)時(shí),會(huì)先自動(dòng)向右補(bǔ)足空格后,才將字段值的內(nèi)容存儲(chǔ)到數(shù)據(jù)塊中。這種方式雖然比較浪費(fèi)空間,但是存儲(chǔ)效率較可變長度類型要好。同時(shí)還能減少數(shù)據(jù)行遷移情況發(fā)生。所謂可變長度:是指當(dāng)輸入的字段值小于該字段的限制長度時(shí),直接將字段值的內(nèi)容存儲(chǔ)到數(shù)據(jù)塊中,而不會(huì)補(bǔ)上空白,這樣可以節(jié)省數(shù)據(jù)塊空間。*/--儲(chǔ)字節(jié)或字符?CREATE TABLE T1(NAME CHAR(4) --默認(rèn)的是字節(jié) );INSERT INTO T1 VALUES('AB');INSERT INTO T1 VALUES('ABCD');INSERT INTO T1 VALUES('我愛中國'); --這個(gè)就會(huì)報(bào)錯(cuò)INSERT INTO T1 VALUES('我愛'); --這樣就是正確滴呀SELECT * FROM T1;SELECT LENGTH(ltrim(rtrim(NAME))) FROM T1 WHERE NAME='AB' --2SELECT LENGTH(NAME) FROM T1 WHERE NAME='AB' --4SELECT NAME FROM T1 WHERE NAME=N'AB'; --沒有值滴呀;SELECT NAME FROM T1 WHERE NAME='AB'; --同樣的比較;CREATE TABLE T2(NAME CHAR(4 CHAR) --默認(rèn)的是字節(jié) );INSERT INTO T2 VALUES('ABCD');INSERT INTO T2 VALUES('ABCDABCD'); --報(bào)錯(cuò)INSERT INTO T2 VALUES('我愛中國'); ----正常插入SELECT * FROM T2;--一個(gè)漢字占幾個(gè)字符,具體的還要看 編碼方式/*數(shù)據(jù)庫的NLS_CHARACTERSET 為AL32UTF8,即一個(gè)漢字占用三到四個(gè)字節(jié)。如果NLS_CHARACTERSET為ZHS16GBK,則一個(gè)字符占用兩個(gè)字節(jié)。*/--NCHAR --注意N 開頭的都是unicode 字符類型的數(shù)據(jù)滴呀 /* 這是一個(gè)包含UNICODE格式數(shù)據(jù)的定長字符串。NCHAR字段最多可以存儲(chǔ)2,000字節(jié)的信息。它的最大長度取決于國家字符集。另外查詢時(shí),如果字段是NCHAR類型,則需要如下書寫SELECT translated_description FROM product_descriptionsWHERE translated_name = N'LCD Monitor 11/PM';*/CREATE TABLE N1(NAME NCHAR(4) --默認(rèn)的是字節(jié) );INSERT INTO N1 VALUES('AB');INSERT INTO N1 VALUES('ABCD');INSERT INTO N1 VALUES('我愛中國'); --插入成功INSERT INTO N1 VALUES('我愛'); --插入成功SELECT * FROM N1;/*N 在這里表示 Unicode,就是雙字節(jié)字符。對(duì)于西文字符,用一個(gè)字節(jié)來存儲(chǔ)過足夠了,對(duì)于東方文字字符,就需要兩個(gè)字節(jié)來存儲(chǔ)。Unicode 為了統(tǒng)一、規(guī)范、方便、兼容,就規(guī)定西文字符也用兩個(gè)字節(jié)來存儲(chǔ)。 */ -- N 不能亂加滴呀SELECT * FROM N1WHERE NAME =N'我愛 '; --這樣查詢的話,你必須加上兩個(gè)空格;才能查到值滴呀;SELECT * FROM N1WHERE NAME ='我愛';SELECT * FROM N1WHERE NAME ='AB';SELECT * FROM N1WHERE NAME =N'AB ';SELECT LENGTH('AB') FROM DUAL; --2SELECT LENGTH('AB ') FROM DUAL; --4SELECT LENGTH(NAME) FROM N1 WHERE NAME ='AB'; --長度為4/*不要使用VARCHAR數(shù)據(jù)類型。使用VARCHAR2數(shù)據(jù)類型。雖然VARCHAR數(shù)據(jù)類型目前是VARCHAR2的同義詞,VARCHAR數(shù)據(jù)類型將計(jì)劃被重新定義為一個(gè)單獨(dú)的數(shù)據(jù)類型用于可變長度的字符串相比,具有不同的比較語義。1.4: VARCHAR2類型變長字符串,與CHAR類型不同,它不會(huì)使用空格填充至最大長度。VARCHAR2最多可以存儲(chǔ)4,000字節(jié)的信息。1.5: NVARCHAR2類型這是一個(gè)包含UNICODE格式數(shù)據(jù)的變長字符串。 NVARCHAR2最多可以存儲(chǔ)4,000字節(jié)的信息。*/DECLARE I INT :=1;J VARCHAR2(20) :='1'; BEGINDBMS_OUTPUT.put_line(I || J); --結(jié)果為 11END;DECLARE I INT :=1;J VARCHAR2(20) :='1'; BEGINDBMS_OUTPUT.put_line(I + J); --結(jié)果:2 ,存在隱私轉(zhuǎn)換和顯示轉(zhuǎn)換的問題滴呀END;DECLARE I VARCHAR2(20) :='1';J VARCHAR2(20) :='1'; BEGINDBMS_OUTPUT.put_line(I + J); --結(jié)果還是我們的2 關(guān)鍵看我們使用符號(hào)滴呀END;DECLARE I INT :=1;J INT :=1; BEGINDBMS_OUTPUT.put_line(I || J); --結(jié)果是11 ,+ 是用于數(shù)值類型之間加減,||是用于字符串之間的加減;--這個(gè)才是問題的關(guān)鍵滴呀END;--時(shí)間格式的轉(zhuǎn)換滴呀SELECT SYSDATE FROM DUAL; --默認(rèn)的格式是這樣的: 2016/6/22 16:12:07--然后使用我們的TO_CHAR 來進(jìn)行我們時(shí)間格式的轉(zhuǎn)化滴: 2016-06-22 04:06:02 SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH:MM:SS') FROM DUAL;--將數(shù)值類型轉(zhuǎn)換成字符串類型;--強(qiáng)制顯示為當(dāng)?shù)氐呢泿蓬愋?/span> SELECT TO_CHAR(1200,'L99,999.99') FROM DUAL;SELECT TO_CHAR(SAL,'$00,000,00') FROM EMP;?
這里再補(bǔ)充一些;
?
--這里還有我們的number 數(shù)據(jù)類型的值; --INTEGER是NUMBER的子類型,它等同于NUMBER(38,0),用來存儲(chǔ)整數(shù)。若插入、更新的數(shù)值有小數(shù),則會(huì)被四舍五入。 --FLOAT類型也是NUMBER的子類型/*它存儲(chǔ)變長字符串,最多達(dá)2G的字符數(shù)據(jù)(2GB是指2千兆字節(jié), 而不是2千兆字符),與VARCHAR2 或CHAR 類型一樣,存儲(chǔ)在LONG 類型中的文本要進(jìn)行字符集轉(zhuǎn)換。ORACLE建議開發(fā)中使用CLOB替代LONG類型。支持LONG 列只是為了保證向后兼容性。CLOB類型比LONG類型的限制要少得多。 LONG類型的限制如下:1.一個(gè)表中只有一列可以為LONG型。(Why?有些不明白)2.LONG列不能定義為主鍵或唯一約束,3.不能建立索引4.LONG數(shù)據(jù)不能指定正則表達(dá)式。5.函數(shù)或存儲(chǔ)過程不能接受LONG數(shù)據(jù)類型的參數(shù)。6.LONG列不能出現(xiàn)在WHERE子句或完整性約束(除了可能會(huì)出現(xiàn)NULL和NOT NULL約束)
*/
?ORACLE 之間類型的轉(zhuǎn)換
--trunc--數(shù)值類型函數(shù)SELECT ABS(-5) FROM DUAL; --5SELECT CEIL(2.1) FROM DUAL; --3SELECT FLOOR(2.9) FROM DUAL; --2--ROUND 按指定的精度 對(duì)十進(jìn)制進(jìn)行四舍五入;SELECT ROUND(12.111,1) FROM DUAL; --12.1SELECT ROUND(12.999,1) FROM DUAL; --13 --TRNC 按照指定的精度 十進(jìn)制,進(jìn)行截?cái)?SELECT TRUNC(12.99,1) FROM DUAL; -- 12.9SELECT TRUNC(12.99) FROM DUAL; --12SELECT TRUNC(45.923,1) FROM DUAL; --45.9--字符類型函數(shù)SELECT ASCII('A') FROM DUAL; --65SELECT CHR(65) FROM DUAL; --ASELECT LOWER('ABC') FROM DUAL; --abcSELECT UPPER('abc') FROM DUAL; --ABC--將字符串轉(zhuǎn)換成每個(gè)單詞以大寫開頭--每個(gè)字母的開頭都是大寫的SELECT INITCAP('i am student') FROM DUAL; --I Am StudentSELECT CONCAT('HELLO--','67') FROM DUAL; --HELLO--67SELECT SUBSTR('HELLO',1,2) FROM DUAL; --HE ,2 是包含了自己的SELECT LENGTH('FUCK') FROM DUAL; --4--字符串的操作函數(shù)是比較有用滴呀;--第一次出現(xiàn)的位置SELECT INSTR('ABA','A',1,1) FROM DUAL; --1--第二次出線的位置SELECT INSTR('ABA','A',1,2) FROM DUAL; --3--用指定字符串填充左側(cè) 指定的長度SELECT LPAD('A',3,'-') FROM DUAL; -- --A--右側(cè)SELECT RPAD('A',3,'-') FROM DUAL; -- A----先是去除空格;SELECT LENGTH(TRIM(' A ')) FROM DUAL; --1-- 去除 ssmith 中的s SELECT trim('S' FROM 'SSMISTHS') FROM DUAL; --MISTH --只是去除開頭的SELECT TRIM(LEADING 'S' FROM 'SSMISTHS') FROM DUAL; --MISTHS--只是去除結(jié)尾的SELECT TRIM(trailing 'S' FROM 'SSMISTHS') FROM DUAL; --SSMISTH-- 還有一個(gè)both 參數(shù) 默認(rèn)的就是這個(gè)函數(shù)滴呀SELECT TRIM(BOTH 'S' FROM 'SSMISTHS') FROM DUAL; --MISTH SELECT REPLACE('ABCB','B','X') FROM DUAL; --AXCX 這個(gè)就是基本的額轉(zhuǎn)換滴呀--日期類型函數(shù)--取出月份差值;select add_months(sysdate,-1) from dual; SELECT MONTHS_BETWEEN('04-11月-05','11-4月-05') FROM DUAL;--至少你要知道有這些函數(shù),用的時(shí)候,才方便查詢滴呀SELECT add_months(sysdate,3) FROM DUAL;SELECT to_char(add_months(sysdate,1),'yyyy-mm-dd') FROM DUAL; --就變成了我們的 SELECT NEXT_DAY(SYSDATE,'星期一') FROM DUAL; --下個(gè)星期一的時(shí)間; 如:下周星期一是幾號(hào);SELECT LAST_DAY(SYSDATE) FROM DUAL; --該月的最后一天SELECT LAST_DAY(ADD_MONTHS(SYSDATE,-4)) FROM DUAL;--TO_CHAR 中的時(shí)間格式滴呀;--按指定的格式,對(duì)時(shí)間進(jìn)行四舍五入滴 SELECT ROUND(SYSDATE) FROM DUAL;SELECT TO_CHAR('13-2月-03') FROM DUAL; --尼瑪 原來這個(gè)時(shí)間,是尼瑪從右邊往左邊讀取滴呀,我曹你麻痹的SELECT TO_DATE('13-2月-03') FROM DUAL; ---2003/2/13--按照指定的格式,進(jìn)行時(shí)間上的四射五日滴呀--比如:不到半個(gè)月,算一個(gè)月--比如: 滿8個(gè)月,算一年的 --各種算法滴呀;SELECT ROUND(TO_DATE('13-2月-03'),'YEAR') FROM DUAL;SELECT ROUND(TO_DATE('17-5月-03'),'MONTH') FROM DUAL;SELECT ROUND(TO_DATE('13-2月-03'),'DAY') FROM DUAL;--按指定的方式進(jìn)行截?cái)嗟窝?/span>SELECT TRUNC(TO_DATE('13-2月-03'),'YEAR') FROM DUAL;SELECT TRUNC(TO_DATE('28-5月-03'),'MONTH') FROM DUAL;--這個(gè)就是按照周進(jìn)行截?cái)?/span>SELECT TRUNC(TO_DATE('6-6月-16'),'DAY') FROM DUAL;--轉(zhuǎn)換函數(shù)--轉(zhuǎn)換成字符串類型;SELECT TO_CHAR(1234.5,'$9999.9') FROM DUAL;SELECT TO_DATE('1990-01-10','yyyy-mm-dd') FROM DUAL;SELECT TO_NUMBER('123.5') FROM DUAL;-- SELECT 1 || 1 FROM DUAL; 就算是數(shù)字類型,也會(huì)給你轉(zhuǎn)換成字符類型的值;--自動(dòng)類型轉(zhuǎn)換 /*自動(dòng)類型轉(zhuǎn)換 Oracle可以自動(dòng)根據(jù)具體情況進(jìn)行如下的轉(zhuǎn)換: * 字符串到數(shù)值。 * 字符串到日期。 * 數(shù)值到字符串。 * 日期到字符串。 */--日期類型轉(zhuǎn)換--2016-06-23 17:02:39 下午 星期四 SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS AM DY') FROM DUAL;/*語句中的第一個(gè)參數(shù)表示要轉(zhuǎn)換的日期,第二個(gè)參數(shù)是格式字符串,表示轉(zhuǎn)換后的格式,結(jié)果類型為字符串。“YYYY”為4位的年份,“MM”為兩位的月份,“DD”為兩位的日期,“HH24”表示顯示24小時(shí)制的小時(shí),“MI”表示顯示分鐘,“SS”表示顯示秒,“AM”表示顯示上午或下午(本例中為下午),“DY”表示顯示星期。“-”、“:”和空格原樣顯示,用于分割日期和時(shí)間*/--其他常用函數(shù)SELECT NVL(NULL,0) FROM DUAL;SELECT DECODE(1,1,'男',2,'女','中間') from DUAL;SELECT DECODE(7,1,'男',2,'女','中間') from DUAL;--或則可以這么使用滴呀SELECT DECODE((1-1),0,'男','女') FROM DUAL;--多個(gè)語句之間的 判斷; SELECT DECODE((1-1),0,'男','女',(1-1),1,'男','女') FROM DUAL;--返回環(huán)境信息;SELECT USERENV('LANGUAGE') FROM DUAL;--返回最大值SELECT GREATEST(1,2,23,6,3,2,222) FROM DUAL;--返回最小值 SELECT LEAST(1,2,23,6,3,2,222) FROM DUAL;?
轉(zhuǎn)載于:https://www.cnblogs.com/mc67/p/5607929.html
總結(jié)
以上是生活随笔為你收集整理的Oracle中的数据类型和数据类型之间的转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 页面区别
- 下一篇: 关于return和exit