通常、式には異なるデータ型の値を含めることはできません。式間で計算を可能にするため、OceanBaseデータベースはあるデータ型から別のデータ型への値の暗黙的変換と明示的変換をサポートしています。本記事では主に、データ型の暗黙的および明示的変換ルールについて説明します。
注意
OceanBaseデータベースでは、暗黙的または自動的な変換に依存するのではなく、明示的な変換を指定することを推奨します。
暗黙的なデータ型変換
データ型変換が意味をなす場合、OceanBaseデータベースは値をあるデータ型から別のデータ型に自動的に変換します。
暗黙的なデータ型変換のルールは以下のとおりです:
INSERTおよびUPDATE操作を実行する際、OceanBaseデータベースは変数の値を影響を受ける列の型に変換します。SELECT FROM操作を実行する際、OceanBaseデータベースは列のデータ型をターゲット変数の型に変換します。文字値と数値を比較する場合、OceanBaseデータベースは文字値を数値に変換します。
数値を処理する際、OceanBaseデータベースは精度と小数点以下の桁数を調整します。これによって生じる数値データ型は、元のテーブルで見つかった数値データ型とは異なります。
文字値または NUMBER 値と浮動小数点数との間の変換は不正確になる可能性があります。これは、文字型と NUMBER 値型が十進精度を用いて数値を表現するのに対し、浮動小数点数は二進精度を用いるためです。
CLOB値を文字型(例えばVARCHAR2)に変換する場合、またはBLOBをRAWデータに変換する場合。変換対象のデータがターゲットデータ型より大きい場合、データベースはエラーメッセージを返します。タイムスタンプ値を
DATE値に変換する過程で、タイムスタンプ値の小数秒部分は切り捨てられ、四捨五入されます。BINARY_FLOATからBINARY_DOUBLEへの変換は正確です。BINARY_DOUBLEの精度位数がBINARY_FLOATがサポートする精度位数を超える場合、BINARY_DOUBLEをBINARY_FLOATに変換すると不正確になります。文字値と
DATE値を比較する場合、OceanBaseデータベースは文字データをDATE型に変換します。赋値操作を行う際、OceanBaseデータベースは等号の右側の値を左側の代入先のデータ型に変換します。
結合操作を行う際、OceanBaseデータベースは非文字型を文字型または国別文字型に変換します。
データ型の暗黙的変換マトリックス
次の表は、すべてのデータ型の暗黙的変換マトリックスです。変換の方向や文脈を考慮する必要はありません。
説明
"-"は変換がサポートされていないことを示します。
データ型 |
CHAR |
VARCHAR |
VARCHAR2 |
NCHAR |
NVARCHAR2 |
DATE |
TIMESTAMP |
INTERVAL |
NUMBER |
FLOAT |
BINARY_FLOAT |
BINARY_DOUBLE |
RAW |
CLOB |
BLOB |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CHAR | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - |
| VARCHAR | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - |
| VARCHAR2 | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - |
| NCHAR | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - |
| NVARCHAR2 | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - |
| DATE | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - | - | - |
| TIMESTAMP | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - | - | - |
| INTERVAL | Yes | Yes | Yes | Yes | Yes | Yes | - | Yes | - | - | - | - | - | - | - |
| NUMBER | Yes | Yes | Yes | Yes | Yes | - | - | - | Yes | Yes | Yes | Yes | - | - | - |
| FLOAT | Yes | Yes | Yes | Yes | Yes | Yes | - | - | Yes | Yes | Yes | Yes | - | - | - |
| BINARY_FLOAT | Yes | Yes | Yes | Yes | Yes | Yes | - | - | Yes | Yes | Yes | Yes | - | - | - |
| BINARY_DOUBLE | Yes | Yes | Yes | Yes | Yes | Yes | - | - | Yes | Yes | Yes | Yes | - | - | - |
| RAW | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - | - | Yes | - | - |
| CLOB | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - | - | Yes | - |
| BLOB | - | - | - | - | - | - | - | - | - | - | - | - | Yes | - | Yes |
1 RAW を INTERVAL に直接変換することはできませんが、UTL_RAW.CAST_TO_VARCHAR2([RAW]) を使用して RAW を VARCHAR2 に変換し、その後得られた VARCHAR2 値を INTERVAL に変換することはできます。
暗黙的なデータ型変換の例
以下の例文を実行すると、OceanBaseは暗黙的なデータ型変換を使用して
'james'を数値型に変換しようとしますが、変換は失敗し、エラーが発生します。obclient> SELECT 5 * 10 + 'james' FROM DUAL; ORA-01722: invalid number文字列
'2'をCHAR型から数値型 2 へ暗黙的に変換し、計算結果は 52 となります。obclient> SELECT 5 * 10 + '2' FROM DUAL; +----------+ | 5*10+'2' | +----------+ | 52 | +----------+ 1 row in set
明示的なデータ型変換
SQL変換関数を使用してデータ型を変換できます。SQL関数は、あるデータ型を別のデータ型に明示的に変換します。
明示的型変換マトリックス
データ型 |
CHAR |
NCHAR |
NVARCHAR2 |
VARCHAR2 |
VARCHAR |
NUMBER |
FLOAT |
BINARY_FLOAT |
BINARY_DOUBLE |
DATE |
TIMESTAMP |
INTERVAL |
RAW |
BLOB |
CLOB |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CHAR | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - |
| NCHAR | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - |
| NVARCHAR2 | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | Yes | - | - |
| VARCHAR2 | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | Yes | - | - |
| VARCHAR | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | Yes | - | - |
| NUMBER | - | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - |
| FLOAT | - | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - |
| BINARY_FLOAT | - | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - |
| BINARY_DOUBLE | - | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - |
| DATE | - | Yes | Yes | Yes | Yes | - | - | - | - | Yes | Yes | - | - | - | - |
| TIMESTAMP | - | Yes | Yes | Yes | Yes | - | - | - | - | Yes | Yes | - | - | - | - |
| INTERVAL | - | Yes | Yes | Yes | Yes | - | - | - | - | - | - | Yes | - | - | - |
| RAW | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - | - | Yes | - | - |
| BLOB | - | - | - | - | - | - | - | - | - | - | - | - | - | Yes | - |
| CLOB | Yes | Yes | Yes | Yes | Yes | - | - | - | - | - | - | - | - | - | - |
明示的なデータ型変換の例
現在時刻を TO_CHAR 関数を使用して明示的に指定された形式に変換して出力します。
obclient> SELECT TO_CHAR(SYSDATE, 'YYYY_MM_DD') FROM DUAL;
+-------------------------------+
| TO_CHAR(SYSDATE,'YYYY_MM_DD') |
+-------------------------------+
| 2021_11_30 |
+-------------------------------+
1 row in set