AnalyticDB for MySQL は、数値、文字列、時間、空間のカテゴリにわたる SQL データ型のコアセットをサポートしています。このページでは、各型のストレージサイズ、値の範囲、標準の MySQL との違いについて説明し、続いて暗黙の型変換ルールについて説明します。
サポートされているデータ型
数値型
| 型 | エイリアス | 値の範囲 | サイズ | 注意事項 |
|---|---|---|---|---|
BOOLEAN |
— | 0 (false)、1 (true) |
1 ビット | MySQL との違いはありません。 |
TINYINT |
— | -128 から 127 |
1 バイト | MySQL との違いはありません。 |
SMALLINT |
— | -32768 から 32767 |
2 バイト | MySQL との違いはありません。 |
INT または INTEGER |
— | -2147483648 から 2147483647 |
4 バイト | MySQL の INT または MEDIUMINT に対応します。 |
BIGINT |
— | -9223372036854775808 から 9223372036854775807 |
8 バイト | MySQL との違いはありません。 |
FLOAT |
— | -3.402823466E+38 から -1.175494351E-38、0、1.175494351E-38 から 3.402823466E+38 |
4 バイト | IEEE 標準に準拠しています。MySQL との違いはありません。 |
DOUBLE |
— | -1.7976931348623157E+308 から -2.2250738585072014E-308、0、2.2250738585072014E-308 から 1.7976931348623157E+308 |
8 バイト | IEEE 標準に準拠しています。MySQL との違いはありません。 |
DECIMAL(m,d) または NUMERIC |
— | m:最大精度 1~38、d:小数点以下の桁数、m |
— |
MySQL は最大精度
|
文字列型
| 型 | 説明 | MySQL での相当する型 |
|---|---|---|
VARCHAR |
最大 16 MB。VARCHAR(255) のような長さ指定子は構文の互換性のために受け入れられますが、実際の最大長は宣言された数値ではなくデータサイズ (最大 16 MB) によって決まります。宣言された長さを検証に利用しないでください。 |
CHAR、VARCHAR、TEXT、MEDIUMTEXT、または LONGTEXT |
BINARY |
ストレージ文字の長さ。 | BINARY、VARBINARY、または BLOB |
時間型
| 型 | 値の範囲 | フォーマット | サイズ | 注意事項 |
|---|---|---|---|---|
DATE |
'0001-01-01' から '9999-12-31' |
YYYY-MM-DD |
4 バイト | MySQL は 0000-00-00 をサポートしますが、AnalyticDB for MySQL は時間値を検証し、0000-00-00 を NULL に変換します。実際の日付を使用してください。 |
TIME |
'00:00:00' から '23:59:59' |
HH:MM:SS |
8 バイト | MySQL はカスタム精度をサポートしますが、AnalyticDB for MySQL はミリ秒レベルの精度 (小数点以下 3 桁まで) をサポートしています。 |
DATETIME |
'0001-01-01 00:00:00.000' から '9999-12-31 23:59:59.999' |
YYYY-MM-DD HH:MM:SS |
8 バイト | 協定世界時 (UTC) で格納されます。タイムゾーンは変更できません。MySQL は 0000-00-00 とカスタム精度をサポートしますが、AnalyticDB for MySQL は 0000-00-00 を NULL に変換します。 |
TIMESTAMP |
'0100-01-01 00:00:00.000' から '9999-12-31 23:59:59.999' |
YYYY-MM-DD HH:MM:SS |
8 バイト | デフォルトでシステムタイムゾーンを使用します。セッションごとに異なるタイムゾーンを指定できます。MySQL はカスタム精度をサポートしますが、AnalyticDB for MySQL はミリ秒レベルの精度 (小数点以下 3 桁まで) をサポートしています。 |
DATETIME は常に協定世界時 (UTC) を使用します。TIMESTAMP とは異なり、DATETIME 値のタイムゾーンはセッションごとに上書きできません。
空間データ型
| 型 | 説明 | 注意事項 |
|---|---|---|
POINT |
地理座標 x と y。 | MySQL との違いはありません。 |
暗黙の型変換
AnalyticDB for MySQL は、SQL クエリを実行する際に、コンテキストに基づいて暗黙の型変換を自動的に実行します。変換ルールは、SELECT プロジェクションと WHERE フィルターで異なります。
プロジェクションの変換ルール
SELECT 文の列が定数と比較される場合、結果は、次の表に示す型に暗黙的に変換されます。変換がサポートされていない場合、エラーが発生します。
| 列 \ 定数 | VARCHAR | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| VARCHAR | VARCHAR | BOOLEAN | BIGINT | BIGINT | BIGINT | BIGINT | DECIMAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
| BOOLEAN | BOOLEAN | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | サポートされていません | DOUBLE | サポートされていません | サポートされていません | サポートされていません | サポートされていません |
| TINYINT | BIGINT | TINYINT | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | サポートされていません | サポートされていません | サポートされていません | サポートされていません |
| SMALLINT | BIGINT | SMALLINT | SMALLINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | サポートされていません | サポートされていません | サポートされていません | サポートされていません |
| INTEGER | BIGINT | INTEGER | INTEGER | INTEGER | INTEGER | BIGINT | DECIMAL | DOUBLE | BIGINT | BIGINT | BIGINT | BIGINT |
| BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | DECIMAL | DOUBLE | BIGINT | BIGINT | BIGINT | BIGINT |
| DECIMAL | DECIMAL | サポートされていません | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DOUBLE | サポートされていません | サポートされていません | サポートされていません | サポートされていません |
| DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE |
| TIME | TIME | サポートされていません | サポートされていません | サポートされていません | BIGINT | BIGINT | サポートされていません | DOUBLE | TIME | BIGINT | BIGINT | DATETIME |
| DATE | DATE | サポートされていません | サポートされていません | サポートされていません | BIGINT | BIGINT | サポートされていません | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
| TIMESTAMP | TIMESTAMP | サポートされていません | サポートされていません | サポートされていません | BIGINT | BIGINT | サポートされていません | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
| DATETIME | DATETIME | サポートされていません | サポートされていません | サポートされていません | BIGINT | BIGINT | サポートされていません | DOUBLE | DATETIME | DATETIME | DATETIME | DATETIME |
フィルターの変換ルール
WHERE 句の列が異なる型の定数と比較される場合、結果の型は暗黙的に変換されます。型の不一致は、インデックスベースのフィルタリングのためにフィルター条件をストレージレイヤーにプッシュする最適化であるプッシュダウンを妨げる可能性があります。プッシュダウンが失敗すると、データベースは全表スキャンにフォールバックし、これにより、クエリのパフォーマンスが大幅に低下します。
以下の表は、各列と定数の型のペアに対する結果の型とプッシュダウンのステータスを示しています。✓ = プッシュダウン成功、✗ = プッシュダウン失敗 (全表スキャン)。
| 列 \ 定数 | VARCHAR | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | REAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| VARCHAR | VARCHAR ✓ | BOOLEAN ✗ | BIGINT ✗ | BIGINT ✗ | BIGINT ✗ | BIGINT ✗ | DECIMAL ✗ | REAL ✗ | DOUBLE ✗ | TIME ✗ | DATE ✗ | TIMESTAMP ✗ | DATETIME ✗ |
| BOOLEAN | BOOLEAN ✓ | BOOLEAN ✓ | TINYINT ✗ | SMALLINT ✗ | INTEGER ✗ | BIGINT ✗ | サポートされていません | REAL ✗ | DOUBLE ✗ | サポートされていません | サポートされていません | サポートされていません | サポートされていません |
| TINYINT | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | TINYINT ✓ | DECIMAL ✗ | REAL ✗ | DOUBLE ✗ | サポートされていません | サポートされていません | サポートされていません | サポートされていません |
| SMALLINT | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | SMALLINT ✓ | DECIMAL ✗ | REAL ✗ | DOUBLE ✗ | サポートされていません | サポートされていません | サポートされていません | サポートされていません |
| INTEGER | INTEGER ✓ | INTEGER ✓ | INTEGER ✓ | INTEGER ✓ | INTEGER ✓ | INTEGER ✓ | DECIMAL ✗ | REAL ✗ | DOUBLE ✗ | INTEGER ✓ | INTEGER ✓ | INTEGER | INTEGER |
| BIGINT | BIGINT ✓ | BIGINT ✓ | BIGINT ✓ | BIGINT ✓ | BIGINT ✓ | BIGINT ✓ | DECIMAL ✗ | REAL ✗ | DOUBLE ✗ | BIGINT ✓ | BIGINT ✓ | BIGINT | BIGINT |
| DECIMAL | DECIMAL ✓ | DECIMAL ✓ | DECIMAL ✓ | DECIMAL ✓ | DECIMAL ✓ | DECIMAL ✓ | DECIMAL ✓ | REAL ✗ | DOUBLE ✗ | サポートされていません | サポートされていません | サポートされていません | サポートされていません |
| REAL | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | REAL ✓ | DOUBLE ✗ | サポートされていません | サポートされていません | サポートされていません | サポートされていません |
| DOUBLE | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ | DOUBLE ✓ |
| TIME | TIME ✓ | サポートされていません | サポートされていません | サポートされていません | BIGINT ✗ | BIGINT ✗ | サポートされていません | サポートされていません | DOUBLE ✗ | TIME ✓ | BIGINT ✗ | BIGINT ✗ | DATETIME ✗ |
| DATE | DATE ✓ | サポートされていません | サポートされていません | サポートされていません | BIGINT ✗ | BIGINT ✗ | サポートされていません | サポートされていません | DOUBLE ✗ | BIGINT ✗ | DATE ✓ | TIMESTAMP ✗ | DATETIME ✗ |
| TIMESTAMP | TIMESTAMP ✓ | サポートされていません | サポートされていません | サポートされていません | BIGINT ✗ | BIGINT ✗ | サポートされていません | サポートされていません | DOUBLE ✗ | TIMESTAMP ✓ | TIMESTAMP ✓ | TIMESTAMP ✓ | TIMESTAMP ✓ |
| DATETIME | DATETIME ✓ | サポートされていません | サポートされていません | サポートされていません | BIGINT ✗ | BIGINT ✗ | サポートされていません | サポートされていません | DOUBLE ✗ | DATETIME ✓ | DATETIME ✓ | DATETIME ✓ | DATETIME ✓ |
強制的な型変換の最適化 (ENFORCE_UNWRAP_CAST)
ENFORCE_UNWRAP_CAST は、フィルター条件における暗黙の型変換を AnalyticDB for MySQL がどのように処理するかを制御します。有効にすると、システムは列の型に合わせて定数を変換します (その逆ではありません)。これにより、プッシュダウンの最適化が維持され、値の切り捨てによる予期しない結果を防ぐことができます。
ENFORCE_UNWRAP_CAST の設定
2 つの設定方法が利用可能です:
-
グローバル — クラスター内のすべてのクエリに適用されます:
SET ADB_CONFIG ENFORCE_UNWRAP_CAST = true; -
クエリヒント — 他のクエリに影響を与えることなく、単一のクエリに適用されます:
/*+ ENFORCE_UNWRAP_CAST=true */
例
test テーブルの col 列は VARCHAR 型で、値 '1'、'1a'、'abc' を含みます。次のクエリを実行すると、ENFORCE_UNWRAP_CAST が有効になっているかどうかによって、異なる結果が生成されます:
SELECT col FROM test WHERE col = 1;
| 設定 | 動作 | 一致する行 | プッシュダウン |
|---|---|---|---|
ENFORCE_UNWRAP_CAST=false (デフォルト) |
VARCHAR 型の列を BIGINT 型に変換します。'1' と '1a' は両方とも 1 に切り捨てられて一致します。 |
'1'、'1a' |
失敗 — 全表スキャン |
ENFORCE_UNWRAP_CAST=true |
INTEGER 型の定数 1 を VARCHAR 型の '1' に変換します。完全な文字列一致のみが対象となります。 |
'1' のみ |
成功 — ストレージレイヤーへのプッシュダウン |
列が文字列型として宣言されているが、数値定数でクエリされる場合は、ENFORCE_UNWRAP_CAST を有効にすると、正確な結果を取得し、全表スキャンを回避できます。