Oracle中的数据类型和数据类型之间的转换
生活随笔
收集整理的這篇文章主要介紹了
Oracle中的数据类型和数据类型之间的转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
Oracle中的數據類型
/*ORACLE 中的數據類型;char 長度固定 范圍:1-2000VARCHAR2 長度可變 范圍:1-4000LONG 長度可變 最大的范圍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' --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) --默認的是字節 );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_descriptionsWHERE 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 N1WHERE NAME =N'我愛 '; --這樣查詢的話,你必須加上兩個空格;才能查到值滴呀;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數據類型。使用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'; BEGINDBMS_OUTPUT.put_line(I || J); --結果為 11END;DECLARE I INT :=1;J VARCHAR2(20) :='1'; BEGINDBMS_OUTPUT.put_line(I + J); --結果:2 ,存在隱私轉換和顯示轉換的問題滴呀END;DECLARE I VARCHAR2(20) :='1';J VARCHAR2(20) :='1'; BEGINDBMS_OUTPUT.put_line(I + J); --結果還是我們的2 關鍵看我們使用符號滴呀END;DECLARE I INT :=1;J INT :=1; BEGINDBMS_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 之間類型的轉換
--trunc--數值類型函數SELECT ABS(-5) FROM DUAL; --5SELECT CEIL(2.1) FROM DUAL; --3SELECT FLOOR(2.9) FROM DUAL; --2--ROUND 按指定的精度 對十進制進行四舍五入;SELECT ROUND(12.111,1) FROM DUAL; --12.1SELECT ROUND(12.999,1) FROM DUAL; --13 --TRNC 按照指定的精度 十進制,進行截斷 SELECT TRUNC(12.99,1) FROM DUAL; -- 12.9SELECT TRUNC(12.99) FROM DUAL; --12SELECT TRUNC(45.923,1) FROM DUAL; --45.9--字符類型函數SELECT ASCII('A') FROM DUAL; --65SELECT CHR(65) FROM DUAL; --ASELECT LOWER('ABC') FROM DUAL; --abcSELECT UPPER('abc') FROM DUAL; --ABC--將字符串轉換成每個單詞以大寫開頭--每個字母的開頭都是大寫的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--字符串的操作函數是比較有用滴呀;--第一次出現的位置SELECT INSTR('ABA','A',1,1) FROM DUAL; --1--第二次出線的位置SELECT INSTR('ABA','A',1,2) FROM DUAL; --3--用指定字符串填充左側 指定的長度SELECT LPAD('A',3,'-') FROM DUAL; -- --A--右側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--只是去除結尾的SELECT TRIM(trailing 'S' FROM 'SSMISTHS') FROM DUAL; --SSMISTH-- 還有一個both 參數 默認的就是這個函數滴呀SELECT TRIM(BOTH 'S' FROM 'SSMISTHS') FROM DUAL; --MISTH SELECT REPLACE('ABCB','B','X') FROM DUAL; --AXCX 這個就是基本的額轉換滴呀--日期類型函數--取出月份差值;select add_months(sysdate,-1) from dual; SELECT MONTHS_BETWEEN('04-11月-05','11-4月-05') FROM DUAL;--至少你要知道有這些函數,用的時候,才方便查詢滴呀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; --下個星期一的時間; 如:下周星期一是幾號;SELECT LAST_DAY(SYSDATE) FROM DUAL; --該月的最后一天SELECT LAST_DAY(ADD_MONTHS(SYSDATE,-4)) FROM DUAL;--TO_CHAR 中的時間格式滴呀;--按指定的格式,對時間進行四舍五入滴 SELECT ROUND(SYSDATE) FROM DUAL;SELECT TO_CHAR('13-2月-03') FROM DUAL; --尼瑪 原來這個時間,是尼瑪從右邊往左邊讀取滴呀,我曹你麻痹的SELECT TO_DATE('13-2月-03') FROM DUAL; ---2003/2/13--按照指定的格式,進行時間上的四射五日滴呀--比如:不到半個月,算一個月--比如: 滿8個月,算一年的 --各種算法滴呀;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;--按指定的方式進行截斷滴呀SELECT TRUNC(TO_DATE('13-2月-03'),'YEAR') FROM DUAL;SELECT TRUNC(TO_DATE('28-5月-03'),'MONTH') FROM DUAL;--這個就是按照周進行截斷SELECT TRUNC(TO_DATE('6-6月-16'),'DAY') FROM DUAL;--轉換函數--轉換成字符串類型;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; 就算是數字類型,也會給你轉換成字符類型的值;--自動類型轉換 /*自動類型轉換 Oracle可以自動根據具體情況進行如下的轉換: * 字符串到數值。 * 字符串到日期。 * 數值到字符串。 * 日期到字符串。 */--日期類型轉換--2016-06-23 17:02:39 下午 星期四 SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS AM DY') FROM DUAL;/*語句中的第一個參數表示要轉換的日期,第二個參數是格式字符串,表示轉換后的格式,結果類型為字符串。“YYYY”為4位的年份,“MM”為兩位的月份,“DD”為兩位的日期,“HH24”表示顯示24小時制的小時,“MI”表示顯示分鐘,“SS”表示顯示秒,“AM”表示顯示上午或下午(本例中為下午),“DY”表示顯示星期。“-”、“:”和空格原樣顯示,用于分割日期和時間*/--其他常用函數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;--多個語句之間的 判斷; SELECT DECODE((1-1),0,'男','女',(1-1),1,'男','女') FROM DUAL;--返回環境信息;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;?
轉載于:https://www.cnblogs.com/mc67/p/5607929.html
總結
以上是生活随笔為你收集整理的Oracle中的数据类型和数据类型之间的转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 页面区别
- 下一篇: 关于return和exit