新聞中心
通常,表達(dá)式不能包含不同數(shù)據(jù)類型的值。但是為了使表達(dá)式能夠進(jìn)行計(jì)算,OceanBase 支持從一個(gè)數(shù)據(jù)類型到另一個(gè)數(shù)據(jù)類型的值的隱式轉(zhuǎn)換和顯式轉(zhuǎn)換。

隱式數(shù)據(jù)類型轉(zhuǎn)換
當(dāng)轉(zhuǎn)換有意義時(shí),OceanBase 數(shù)據(jù)庫會自動將一個(gè)值從一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。隱式數(shù)據(jù)類型的轉(zhuǎn)換規(guī)則:
INSERT和UPDATE操作時(shí),OceanBase 把變量值轉(zhuǎn)換成列類型。SELECT FROM操作時(shí),OceanBase 把列數(shù)據(jù)類型轉(zhuǎn)換成目標(biāo)變量類型。字符值和數(shù)字值比較時(shí),OceanBase 把字符值轉(zhuǎn)換成數(shù)字值。
在處理數(shù)值時(shí),OceanBase 會調(diào)整精度和小數(shù)位數(shù)。由此產(chǎn)生的數(shù)字?jǐn)?shù)據(jù)類型與基礎(chǔ)表中找到的數(shù)字?jǐn)?shù)據(jù)類型不同。
字符值或數(shù)值和浮點(diǎn)數(shù)值之間的轉(zhuǎn)換可以是不精確的,因?yàn)樽址愋秃蛿?shù)量使用十進(jìn)制精度來表示數(shù)值,浮點(diǎn)數(shù)使用二進(jìn)制精度。
當(dāng)一個(gè)
CLOB值轉(zhuǎn)換為一個(gè)字符類型如VARCHAR2,或BLOB轉(zhuǎn)換為RAW時(shí)。如果要轉(zhuǎn)換的數(shù)據(jù)大于目標(biāo)數(shù)據(jù)類型,那么數(shù)據(jù)庫會返回一個(gè)錯誤。在從時(shí)間戳值轉(zhuǎn)換為
DATE值的過程中,時(shí)間戳值的小數(shù)秒部分被截?cái)?,且時(shí)間戳值的小數(shù)秒部分進(jìn)行四舍五入。從
BINARY_FLOAT轉(zhuǎn)換為BINARY_DOUBLE是準(zhǔn)確的。如果
BINARY_DOUBLE的精度位數(shù)超出了BINARY_FLOAT支持的位數(shù),BINARY_DOUBLE轉(zhuǎn)換為BINARY_FLOAT是不精確的。當(dāng)將字符值與
DATE值進(jìn)行比較時(shí),OceanBase 將字符數(shù)據(jù)轉(zhuǎn)換為DATE。賦值操作時(shí),OceanBase 把等號右邊的值轉(zhuǎn)換成左邊賦值目標(biāo)數(shù)據(jù)類型。
連接操作時(shí),OceanBase 把非字符類型轉(zhuǎn)換成字符類型或國家字符類型。
隱式數(shù)據(jù)類型轉(zhuǎn)換矩陣
下表顯示了所有的隱式數(shù)據(jù)類型轉(zhuǎn)換,您不需要考慮轉(zhuǎn)換的方向或轉(zhuǎn)換的上下文?!?”表示不支持轉(zhuǎn)換。
| 數(shù)據(jù)類型 | CHAR | VARCHAR2 | NCHAR | NVARCHAR2 | DATE | DATETIME / INTERVAL | NUMBER | BINARY_FLOAT | BINARY_DOUBLE | RAW | CLOB | BLOB |
1 您不能直接將 RAW 轉(zhuǎn)換為 INTERVAL,但是可以使用 UTL_RAW.CAST_TO_VARCHAR2([RAW]) 將RAW 轉(zhuǎn)換為 VARCHAR2,然后將所得的 VARCHAR2 值轉(zhuǎn)換為 INTERVAL。
不同字符類型之間隱式轉(zhuǎn)換的方向
| 數(shù)據(jù)類型 | TO_CHAR | TO_VARCHAR2 | TO_NCHAR | TO_NVARCHAR2 |
隱式數(shù)據(jù)類型轉(zhuǎn)換示例
執(zhí)行以下語句:
SELECT 5 * 10 + 'james' FROM DUAL;語句執(zhí)行失敗,且您收到以下報(bào)錯:
invalid number這是由于 OceanBase 使用了隱式數(shù)據(jù)類型轉(zhuǎn)換,將 'james' 轉(zhuǎn)換為數(shù)字類型,但是轉(zhuǎn)換失敗。
本示例將字符串 '2' 從 CHAR 數(shù)據(jù)類型隱式轉(zhuǎn)換為了數(shù)字?jǐn)?shù)據(jù)類型 2,計(jì)算結(jié)果為 52。
執(zhí)行以下語句:
SELECT 5 * 10 + '2' FROM DUAL;查詢結(jié)果如下:
+---------------------+
| 5 * 10 + '2' |
+---------------------+
| 52 |
+---------------------+顯式數(shù)據(jù)類型轉(zhuǎn)換
您可以使用 SQL 轉(zhuǎn)換函數(shù)轉(zhuǎn)換數(shù)據(jù)類型,SQL 函數(shù)顯式轉(zhuǎn)換一個(gè)數(shù)據(jù)類型為另一個(gè)數(shù)據(jù)類型。
顯示類型轉(zhuǎn)換矩陣
| 數(shù)據(jù)類型 | To CHAR、VARCHAR2、NCHAR、NVARCHAR2 | To NUMBER | To Datetime/ Interval | To RAW | To CLOB、BLOB | To_BINARY_FLOAT | To_BINARY_DOUBLE |
| From CHAR、VARCHAR2、NCHAR、NVARCHAR2 | |||||||
| From NUMBER | |||||||
| From Datetime/Interval | |||||||
| From RAW | |||||||
| From CLOB、BLOB | |||||||
| From BINARY_FLOAT | |||||||
| From BINARY_DOUBLE | |||||||
顯式數(shù)據(jù)類型轉(zhuǎn)換示例
當(dāng)前的時(shí)間通過 TO_CHAR 函數(shù)顯式轉(zhuǎn)換為想要的格式輸出。
執(zhí)行以下語句:
SELECT TO_CHAR(SYSDATE, 'YYYY_MM_DD') FROM DUAL;查詢結(jié)果如下:
+-------------------------------+
| TO_CHAR(SYSDATE,'YYYY_MM_DD') |
+-------------------------------+
| 2020_02_27 |
+-------------------------------+ 新聞名稱:創(chuàng)新互聯(lián)OceanBase教程:OceanBase 數(shù)據(jù)類型轉(zhuǎn)換
轉(zhuǎn)載注明:http://www.dlmjj.cn/article/ccieddd.html


咨詢
建站咨詢
