OceanBase 數(shù)據(jù)類型轉(zhuǎn)換

2021-06-29 15:03 更新

通常,表達(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è)錯(cuò)誤。

  • 在從時(shí)間戳值轉(zhuǎn)換為 DATE 值的過程中,時(shí)間戳值的小數(shù)秒部分被截?cái)啵視r(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

CHAR

-

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

VARCHAR2

Yes

-

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

-

NCHAR

Yes

Yes

-

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

-

NVARCHAR2

Yes

Yes

Yes

-

Yes

Yes

Yes

Yes

Yes

Yes

Yes

-

DATE

Yes

Yes

Yes

Yes

-

-

-

-

-

-

-

-

DATETIME / INTERVAL

Yes

Yes

Yes

Yes

-

-

-

-

-

-

-

-

NUMBER

Yes

Yes

Yes

Yes

-

-

-

Yes

Yes

-

-

-

BINARY_FLOAT

Yes

Yes

Yes

Yes

-

-

Yes

-

Yes

-

-

-

BINARY_DOUBLE

Yes

Yes

Yes

Yes

-

-

Yes

Yes

-

-

-

-

RAW

Yes

Yes

Yes

Yes

-

Yes

1

-

-

-

-

Yes

-

CLOB

Yes

Yes

Yes

Yes

-

-

-

-

-

-

-

Yes

BLOB

-

-

-

-

-

-

-

-

-

Yes

-

-

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

from CHAR

-

VARCHAR2

NCHAR

NVARCHAR2

from VARCHAR2

VARCHAR2

-

NVARCHAR2

NVARCHAR2

from NCHAR

NCHAR

NCHAR

-

NCHAR2

from NVARCHAR2

NVARCHAR2

NVARCHAR2

NVARCHAR2

-

隱式數(shù)據(jù)類型轉(zhuǎn)換示例

執(zhí)行以下語句:

SELECT 5 * 10 + 'james' FROM DUAL;

語句執(zhí)行失敗,且您收到以下報(bào)錯(cuò):

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

TO_CHAR(char . ) 、TO_NCHAR(char . )

TO_NUMBER

TO_DATE、TO_TIMESTAMP、TO_TIMESTAMP_TZ、TO_YMINTERVAL、TO_DSINTERVAL

HEXTORAW

TO_CLOB

TO_BINARY_FLOAT

TO_BINARY_DOUBLE

From NUMBER

TO_CHAR(number) 、TO_NCHAR(number)

--

TO_DATE、NUMTOYM_INTERVAL、NUMTOOLS_INTERVAL

--

--

TO_BINARY_FLOAT

TO_BINARY_DOUBLE

From Datetime/Interval

TO_CHAR(date ) 、TO_NCHAR(date)

--

--

--

--

--

--

From RAW

RAWTOHEX、RAWTONHEX

--

--

--

TO_BLOB

--

--

From CLOB、BLOB

TO_CHAR、TO_NCHAR

--

--

--

TO_CLOB

--

--

From BINARY_FLOAT

TO_CHAR(char . ) 、TO_NCHAR(char . )

TO_NUMBER

--

--

--

TO_BINARY_FLOAT

TO_BINARY_DOUBLE

From BINARY_DOUBLE

TO_CHAR(char . ) 、TO_NCHAR(char . )

TO_NUMBER

--

--

--

TO_BINARY_FLOAT

TO_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                    |
+-------------------------------+


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號