キャスト関数と演算子
キャスト関数と演算子を使用すると、あるデータ型から別のデータ型への値の変換が可能です。TiDBはMySQL 8.0で利用可能なすべてのキャスト関数と演算子をサポートしています。
注記:
TiDBとMySQLは、
SELECT CAST(MeN AS CHAR)(またはそれに相当するSELECT CONVERT(MeM, CHAR))の結果に一貫性がありません。5MeN倍精度浮動小数点数(科学的記数法)を表します。MySQLは-15 <= N <= 14場合は完全な数値を表示し、N < -15またはN > 14場合は科学的記数法を表示します。しかし、TiDBは常に完全な数値を表示します。例えば、MySQLではSELECT CAST(3.1415e15 AS CHAR)の結果を3.1415e15と表示しますが、TiDBでは3141500000000000と表示します。
バイナリ
MySQL 8.0.27以降、 BINARY演算子は非推奨となりました。TiDBとMySQLの両方で、代わりにCAST(... AS BINARY)を使用することをお勧めします。
キャスト
CAST(<expression> AS <type> [ARRAY])関数は、式を特定の型にキャストするために使用されます。
この関数は多値インデックス作成する場合にも使用されます。
次のタイプがサポートされています:
例:
次のステートメントは、バイナリ文字列を HEX リテラルからCHARに変換します。
SELECT CAST(0x54694442 AS CHAR);
+--------------------------+
| CAST(0x54694442 AS CHAR) |
+--------------------------+
| TiDB |
+--------------------------+
1 row in set (0.0002 sec)
次の文は、JSON列から抽出されたaの属性の値を符号なし配列にキャストします。配列へのキャストは、複数値インデックスのインデックス定義の一部としてのみサポートされることに注意してください。
CREATE TABLE t (
id INT PRIMARY KEY,
j JSON,
INDEX idx_a ((CAST(j->'$.a' AS UNSIGNED ARRAY)))
);
INSERT INTO t VALUES (1, JSON_OBJECT('a',JSON_ARRAY(1,2,3)));
INSERT INTO t VALUES (2, JSON_OBJECT('a',JSON_ARRAY(4,5,6)));
INSERT INTO t VALUES (3, JSON_OBJECT('a',JSON_ARRAY(7,8,9)));
ANALYZE TABLE t;
EXPLAIN SELECT * FROM t WHERE 1 MEMBER OF(j->'$.a')\G
*************************** 1. row ***************************
id: IndexMerge_10
estRows: 2.00
task: root
access object:
operator info: type: union
*************************** 2. row ***************************
id: ├─IndexRangeScan_8(Build)
estRows: 2.00
task: cop[tikv]
access object: table:t, index:idx_a(cast(json_extract(`j`, _utf8mb4'$.a') as unsigned array))
operator info: range:[1,1], keep order:false, stats:partial[j:unInitialized]
*************************** 3. row ***************************
id: └─TableRowIDScan_9(Probe)
estRows: 2.00
task: cop[tikv]
access object: table:t
operator info: keep order:false, stats:partial[j:unInitialized]
3 rows in set (0.00 sec)
変換する
例:
SELECT CONVERT(0x616263 USING utf8mb4);
+---------------------------------+
| CONVERT(0x616263 USING utf8mb4) |
+---------------------------------+
| abc |
+---------------------------------+
1 row in set (0.0004 sec)