このトピックでは、ApsaraDB RDS for MySQL の DuckDB ベースの分析インスタンスの互換性について説明します。
以下の互換性に関する注記はいずれも、duckdb_sql_normalization パラメーターを有効にする必要があります。
サポートされるデータ型
次の表には、DuckDB ベースの分析インスタンスが MySQL と異なるデータ型のみを示します。
タイプ | MySQL データ型 | 互換性 |
文字列型 |
| UTF-8 の文字セットと照合順序のみがサポートされています。 |
時間型 |
| DuckDB ベースの分析インスタンスでは、 MySQL は |
| DuckDB ベースの分析インスタンスでは、
| |
| DuckDB ベースの分析インスタンスでは、
| |
空間データ型 |
| 非互換 |
SELECT ステートメントの制限
文字セット変換
文字セット変換関数では、ターゲット文字セットに関係なく、すべての変換は
utf8mb4文字セットに標準化され、DuckDB に渡されて実行されます。例:SELECT convert(id using gbk) FROM t1; SELECT cast(id AS CHAR CHARACTER SET utf8mb4) FROM t1;INTERVAL ユニット
次の INTERVAL ユニットはサポートされていません。
YEAR_MONTH, DAY_HOUR, HOUR_MINUTE, DAY_MINUTE, HOUR_SECOND, DAY_SECOND, SECOND_MICROSECOND, HOUR_MICROSECOND, DAY_MICROSECOND, MINUTE_SECOND, MINUTE_MICROSECOND, SQL_TSI_HOURサブクエリ
等価条件のある非スカラーサブクエリはサポートされていません。例:
SELECT * FROM t1 WHERE (id, col1) = (SELECT id, col1 FROM t1);BINARY(num) 型変換
BINARY(num)データ型への明示的な変換はサポートされていません。指定されたビット長は無視されます。例:SELECT CAST('abc' AS binary(1));UNSIGNED 型変換
UNSIGNEDデータ型への明示的な変換はサポートされていません。例:SELECT CAST(1 AS UNSIGNED);
データ型変換の問題
最適な実行効率を確保するため、DuckDB ベースの分析インスタンスは、実行時に厳格な型制約を使用します。クエリを実行すると、システムはコンテキストに基づいて自動的に型変換を行います。この種の変換を、暗黙の型変換と呼びます。暗黙的に変換できない場合は、クエリが正しく実行されるように、CAST または CONVERT 関数を使用して、型変換を明示的に指定する必要があります。
関数における暗黙の型変換ルール
/ は暗黙の型変換が行われないことを示します。✔️ は暗黙の型変換に対応していることを示します。✖️ は暗黙の型変換に対応していないことを示します。
通常の文字列型には、次の MySQL データ型が含まれます:
CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、JSON、SET、ENUM。バイナリ文字列型には、次の MySQL データ型が含まれます:
BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB。値の範囲が大きい整数型から値の範囲が小さい整数型への変換はできません。
基本スカラー型への変換
ソース型 | 基本スカラー型への暗黙の型変換 | ||
文字列リテラル | 数値リテラル | ||
基本スカラー | 文字列リテラル | / | ✖️ |
数値リテラル | ✖️ | / | |
値 | BOOLEAN | ✖️ | ✖️ |
整数型 | ✖️ | ✖️ | |
FLOAT | ✖️ | ✖️ | |
DOUBLE | ✖️ | ✖️ | |
DECIMAL | ✖️ | ✖️ | |
文字列 | 通常の文字列 | ✖️ | ✖️ |
バイナリ文字列 | ✖️ | ✖️ | |
日付と時刻 | YEAR | ✖️ | ✖️ |
DATE | ✖️ | ✖️ | |
TIME | ✖️ | ✖️ | |
DATETIME | ✖️ | ✖️ | |
TIMESTAMP | ✖️ | ✖️ | |
数値型への変換
ソース型 | 数値型への暗黙の型変換 | |||||
BOOLEAN | 整数型 | FLOAT | DOUBLE | DECIMAL | ||
基本スカラー | 文字列リテラル | ✖️ | ✖️ | ✖️ | ✔️ | ✖️ |
数値リテラル | ✖️ | ✔️ | ✔️ | ✔️ | ✔️ | |
数値型 | BOOLEAN | / | ✖️ | ✖️ | ✖️ | ✖️ |
整数型 | ✖️ | / | ✔️ | ✔️ | ✔️ | |
FLOAT | ✖️ | ✔️:BIGINT への変換のみ可能です。 | / | ✔️ | ✖️ | |
DOUBLE | ✖️ | ✔️:BIGINT への変換のみ可能です。 | ✖️ | / | ✖️ | |
DECIMAL | ✖️ | ✔️ | ✔️ | ✔️ | / | |
文字列 | 通常の文字列 | ✖️ | ✖️ | ✖️ | ✔️ | ✖️ |
バイナリ文字列 | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | |
日付と時刻 | YEAR | ✖️ | ✔️ | ✔️ | ✔️ | ✔️ |
DATE | ✖️ | ✖️ | ✖️ | ✔️ | ✖️ | |
TIME | ✖️ | ✖️ | ✖️ | ✔️ | ✖️ | |
DATETIME | ✖️ | ✖️ | ✖️ | ✔️ | ✖️ | |
TIMESTAMP | ✖️ | ✖️ | ✖️ | ✔️ | ✖️ | |
文字列型への変換
ソース型 | 文字列型への暗黙の型変換 | ||
通常の文字列 | バイナリ文字列 | ||
基本スカラー | 文字列リテラル | ✔️ | ✖️ |
数値リテラル | ✖️ | ✖️ | |
数値型 | BOOLEAN | ✖️ | ✖️ |
整数型 | ✔️ | ✖️ | |
FLOAT | ✔️ | ✖️ | |
DOUBLE | ✔️ | ✖️ | |
DECIMAL | ✔️ | ✖️ | |
文字列 | 通常の文字列 | / | ✖️ |
バイナリ文字列 | ✖️ | / | |
日付と時刻 | YEAR | ✔️ | ✖️ |
DATE | ✔️ | ✖️ | |
TIME | ✔️ | ✖️ | |
DATETIME | ✔️ | ✖️ | |
TIMESTAMP | ✔️ | ✖️ | |
日付と時刻データ型への変換
ソース型 | 日付と時刻データ型への暗黙の型変換 | |||||
YEAR | DATE | TIME | DATETIME | TIMESTAMP | ||
基本スカラー | 文字列リテラル | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ |
数値リテラル | ✔️ | ✖️ | ✖️ | ✖️ | ✖️ | |
値 | BOOLEAN | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ |
整数型 | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | |
FLOAT | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | |
DOUBLE | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | |
DECIMAL | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | |
文字列 | 通常の文字列 | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ |
バイナリ文字列 | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | |
日付と時刻 | YEAR | / | ✖️ | ✖️ | ✖️ | ✖️ |
DATE | ✖️ | / | ✖️ | ✔️ | ✔️ | |
TIME | ✖️ | ✖️ | / | ✔️ | ✔️ | |
DATETIME | ✖️ | ✖️ | ✖️ | / | ✔️ | |
TIMESTAMP | ✖️ | ✖️ | ✖️ | ✔️ | / | |
比較における暗黙の型変換ルール
DuckDB ベースの分析インスタンスには、型変換と比較において、より厳格で一貫したルールがあります。ただし、この動作は、一部のシナリオでは MySQL とは異なる場合があります:
文字列から日付への暗黙的な型変換:文字列が日付に暗黙的に変換される際、文字列の形式が有効な日付値として正しく解析できない場合、SQL クエリは失敗し、エラーを返します。
整数型間の比較ルール:異なる整数型が比較される場合、DuckDB ベースの分析インスタンスは、値の範囲が大きい整数型に変換します。
複数オペランド式の型変換順序:
col1 in (col2, col3, col4, ...), col1 between col2 and col3, coalesce(col1, col2, col3, ...)などの複数オペランド式では、型変換は順番に実行されます。YEAR 型の互換性の違い:DuckDB ベースの分析インスタンスでは、YEAR 型は比較のために INTEGER 型に変換されるため、MySQL との互換性の問題が発生する可能性があります。例:
CREATE TABLE t1 (id YEAR PRIMARY KEY); INSERT INTO t1 VALUES (1980); SELECT * FROM t1 WHERE id BETWEEN 70 AND 90; # MySQL でのクエリ結果 +------+ | id | +------+ | 1980 | +------+ # DuckDB ベースの分析インスタンスでのクエリ結果 空のセット。BOOLEAN 型の文字列変換ルール: DuckDB ベースの分析インスタンスは、6 つの文字列 (
'1'、'0'、'yes'、'no'、'true'、および'false') の BOOLEAN 型への変換をサポートします。他の文字列を変換しようとすると、エラーが発生します。MySQL は'1'をtrueに変換し、他のすべての文字列をfalseに変換します。このため、次の SQL ステートメントは、一貫性のない結果を返す可能性があります:CREATE TABLE t1 (id INT PRIMARY KEY); INSERT INTO t1 VALUES (1); SELECT id FROM t1 WHERE 'true'; # MySQL でのクエリ結果 空のセット。 # DuckDB ベースの分析インスタンスでのクエリ結果 +------+ | id | +------+ | 1 | +------+
異なる型のデータを比較する場合、システムは次の表のルールに基づき、データを共通の型に変換します。型間の比較がサポートされていない場合 (✖️)、エラーが返されます。
通常の文字列型とは、次の MySQL データ型を指します:
CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、JSON、SET、ENUM。バイナリ文字列型とは、次の MySQL データ型を指します:
BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB。
基本スカラー型との比較
ソースタイプ | 基本スカラー型との比較 | ||
文字列リテラル | 数値リテラル | ||
基本スカラー | 文字列リテラル | 文字列 | 数値リテラル |
数値リテラル | 数値リテラル | より広範囲の数値型 | |
値 | BOOLEAN 型 | BOOLEAN 型 | より広範囲の数値型 |
整数型 | 整数型 | より広範囲の数値型 | |
FLOAT 型 | FLOAT 型 | より広範囲の数値型 | |
DOUBLE 型 | DOUBLE 型 | より広範囲の数値型 | |
DECIMAL 型 | DECIMAL 型 | より広範囲の数値型 | |
文字列 | 通常の文字列 | 通常の文字列 | 数値リテラル |
バイナリ文字列 | バイナリ文字列 | ✖️ | |
日付と時刻 | YEAR 型 | YEAR 型 | より広範囲の数値型 |
DATE 型 | DATETIME 型 | ✖️ | |
TIME 型 | TIME 型 | ✖️ | |
DATETIME 型 | DATETIME 型 | ✖️ | |
TIMESTAMP 型 | TIMESTAMP 型 | ✖️ | |
数値型との比較
ソースタイプ | 数値型との比較 | |||||
BOOLEAN 型 | 整数型 | FLOAT 型 | DOUBLE 型 | DECIMAL 型 | ||
基本スカラー | 文字列リテラル | BOOLEAN 型 | 整数型 | FLOAT 型 | DOUBLE 型 | DECIMAL 型 |
数値リテラル | より広範囲の数値型 | より広範囲の数値型 | より広範囲の数値型 | より広範囲の数値型 | より広範囲の数値型 | |
数値 | BOOLEAN 型 | BOOLEAN 型 | 整数型 | FLOAT 型 (非等価比較 ✖️) | DOUBLE 型 (非等価比較 ✖️) | DECIMAL 型 (非等価比較 ✖️) |
整数型 | 整数型 | 整数型 | FLOAT 型 | DOUBLE 型 | DECIMAL 型 | |
FLOAT 型 | FLOAT 型 (非等価比較 ✖️) | FLOAT 型 | FLOAT 型 | DOUBLE 型 | FLOAT 型 | |
DOUBLE 型 | DOUBLE 型 (非等価比較 ✖️) | DOUBLE 型 | DOUBLE 型 | DOUBLE 型 | DOUBLE 型 | |
DECIMAL 型 | DECIMAL 型 (非等価比較 ✖️) | DECIMAL 型 | FLOAT 型 | DOUBLE 型 | DECIMAL 型 | |
文字列 | 通常の文字列 | BOOLEAN 型 | 整数型 | FLOAT 型 | DOUBLE 型 | DECIMAL 型 |
バイナリ文字列 | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | |
日付と時刻 | YEAR 型 | INTEGER 型 | より広範囲の整数型 | FLOAT 型 | DOUBLE 型 | DECIMAL 型 |
DATE 型 | ✖️ | ✖️ | ✖️ | DOUBLE 型 | ✖️ | |
TIME 型 | ✖️ | ✖️ | ✖️ | DOUBLE 型 | ✖️ | |
DATETIME 型 | ✖️ | ✖️ | ✖️ | DOUBLE 型 | ✖️ | |
TIMESTAMP 型 | ✖️ | ✖️ | ✖️ | DOUBLE 型 | ✖️ | |
文字列型との比較
ソースタイプ | 文字列型との比較 | ||
通常の文字列 | バイナリ文字列 | ||
基本スカラー | 文字列リテラル | 通常の文字列 | バイナリ文字列 |
数値リテラル | 数値リテラル | ✖️ | |
数値 | BOOLEAN 型 | BOOLEAN 型 | ✖️ |
整数型 | 整数型 | ✖️ | |
FLOAT 型 | FLOAT 型 | ✖️ | |
DOUBLE 型 | DOUBLE 型 | ✖️ | |
DECIMAL 型 | DECIMAL 型 | ✖️ | |
文字列 | 通常の文字列 | 通常の文字列 | バイナリ文字列 |
バイナリ文字列 | バイナリ文字列 | バイナリ文字列 | |
日付と時刻 | YEAR 型 | INTEGER 型 | ✖️ |
DATE 型 | DATE 型 | ✖️ | |
TIME 型 | TIME 型 | ✖️ | |
DATETIME 型 | DATETIME 型 | ✖️ | |
TIMESTAMP 型 | TIMESTAMP 型 | ✖️ | |
日付と時刻型との比較
ソースタイプ | 日付と時刻型との比較 | |||||
YEAR 型 | DATE 型 | TIME 型 | DATETIME 型 | TIMESTAMP 型 | ||
基本スカラー | 文字列リテラル | YEAR 型 | DATETIME 型 | TIME 型 | DATETIME 型 | TIMESTAMP 型 |
数値リテラル | より広範囲の数値型 | ✖️ | ✖️ | ✖️ | ✖️ | |
数値 | BOOLEAN 型 | INTEGER 型 | ✖️ | ✖️ | ✖️ | ✖️ |
整数型 | より広範囲の整数型 | ✖️ | ✖️ | ✖️ | ✖️ | |
FLOAT 型 | FLOAT 型 | ✖️ | ✖️ | ✖️ | ✖️ | |
DOUBLE 型 | DOUBLE 型 | DOUBLE 型 | DOUBLE 型 | DOUBLE 型 | DOUBLE 型 | |
DECIMAL 型 | DECIMAL 型 | ✖️ | ✖️ | ✖️ | ✖️ | |
文字列 | 通常の文字列 | INTEGER 型 | DATE 型 | TIME 型 | DATETIME 型 | TIMESTAMP 型 |
バイナリ文字列 | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | |
日付と時刻 | YEAR 型 | INTEGER 型 | ✖️ | ✖️ | ✖️ | ✖️ |
DATE 型 | ✖️ | DATE 型 | ✖️ | DATETIME 型 | TIMESTAMP 型 | |
TIME 型 | ✖️ | ✖️ | TIME 型 | ✖️ | ✖️ | |
DATETIME 型 | ✖️ | DATETIME 型 | ✖️ | DATETIME 型 | DATETIME 型 | |
TIMESTAMP 型 | ✖️ | TIMESTAMP 型 | ✖️ | DATETIME 型 | TIMESTAMP 型 | |
クエリ結果の潜在的な不整合
数値演算
浮動小数点数の比較では、互換性がない場合があります。例:
CREATE TABLE t1 (id FLOAT PRIMARY KEY); INSERT INTO t1 VALUES (1.22), (1.23), (1.24); SELECT * FROM t1 WHERE t1.id > 1.23; # MySQL のクエリ結果 +------+ | id | +------+ | 1.23 | | 1.24 | +------+ # DuckDB ベースの分析インスタンスのクエリ結果 +------+ | id | +------+ | 1.24 | +------+浮動小数点エラーにより、浮動小数点数に対する複雑な演算の結果に不整合が生じる可能性があります。
整数型と DECIMAL 型の間で演算を行う場合、結果が型の値の範囲を超えないようにする必要があります。超えた場合、オーバーフローエラーによって実行が失敗する可能性があります。
CREATE TABLE t1 (id TINYINT PRIMARY KEY); INSERT INTO t1 VALUES (100); SELECT id * 2 FROM t1; # MySQL のクエリ結果 +--------+ | id * 2 | +--------+ | 200 | +--------+ # DuckDB ベースの分析インスタンスのクエリ結果 ERROR 7577 (HY000): [DuckDB] Out of Range Error: Overflow in multiplication of INT8 (100 * 2)!.
照合順序ルールによる不整合な結果
utf8mb4_0900_xx シリーズの照合順序では、特定の記号文字を比較する際に互換性がありません。例:
CREATE TABLE t1 ( id varchar(20) COLLATE utf8mb4_0900_ai_ci PRIMARY KEY );
INSERT INTO t1 VALUES ('!'), ('_');
SELECT * FROM t1 ORDER BY id;
# MySQL のクエリ結果
+----+
| id |
+----+
| _ |
| ! |
+----+
# DuckDB ベースの分析インスタンスのクエリ結果
+----+
| id |
+----+
| ! |
| _ |
+----+IN を含むベクターサブクエリにおける NULL 値の取り扱い
DuckDB ベースの分析インスタンスでは、IN を含むベクターサブクエリにおける NULL 値の取り扱いが、MySQL と互換性がない場合があります。例:
CREATE TABLE t1 (id INT PRIMARY KEY, col1 INT);
INSERT INTO t1 VALUES (1, 1), (2, 2);
CREATE TABLE t2 (id INT PRIMARY KEY, col1 INT);
INSERT INTO t2 VALUES (1, NULL);
select (id, col1) in (select id, col1 from t2) from t1;
# MySQL のクエリ結果
+-----------------------------------------+
| (id, col1) in (select id, col1 from t2) |
+-----------------------------------------+
| NULL |
| 0 |
+-----------------------------------------+
# DuckDB ベースの分析インスタンスのクエリ結果
+-----------------------------------------+
| (id, col1) in (select id, col1 from t2) |
+-----------------------------------------+
| NULL |
| NULL |
+-----------------------------------------+データ (2, 2) の場合、IN 句にはベクタープレフィックスに一致する項目がありません。この場合、MySQL は 0 を返しますが、DuckDB ベースの分析インスタンスは NULL を返します。
関数の制限
次の表では、DuckDB ベースの分析インスタンスが MySQL と異なる関数のみを示します。
集計関数
関数名 | サポート | 制限 |
| はい | 文字列、DECIMAL、日付型はサポートされていません。 |
| はい | 文字列、DECIMAL、日付型はサポートされていません。 |
| はい | 文字列、DECIMAL、日付型はサポートされていません。 |
| いいえ | / |
数値関数
数値関数は BOOLEAN 型をサポートしていません。
関数名 | サポート | 制限 |
| いいえ | / |
| いいえ | / |
| いいえ | / |
文字列関数
MySQL DuckDB は、バイナリ文字列 (BLOB や VARBINARY など) と文字列 (VARCHAR、TEXT、JSON など) を厳密に区別します。したがって、文字列関数の使用制限は、バイナリ文字列入力には適用されず、文字列入力にのみ適用されます。バイナリ文字列を入力として受け取ることができる関数には、CONCAT()、CONCAT_WS()、LENGTH()、MID()、OCTET_LENGTH()、REPEAT()、TO_BASE64() などがあります。特に指定がない限り、これらの関数には使用制限はありません。
関数名 | サポート | 制限 |
| はい | MySQL では |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| はい | この関数の最初のパラメーターは文字列型である必要があります。文字列型以外の場合、MySQL とは結果が一致しない可能性があります。 |
| いいえ | / |
| はい | この関数は、Base64 デコードが失敗した場合にエラーを返します。 |
| はい |
|
| いいえ | / |
| いいえ | / |
| いいえ | / |
| はい |
|
| はい | MySQL では、 |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| はい | この関数は、16 進数以外の文字を検出した場合、エラーを返します。 |
| いいえ | / |
日付関数
関数名 | サポート | 制限 |
| はい | 戻り値が DuckDB ベースの分析インスタンスの時刻データ型の値の範囲を超えると、結果に不整合が生じます。 |
| はい |
|
| いいえ | / |
| はい | 9999 より大きい年はサポートされていません。 |
| はい | 9999 より大きい年はサポートされていません。 |
| はい | 戻り値が DuckDB ベースの分析インスタンスの時刻データ型の値の範囲を超えると、結果に不整合が生じる可能性があります。 |
| はい |
|
| はい | 戻り値が DuckDB ベースの分析インスタンスの時刻データ型の値の範囲外である場合、結果に不整合が生じる可能性があります。 |
| はい | DAY TIME 形式はサポートされていません。例: |
| いいえ | / |
JSON 関数
関数名 | サポート | 制限 |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| はい | マージされた JSON オブジェクトのフィールドの順序は、MySQL の順序と異なる場合があります。 |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| いいえ | / |
| いいえ | / |
ウィンドウ関数
関数名 | サポート | 制限 |
| いいえ | / |
| いいえ | / |