Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


MySQL 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 モード」 を参照)。 例:

  • 「ゼロ」の日付文字列を日付に変換する場合、CONVERT() および CAST()NULL を返し、NO_ZERO_DATE SQL モードが有効なときに警告を生成します。

  • 整数の減算では、NO_UNSIGNED_SUBTRACTION SQL モードが有効になっている場合は、オペランドのいずれかが符号なしでも、結果が符号付きになります。

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

  • BINARY expr

    BINARY 演算子は、式をバイナリ文字列 (binary 文字セットおよび binary 照合順序を持つ文字列) に変換します。 BINARY の一般的な用途は、文字単位ではなく数値バイト値を使用して、文字列をバイト単位で強制的に比較することです。 BINARY 演算子を使用すると、比較の末尾の空白も意味を持ちます。 binary 文字セットの binary 照合順序と非バイナリ文字セットの_bin 照合順序の違いについては、セクション10.8.5「バイナリ照合順序と_bin 照合順序」 を参照してください。

    mysql> SELECT 'a' = 'A';
            -> 1
    mysql> SELECT BINARY 'a' = 'A';
            -> 0
    mysql> SELECT 'a' = 'a ';
            -> 1
    mysql> SELECT BINARY 'a' = 'a ';
            -> 0

    比較時に、BINARY によって演算全体が影響を受けます。これは、同じ結果を持ついずれかのオペランドの前に指定できます。

    文字列式をバイナリ文字列に変換する場合、次の構造体は同等です:

    CAST(expr AS BINARY)
    CONVERT(expr USING BINARY)
    BINARY expr

    値が文字列リテラルの場合は、_binary 文字セットイントロデューサを使用して、変換せずにバイナリ文字列として指定できます:

    mysql> SELECT 'a' = 'A';
            -> 1
    mysql> SELECT _binary 'a' = 'A';
            -> 0

    イントロデューサについては、セクション10.3.8「文字セットイントロデューサ」 を参照してください。

    式の BINARY 演算子は、文字カラム定義の BINARY 属性とは異なります。 BINARY 属性で定義された文字列の場合、MySQL は、テーブルのデフォルトの文字セットと、その文字セットのバイナリ (_bin) 照合順序を割り当てます。 すべての非バイナリ文字セットには、_bin 照合順序があります。 たとえば、テーブルのデフォルトの文字セットが utf8mb4 の場合、次の 2 つのカラム定義は同等です:

    CHAR(10) BINARY
    CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

    CHARVARCHAR または TEXT カラムの定義で CHARACTER SET binary を使用すると、カラムは対応するバイナリ文字列データ型として扱われます。 たとえば、次のペアになった定義は同等です。

    CHAR(10) CHARACTER SET binary
    BINARY(10)
    
    VARCHAR(10) CHARACTER SET binary
    VARBINARY(10)
    
    TEXT CHARACTER SET binary
    BLOB
  • CAST(expr AS type [ARRAY])

    CAST(timestamp_value AT TIME ZONE timezone_specifier AS DATETIME[(precision)])

    timezone_specifier: [INTERVAL] '+00:00' | 'UTC'

    CAST() 関数は、任意の型の式を受け取り、CONVERT() と同様に、指定された型の結果値を生成します。 詳細は、CONVERT() の説明を参照してください。

    MySQL 8.0.17 以上では、InnoDB を使用して、CREATE INDEXCREATE TABLE および ALTER TABLE ステートメントの一部として追加 ARRAY キーワードを使用して、JSON 配列に複数値インデックスを作成できます。 これらのステートメントのいずれかで複数値インデックスを作成するために使用する場合を除き、ARRAY はサポートされていません。この場合は、複数値インデックスが必要です。 インデックス付けするカラムは、JSON 型のカラムである必要があります。 ARRAY では、AS キーワードの後に続く type は、BINARYJSON および YEAR を除き、CAST() でサポートされている任意のタイプを指定できます。 構文情報と例、およびその他の関連情報については、複数値インデックス を参照してください。

    注記

    CAST() とは異なり、CONVERT() では複数値インデックスの作成または ARRAY キーワードはサポートされていません。

    MySQL 8.0.22 以降、CAST() では AT TIMEZONE 演算子を使用した UTC としての TIMESTAMP 値の取得がサポートされています。 サポートされているタイムゾーンは UTC のみです。これは、'+00:00'または'UTC'のいずれかとして指定できます。 この構文でサポートされている唯一の戻り型は DATETIME で、0 から 6 の範囲のオプションの精度指定子があります。

    タイムゾーンオフセットを使用する TIMESTAMP 値もサポートされています。

    mysql> SELECT @@system_time_zone;
    +--------------------+
    | @@system_time_zone |
    +--------------------+
    | EDT                |
    +--------------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE TABLE TZ (c TIMESTAMP);
    Query OK, 0 rows affected (0.41 sec)
    
    mysql> INSERT INTO tz VALUES
         >     ROW(CURRENT_TIMESTAMP),
         >     ROW('2020-07-28 14:50:15+1:00');
    Query OK, 1 row affected (0.08 sec)
    
    mysql> TABLE tz;
    +---------------------+
    | c                   |
    +---------------------+
    | 2020-07-28 09:22:41 |
    | 2020-07-28 09:50:15 |
    +---------------------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT CAST(c AT TIME ZONE '+00:00' AS DATETIME) AS u FROM tz;
    +---------------------+
    | u                   |
    +---------------------+
    | 2020-07-28 13:22:41 |
    | 2020-07-28 13:50:15 |
    +---------------------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT CAST(c AT TIME ZONE 'UTC' AS DATETIME(2)) AS u FROM tz;
    +------------------------+
    | u                      |
    +------------------------+
    | 2020-07-28 13:22:41.00 |
    | 2020-07-28 13:50:15.00 |
    +------------------------+
    2 rows in set (0.00 sec)

    この形式の CAST()'UTC'をタイムゾーン指定子として使用し、サーバーで「不明または不正なタイムゾーン: 'UTC'」などのエラーが発生した場合は、MySQL タイムゾーンテーブルのインストールが必要になることがあります (タイムゾーンテーブルへの移入 を参照)。

    AT TIME ZONE では ARRAY キーワードはサポートされておらず、CONVERT() 関数ではサポートされていません。

  • CONVERT(expr USING transcoding_name), CONVERT(expr,type)

    CONVERT() 関数は、任意の型の式を受け取り、指定された型の結果値を生成します。

    CONVERT(... USING ...) は標準の SQL 構文です。 USING 形式以外の CONVERT() は ODBC の構文です。

    CONVERT(expr USING transcoding_name) は、異なる文字セット間でデータを変換します。 MySQL では、トランスコーディング名は対応する文字セット名と同じです。 たとえば、次のステートメントは、デフォルト文字セットの文字列'abc'utf8mb4 文字セットの対応する文字列に変換します:

    SELECT CONVERT('abc' USING utf8mb4);

    CONVERT(expr, type) 構文 (USING を使用しない) では、結果タイプを指定する式および type 値を使用します。 この操作は、同等の CAST(expr AS type) として表現することもできます。 次の type 値を使用できます:

    • BINARY[(N)]

      BINARY データ型の文字列を生成します。 これが比較に与える影響の詳細は、セクション11.3.3「BINARY および VARBINARY 型」 を参照してください。 オプションの長さ N が指定されている場合に、BINARY(N) を使用すると、キャストで N バイトの引数しか使用されなくなります。 値が N バイトよりも短い場合は、N の長さになるまで 0x00 バイトでパディングされます。

    • CHAR[(N)] [charset_info]

      CHAR データ型の文字列を生成します。 オプションの長さの N が指定されている場合、CHAR(N) はキャストで引数の N 文字以下を使用します。 N 文字より短い値にはパディングは行われません。

      charset_info 句を指定しない場合、CHAR はデフォルトの文字セットを使用して文字列を生成します。 文字セットを明示的に指定するには、次の charset_info 値を使用できます:

      • CHARACTER SET charset_name: 指定された文字セットを持つ文字列を生成します。

      • ASCII: CHARACTER SET latin1 の短縮形。

      • UNICODE: CHARACTER SET ucs2 の短縮形。

      いずれの場合も、文字列にはデフォルトの照合順序が設定されます。

    • DATE

      DATE 値を生成します。

    • DATETIME

      DATETIME 値を生成します。

    • DECIMAL[(M[,D])]

      DECIMAL 値を生成します。 オプションの M および D 値が指定されている場合は、小数点以下の最大桁数 (精度) と桁数 (スケール) を指定します。

    • DOUBLE

      DOUBLE 結果を生成します。 MySQL 8.0.17 で追加されました。

    • FLOAT[(p)]

      精度 p が指定されていない場合、FLOAT 型の結果が生成されます。 p が指定され、0 <= < p <= 24 の場合、結果のタイプは FLOAT になります。 25 <= p <= 53 の場合、結果のタイプは DOUBLE です。 p < 0 または p > 53 の場合、エラーが返されます。 MySQL 8.0.17 で追加されました。

    • JSON

      JSON 値を生成します。 JSON と他のタイプ間の値変換のルールの詳細は、JSON 値の比較および順序付け を参照してください。

    • NCHAR[(N)]

      CHAR と似ていますが、各国語文字セットの文字列を生成します。 セクション10.3.7「各国語文字セット」を参照してください。

      CHAR とは異なり、NCHAR では後続の文字セット情報を指定できません。

    • REAL

      REAL タイプの結果を生成します。 REAL_AS_FLOAT SQL モードが有効な場合、これは実際には FLOAT です。それ以外の場合、結果のタイプは DOUBLE になります。

    • SIGNED [INTEGER]

      符号付き整数値を生成します。

    • spatial_type

      MySQL 8.0.24 では、CAST() および CONVERT() は、空間型の特定の組合せに対して、ある空間型から別の空間型へのジオメトリ値のキャストをサポートしています。 次のリストに、許可されているタイプの組合せを示します。ここで、MySQL 拡張機能は、SQL/MM standard で定義されているもの以外に、MySQL で実装されているキャストを指定します:

      • Point から次の操作を行います:

        • MultiPoint

        • GeometryCollection

      • LineString から次の操作を行います:

        • Polygon (MySQL 拡張機能)

        • MultiPoint (MySQL 拡張機能)

        • MultiLineString

        • GeometryCollection

      • Polygon から次の操作を行います:

        • LineString (MySQL 拡張機能)

        • MultiLineString (MySQL 拡張機能)

        • MultiPolygon

        • GeometryCollection

      • MultiPoint から次の操作を行います:

        • Point

        • LineString (MySQL 拡張機能)

        • GeometryCollection

      • MultiLineString から次の操作を行います:

        • LineString

        • Polygon (MySQL 拡張機能)

        • MultiPolygon (MySQL 拡張機能)

        • GeometryCollection

      • MultiPolygon から次の操作を行います:

        • Polygon

        • MultiLineString (MySQL 拡張機能)

        • GeometryCollection

      • GeometryCollection から次の操作を行います:

        • Point

        • LineString

        • Polygon

        • MultiPoint

        • MultiLineString

        • MultiPolygon

      空間キャストでは、GeometryCollectionGeomCollection は同じ結果タイプのシノニムです。

      一部の条件はすべての空間型キャストに適用され、一部の条件はキャスト結果が特定の空間型を持つ場合にのみ適用されます。 「整形式のジオメトリ、」などの用語の詳細は、セクション11.4.4「ジオメトリの整形式と妥当性」 を参照してください。

      空間キャストの一般的な条件

      次の条件は、結果の型に関係なく、すべての空間キャストに適用されます:

      • キャストの結果は、キャストする式の SRS と同じ SRS になります。

      • 空間型間のキャストでは、座標値または順序は変更されません。

      • キャストする式が NULL の場合、関数の結果は NULL です。

      • 空間型を指定する RETURNING 句とともに JSON_VALUE() 関数を使用して空間型にキャストすることはできません。

      • 空間型の ARRAY へのキャストは許可されません。

      • 空間型の組合せが許可されているが、キャストする式が構文的に整形式のジオメトリでない場合は、ER_GIS_INVALID_DATA エラーが発生します。

      • 空間型の組合せが許可されているが、キャストする式が未定義の空間参照システム (SRS) 内の構文的に整形されたジオメトリである場合、ER_SRS_NOT_FOUND エラーが発生します。

      • キャストする式に地理 SRS があり、経度または緯度が範囲外の場合は、エラーが発生します:

        • 経度の値が (−180, 180]の範囲にない場合は、ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE エラーが発生します。

        • 緯度の値が[−90, 90]の範囲にない場合は、ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE エラーが発生します。

        表示される範囲は度数です。 SRS で別の単位が使用されている場合、範囲ではその単位に対応する値が使用されます。 浮動小数点演算のため、正確な範囲制限はわずかに偏差します。

      ポイントへのキャストの条件

      キャスト結果タイプが Point の場合は、次の条件が適用されます:

      • キャストする式が Point 型の整形式ジオメトリである場合、関数の結果はその Point になります。

      • キャストする式が単一の Point を含む MultiPoint 型の整形式ジオメトリである場合、関数の結果はその Point になります。 式に複数の Point が含まれている場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が、単一の Point のみを含む GeometryCollection 型の整形式ジオメトリである場合、関数の結果はその Point になります。 式が空の場合、複数の Point が含まれている場合、または他のジオメトリタイプが含まれている場合は、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が Point, MultiPoint, GeometryCollection 以外の型の整形式ジオメトリである場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      LineString へのキャストの条件

      キャスト結果タイプが LineString の場合は、次の条件が適用されます:

      • キャストする式が LineString 型の整形式ジオメトリである場合、関数の結果はその LineString になります。

      • キャストする式が、内部リングを持たない Polygon 型の整形式ジオメトリである場合、関数の結果は、外部リングの点を同じ順序で含む LineString になります。 式に内部リングがある場合は、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が、少なくとも 2 つの点を含む MultiPoint 型の整形式ジオメトリである場合、関数の結果は、式に出現する順序で MultiPoint の点を含む LineString になります。 式に Point が 1 つしか含まれていない場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が単一の LineString を含む MultiLineString 型の整形式ジオメトリである場合、関数の結果はその LineString になります。 式に複数の LineString が含まれている場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が、単一の LineString のみを含む GeometryCollection 型の整形式ジオメトリである場合、関数の結果はその LineString になります。 式が空の場合、複数の LineString が含まれている場合、または他のジオメトリタイプが含まれている場合は、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が LineString, Polygon, MultiPoint, MultiLineString または GeometryCollection 以外の型の整形式ジオメトリである場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      ポリゴンへのキャストの条件

      キャスト結果タイプが Polygon の場合は、次の条件が適用されます:

      • キャストする式がリングである (つまり、開始点と終了点が同じである) LineString 型の整形式ジオメトリである場合、関数の結果は、同じ順序の LineString の点で構成される外部リングを持つ Polygon になります。 式がリングでない場合は、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。 リングの順序が正しくない場合 (外側のリングは反時計回りである必要があります)、ER_INVALID_CAST_POLYGON_RING_DIRECTION エラーが発生します。

      • キャストする式が Polygon 型の整形式ジオメトリである場合、関数の結果はその Polygon になります。

      • キャストする式が、すべての要素がリングである MultiLineString 型の整形式ジオメトリである場合、関数の結果は、最初の LineString が外側のリングとして、追加の LineString 値が内側のリングとして含まれる Polygon になります。 式のいずれかの要素がリングでない場合は、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。 正しい順序でないリングがある場合 (外側のリングは反時計回り、内側のリングは時計回りである必要があります)、ER_INVALID_CAST_POLYGON_RING_DIRECTION エラーが発生します。

      • キャストする式が単一の Polygon を含む MultiPolygon 型の整形式ジオメトリである場合、関数の結果はその Polygon になります。 式に複数の Polygon が含まれている場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が、単一の Polygon のみを含む GeometryCollection 型の整形式ジオメトリである場合、関数の結果はその Polygon になります。 式が空の場合、複数の Polygon が含まれている場合、または他のジオメトリタイプが含まれている場合は、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が LineString, Polygon, MultiLineString, MultiPolygon または GeometryCollection 以外の型の整形式ジオメトリである場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      MultiPoint へのキャストの条件

      キャスト結果タイプが MultiPoint の場合は、次の条件が適用されます:

      • キャストする式が Point 型の整形式のジオメトリである場合、関数の結果はその Point を唯一の要素として含む MultiPoint になります。

      • キャストする式が LineString 型の整形式ジオメトリである場合、関数の結果は LineString の点を同じ順序で含む MultiPoint になります。

      • キャストする式が MultiPoint 型の整形式ジオメトリである場合、関数の結果はその MultiPoint になります。

      • キャストする式が、点のみを含む GeometryCollection 型の整形式ジオメトリである場合、関数の結果はこれらの点を含む MultiPoint になります。 GeometryCollection が空であるか、他のジオメトリタイプが含まれている場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が Point, LineString, MultiPoint または GeometryCollection 以外の型の整形式ジオメトリである場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      MultiLineString へのキャストの条件

      キャスト結果タイプが MultiLineString の場合は、次の条件が適用されます:

      • キャストする式が LineString 型の整形式のジオメトリである場合、関数の結果はその LineString を唯一の要素として含む MultiLineString になります。

      • キャストする式が Polygon 型の整形式ジオメトリである場合、関数の結果は、Polygon の外側のリングが最初の要素として含まれ、内側のリングが式に出現する順序で追加の要素として含まれる MultiLineString になります。

      • キャストする式が MultiLineString 型の整形式ジオメトリである場合、関数の結果はその MultiLineString になります。

      • キャストする式が、内部リングのないポリゴンのみを含む MultiPolygon 型の整形式ジオメトリである場合、関数の結果は、式に出現する順序でポリゴンのリングを含む MultiLineString になります。 式に内部リングを持つポリゴンが含まれている場合は、ER_WRONG_PARAMETERS_TO_STORED_FCT エラーが発生します。

      • キャストする式が linestring のみを含む GeometryCollection 型の整形式ジオメトリである場合、関数の結果はこれらの linestring を含む MultiLineString になります。 式が空であるか、他のジオメトリタイプが含まれている場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が LineString, Polygon, MultiLineString, MultiPolygon または GeometryCollection 以外の型の整形式ジオメトリである場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      MultiPolygon へのキャストの条件

      キャスト結果タイプが MultiPolygon の場合は、次の条件が適用されます:

      • キャストする式が Polygon 型の整形式のジオメトリである場合、関数の結果は、その唯一の要素として Polygon を含む MultiPolygon になります。

      • キャストする式が、すべての要素がリングである MultiLineString 型の整形式ジオメトリである場合、関数の結果は、式の各要素の外側のリングのみを含む Polygon を含む MultiPolygon になります。 いずれかの要素がリングでない場合は、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。 正しい順序でないリングがある場合 (外側のリングは反時計回りである必要があります)、ER_INVALID_CAST_POLYGON_RING_DIRECTION エラーが発生します。

      • キャストする式が MultiPolygon 型の整形式ジオメトリである場合、関数の結果はその MultiPolygon になります。

      • キャストする式がポリゴンのみを含む GeometryCollection 型の整形式ジオメトリである場合、関数の結果はそれらのポリゴンを含む MultiPolygon になります。 式が空であるか、他のジオメトリタイプが含まれている場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      • キャストする式が Polygon, MultiLineString, MultiPolygon または GeometryCollection 以外の型の整形式ジオメトリである場合、ER_INVALID_CAST_TO_GEOMETRY エラーが発生します。

      GeometryCollection へのキャストの条件

      キャスト結果タイプが GeometryCollection の場合は、次の条件が適用されます:

      • GeometryCollectionGeomCollection は、同じ結果タイプのシノニムです。

      • キャストする式が Point 型の整形式のジオメトリである場合、関数の結果はその Point を唯一の要素として含む GeometryCollection になります。

      • キャストする式が LineString 型の整形式のジオメトリである場合、関数の結果はその LineString を唯一の要素として含む GeometryCollection になります。

      • キャストする式が Polygon 型の整形式のジオメトリである場合、関数の結果はその Polygon を唯一の要素として含む GeometryCollection になります。

      • キャストする式が MultiPoint 型の整形式ジオメトリである場合、関数の結果は、式に出現する順序で点を含む GeometryCollection になります。

      • キャストする式が MultiLineString 型の整形式ジオメトリである場合、関数の結果は、式に出現する順序で linestring を含む GeometryCollection になります。

      • キャストする式が MultiPolygon 型の整形式ジオメトリである場合、関数の結果は、式に出現する順序で MultiPolygon の要素を含む GeometryCollection になります。

      • キャストする式が GeometryCollection 型の整形式ジオメトリである場合、関数の結果はその GeometryCollection になります。

    • TIME

      TIME 値を生成します。

    • UNSIGNED [INTEGER]

      符号なし整数値を生成します。

    • YEAR

      YEAR 値を生成します。 MySQL 8.0.22 で追加されました。 YEAR への変換は、次のルールによって制御されます:

      • 1901-2155 の範囲の 4 桁の数値の場合、またはこの範囲の 4 桁の数値として解釈できる文字列の場合は、対応する YEAR 値を返します。

      • 1 桁または 2 桁で構成される数値の場合、またはこのような数値としてインターペットできる文字列の場合、次のように YEAR 値を返します:

        • 数値が 1-69 の範囲内にある場合は、2000 を加算して合計を返します。

        • 数値が 70-99 の範囲内にある場合は、1900 を加算して合計を返します。

      • 0 と評価される文字列の場合、2000 を返します。

      • 数値 0 の場合は 0 を返します。

      • DATEDATETIME または TIMESTAMP 値の場合、値の YEAR 部分を返します。 TIME 値の場合、現在の年を返します。

        TIME 引数の型を指定しない場合、次に示すように、予期したものとは異なる結果が得られる可能性があります:

        mysql> SELECT CONVERT("11:35:00", YEAR), CONVERT(TIME "11:35:00", YEAR);
        +---------------------------+--------------------------------+
        | CONVERT("11:35:00", YEAR) | CONVERT(TIME "11:35:00", YEAR) |
        +---------------------------+--------------------------------+
        |                      2011 |                           2020 |
        +---------------------------+--------------------------------+
      • 引数の型が DECIMAL, DOUBLE, DECIMAL または REAL の場合、次に示すように、値を最も近い整数に丸めてから、整数値のルールを使用して値を YEAR にキャストしようとします:

        mysql> SELECT CONVERT(1944.35, YEAR), CONVERT(1944.50, YEAR);
        +------------------------+------------------------+
        | CONVERT(1944.35, YEAR) | CONVERT(1944.50, YEAR) |
        +------------------------+------------------------+
        |                   1944 |                   1945 |
        +------------------------+------------------------+
        1 row in set (0.00 sec)
        
        mysql> SELECT CONVERT(66.35, YEAR), CONVERT(66.50, YEAR);
        +----------------------+----------------------+
        | CONVERT(66.35, YEAR) | CONVERT(66.50, YEAR) |
        +----------------------+----------------------+
        |                 2066 |                 2067 |
        +----------------------+----------------------+
        1 row in set (0.00 sec)
      • GEOMETRY 型の引数は、YEAR に変換できません。

      • YEAR に正常に変換できない値の場合は、NULL を返します。

      変換前に切り捨てる必要がある数値以外の文字を含む文字列値は、次に示すように警告を生成します:

      mysql> SELECT CONVERT("1979aaa", YEAR);
      +--------------------------+
      | CONVERT("1979aaa", YEAR) |
      +--------------------------+
      |                     1979 |
      +--------------------------+
      1 row in set, 1 warning (0.00 sec)
      
      mysql> SHOW WARNINGS;
      +---------+------+-------------------------------------------+
      | Level   | Code | Message                                   |
      +---------+------+-------------------------------------------+
      | Warning | 1292 | Truncated incorrect YEAR value: '1979aaa' |
      +---------+------+-------------------------------------------+