通常、式には異なるデータ型の値を含めることはできません。式間で計算を行えるようにするため、OceanBaseデータベースはあるデータ型から別のデータ型への値の暗黙的変換と明示的変換をサポートしています。本記事では主にデータ型の暗黙的および明示的変換ルールについて説明します。
注意
OceanBaseデータベースでは、暗黙的または自動的な変換に依存する代わりに、明示的な変換を指定することを推奨します。
暗黙的なデータ型変換
データ型の変換が意味をなす場合、OceanBaseデータベースは値をあるデータ型から別のデータ型に自動的に変換します。
暗黙的なデータ型変換のルールは以下のとおりです:
INSERTおよびUPDATE操作を実行する際、OceanBaseデータベースは変数値を影響を受ける列の型に変換します。SELECT FROM操作を実行する際、OceanBaseデータベースは列のデータ型をターゲット変数の型に変換します。文字列値と数値を比較する場合、OceanBaseデータベースは文字列値を数値に変換します。
数値を処理する際、OceanBaseデータベースは精度と小数点以下の桁数を調整します。これによって生成される数値データ型は、基礎テーブルで見つかる数値データ型とは異なります。
文字列値またはNUMBER値と浮動小数点数との間の変換は不正確である可能性があります。これは、文字列型とNUMBER値型が数値を10進精度で表現するのに対し、浮動小数点数は2進精度を使用するためです。
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 | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | - |
| VARCHAR | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | - |
| VARCHAR2 | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | - |
| NCHAR | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | - |
| NVARCHAR2 | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | はい | - |
| DATE | はい | はい | はい | はい | はい | はい | はい | - | - | - | - | - | - | - | - |
| TIMESTAMP | はい | はい | はい | はい | はい | はい | はい | - | - | - | - | - | - | - | - |
| INTERVAL | はい | はい | はい | はい | はい | はい | - | はい | - | - | - | - | - | - | - |
| NUMBER | はい | はい | はい | はい | はい | - | - | - | はい | はい | はい | はい | - | - | - |
| FLOAT | はい | はい | はい | はい | はい | はい | - | - | はい | はい | はい | はい | - | - | - |
| BINARY_FLOAT | はい | はい | はい | はい | はい | はい | - | - | はい | はい | はい | はい | - | - | - |
| BINARY_DOUBLE | はい | はい | はい | はい | はい | はい | - | - | はい | はい | はい | はい | - | - | - |
| RAW | はい | はい | はい | はい | はい | - | - | - | - | - | - | - | Yes | - | - |
| CLOB | はい | はい | はい | はい | はい | はい | - | - | - | - | - | - | - | 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 | はい | はい | はい | はい | はい | はい | はい | はい | はい | - | - | - | - | - | - |
| NCHAR | はい | はい | はい | はい | はい | はい | はい | はい | はい | - | - | - | - | - | - |
| NVARCHAR2 | はい | はい | はい | はい | はい | はい | はい | はい | はい | - | - | - | はい | - | - |
| VARCHAR2 | はい | はい | はい | はい | はい | はい | はい | はい | はい | - | - | - | はい | - | - |
| VARCHAR | はい | はい | はい | はい | はい | はい | はい | はい | はい | - | - | - | はい | - | - |
| NUMBER | - | はい | はい | はい | はい | はい | はい | はい | はい | - | - | - | - | - | - |
| 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 | はい | はい | はい | はい | はい | - | - | - | - | - | - | - | はい | - | - |
| BLOB | - | - | - | - | - | - | - | - | - | - | - | - | - | はい | - |
| CLOB | はい | はい | はい | はい | はい | - | - | - | - | - | - | - | - | - | - |
明示的なデータ型変換の例
現在の時間を 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