標籤:
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_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 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:02SELECT 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千MB, 而不是2千兆字元),與VARCHAR2 或CHAR 類型一樣,儲存在LONG 類型中的文本要進行字元集轉換。ORACLE建議開發中使用CLOB替代LONG類型。支援LONG 列只是為了保證向後相容性。CLOB類型比LONG類型的限制要少得多。 LONG類型的限制如下:1.一個表中只有一列可以為LONG型。(Why?有些不明白)2.LONG列不能定義為主鍵或唯一約束,3.不能建立索引4.LONG資料不能指定Regex。5.函數或預存程序不能接受LONG資料類型的參數。6.LONG列不能出現在WHERE子句或完整性條件約束(除了可能會出現NULL和NOT NULL約束)
*/
Oracle中的資料類型