MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

12.11 キャスト関数と演算子

表 12.15 「キャスト関数および演算子」

名前 説明
BINARY 文字列をバイナリ文字列にキャストします
CAST() 値を特定の型としてキャストします
CONVERT() 値を特定の型としてキャストします

キャスト関数および演算子を使用すると、あるデータ型から別のデータ型に値を変換できます。

USING 句を含む CONVERT() は、文字セット間でデータを変換します:

CONVERT(expr USING transcoding_name)

MySQL では、トランスコーディング名は対応する文字セット名と同じです。

例:

SELECT CONVERT('test' USING utf8mb4);
SELECT CONVERT(_latin1'Müller' USING utf8mb4);
INSERT INTO utf8mb4_table (utf8mb4_column)
    SELECT CONVERT(latin1_column USING utf8mb4) FROM latin1_table;

文字セット間で文字列を変換するには、CONVERT(expr, type) 構文 (USING なし) または CAST(expr AS type) も使用できます。これは同等です:

CONVERT(string, CHAR[(N)] CHARACTER SET charset_name)
CAST(string AS CHAR[(N)] CHARACTER SET charset_name)

例:

SELECT CONVERT('test', CHAR CHARACTER SET utf8mb4);
SELECT CAST('test' AS CHAR CHARACTER SET utf8mb4);

前述のように CHARACTER SET charset_name を指定した場合、結果の文字セットと照合順序は charset_name および charset_name のデフォルト照合順序になります。 CHARACTER SET charset_name を省略すると、結果の文字セットおよび照合順序は、デフォルトの接続文字セットおよび照合順序を決定する character_set_connection および collation_connection システム変数によって定義されます (セクション10.4「接続文字セットおよび照合順序」 を参照)。

COLLATE 句は、CONVERT() または CAST() コール内では許可されませんが、関数の結果に適用できます。 たとえば、次の場合は有効です。

SELECT CONVERT('test' USING utf8mb4) COLLATE utf8mb4_bin;
SELECT CONVERT('test', CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin;
SELECT CAST('test' AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin;

ただし、これらは不正です:

SELECT CONVERT('test' USING utf8mb4 COLLATE utf8mb4_bin);
SELECT CONVERT('test', CHAR CHARACTER SET utf8mb4 COLLATE utf8mb4_bin);
SELECT CAST('test' AS CHAR CHARACTER SET utf8mb4 COLLATE utf8mb4_bin);

通常、BLOB 値またはその他のバイナリ文字列は、大文字と小文字を区別しない方法で比較できません。バイナリ文字列では、大文字と小文字の概念と照合されない binary 文字セットが使用されるためです。 大/小文字を区別しない比較を実行するには、まず CONVERT() または CAST() 関数を使用して、値を非バイナリ文字列に変換します。 結果の文字列の比較では、その照合が使用されます。 たとえば、変換結果の照合で大/小文字が区別されない場合、LIKE 操作では大/小文字は区別されません。 これは、デフォルトの utf8mb4 照合 (utf8mb4_0900_ai_ci) では大/小文字が区別されないため、次の操作に当てはまります:

SELECT 'A' LIKE CONVERT(blob_col USING utf8mb4)
  FROM tbl_name;

変換された文字列に特定の照合順序を指定するには、CONVERT() コールの後に COLLATE 句を使用します:

SELECT 'A' LIKE CONVERT(blob_col USING utf8mb4) COLLATE utf8mb4_unicode_ci
  FROM tbl_name;

別の文字セットを使用するには、前述のステートメントで utf8mb4 の名前を置き換えます (別の照合順序を使用する場合と同様です)。

CONVERT() および CAST() は、異なる文字セットで表される文字列を比較するために、より一般的に使用できます。 たとえば、これらの文字列を比較すると、文字セットが異なるためエラーになります:

mysql> SET @s1 = _latin1 'abc', @s2 = _latin2 'abc';
mysql> SELECT @s1 = @s2;
ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT)
and (latin2_general_ci,IMPLICIT) for operation '='

いずれかの文字列を他の文字セットと互換性のある文字セットに変換すると、エラーなしで比較を実行できます:

mysql> SELECT @s1 = CONVERT(@s2 USING latin1);
+---------------------------------+
| @s1 = CONVERT(@s2 USING latin1) |
+---------------------------------+
|                               1 |
+---------------------------------+

文字列リテラルの場合、文字セットを指定する別の方法は、文字セットイントロデューサを使用することです。前述の例の_latin1 および_latin2 は、イントロデューサのインスタンスです。 文字列をある文字セットから別の文字セットに変換する CAST()CONVERT() などの変換関数とは異なり、イントロデューサは文字列リテラルを特定の文字セットを持つものとして指定し、変換は必要ありません。 詳細は、セクション10.3.8「文字セットイントロデューサ」を参照してください。

文字セット変換は、バイナリ文字列の大文字と小文字の変換の前にも役立ちます。 LOWER() および UPPER() は、大文字と小文字の概念が適用されないため、バイナリ文字列に直接適用すると無効になります。 バイナリ文字列の大文字と小文字の変換を実行するには、まず文字列に格納されているデータに適した文字セットを使用して、非バイナリ文字列に変換します:

mysql> SET @str = BINARY 'New York';
mysql> SELECT LOWER(@str), LOWER(CONVERT(@str USING utf8mb4));
+-------------+------------------------------------+
| LOWER(@str) | LOWER(CONVERT(@str USING utf8mb4)) |
+-------------+------------------------------------+
| New York    | new york                           |
+-------------+------------------------------------+

BINARYCAST() または CONVERT() を使用してインデックス付けされたカラムを変換すると、MySQL でインデックスを効率的に使用できない場合があることに注意してください。

キャスト関数は、CREATE TABLE ... SELECT ステートメントで特定の型のカラムを作成する場合に役立ちます:

mysql> CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE) AS c1;
mysql> SHOW CREATE TABLE new_table\G
*************************** 1. row ***************************
       Table: new_table
Create Table: CREATE TABLE `new_table` (
  `c1` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

キャスト関数は、ENUM カラムを字句順にソートする場合に役立ちます。 通常、ENUM カラムのソートは、内部数値を使用して実行されます。 値を CHAR にキャストすると、語彙順にソートされます。

SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);

CONCAT('Date: ',CAST(NOW() AS DATE)) のように、より複雑な式の一部として使用する場合でも、CAST() の結果が変わります。

時間値の場合、CAST() を使用して様々な形式でデータを抽出する必要はほとんどありません。 かわりに、EXTRACT()DATE_FORMAT()TIME_FORMAT() などの関数を使用してください。 セクション12.7「日付および時間関数」を参照してください。

文字列を数値にキャストするには、通常、数値コンテキストで文字列値を使用するだけで十分です:

mysql> SELECT 1+'1';
       -> 2

これは、16 進数リテラルおよびビットリテラル (デフォルトではバイナリ文字列) にも当てはまります:

mysql> SELECT X'41', X'41'+0;
        -> 'A', 65
mysql> SELECT b'1100001', b'1100001'+0;
        -> 'a', 97

算術演算で使用される文字列は、式の評価時に浮動小数点数に変換されます。

文字列コンテキストで使用される数値は文字列に変換されます:

mysql> SELECT CONCAT('hello you ',2);
        -> 'hello you 2'

数字から文字列への暗黙的な変換については、セクション12.3「式評価での型変換」を参照してください。

MySQL では、符号付きと符号なしの両方の 64 ビット値を使用した演算がサポートされています。 オペランドのいずれかが符号なし整数である数値演算子 (+- など) の場合、結果はデフォルトで符号なしになります (セクション12.6.1「算術演算子」 を参照)。 これをオーバーライドするには、SIGNED または UNSIGNED キャスト演算子を使用して、それぞれ符号付きまたは符号なし 64 ビット整数に値をキャストします。

mysql> SELECT 1 - 2;
        -> -1
mysql> SELECT CAST(1 - 2 AS UNSIGNED);
        -> 18446744073709551615
mysql> SELECT CAST(CAST(1 - 2 AS UNSIGNED) AS SIGNED);
        -> -1

オペランドのいずれかが浮動小数点値である場合は、結果が浮動小数点値になり、上記のルールによる影響を受けません。 (このコンテキストでは、DECIMAL カラム値は浮動小数点値とみなされます。)

mysql> SELECT CAST(1 AS UNSIGNED) - 2.0;
        -> -1.0

SQL モードは、変換操作の結果に影響します (セクション5.1.11「サーバー SQL モード」 を参照)。 例:

次のリストでは、使用可能なキャスト関数および演算子について説明します: