文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  函式和運算子  /  轉換函式和運算子

14.10 轉換函式和運算子

表 14.15 轉換函式和運算子

名稱 描述 已棄用
BINARY 將字串轉換為二進位字串
CAST() 將值轉換為特定類型
CONVERT() 將值轉換為特定類型

轉換函式和運算子可讓您將值從一種資料類型轉換為另一種資料類型。

轉換函式和運算子描述

  • BINARY expr

    BINARY 運算子會將表達式轉換為二進位字串(具有 binary 字元集和 binary 校對的字串)。BINARY 的常見用途是強制使用數值位元組值而非字元逐一執行字元字串比較。BINARY 運算子也會導致比較中的尾隨空格變得重要。如需 binary 字元集的 binary 校對與非二進位字元集的 _bin 校對之間差異的相關資訊,請參閱 第 12.8.5 節,「binary 校對與 _bin 校對的比較」

    BINARY 運算子已棄用;您應該預期會在未來版本的 MySQL 中移除它。請改用 CAST(... AS BINARY)

    mysql> SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
            -> OK
    mysql> SELECT 'a' = 'A';
            -> 1
    mysql> SELECT BINARY 'a' = 'A';
            -> 0
    mysql> SELECT 'a' = 'a ';
            -> 1
    mysql> SELECT BINARY 'a' = 'a ';
            -> 0

    在比較中,BINARY 會影響整個運算;它可以放在任一運算元之前,結果都相同。

    若要將字串表達式轉換為二進位字串,這些建構是等效的

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

    如果值是字串常值,則可以使用 _binary 字元集導入器,將其指定為二進位字串,而無需轉換它

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

    如需有關導入器的資訊,請參閱 第 12.3.8 節,「字元集導入器」

    表達式中的 BINARY 運算子與字元資料行定義中的 BINARY 屬性效果不同。針對使用 BINARY 屬性定義的字元資料行,MySQL 會指派資料表預設字元集和該字元集的二進位 (_bin) 校對。每個非二進位字元集都有 _bin 校對。例如,如果資料表預設字元集是 utf8mb4,則這兩個資料行定義是等效的

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

    CHARVARCHARTEXT 資料行的定義中使用 CHARACTER SET binary,會導致該資料行被視為對應的二進位字串資料類型。例如,下列各對定義是等效的

    CHAR(10) CHARACTER SET binary
    BINARY(10)
    
    VARCHAR(10) CHARACTER SET binary
    VARBINARY(10)
    
    TEXT CHARACTER SET binary
    BLOB

    如果從 mysql 用戶端中呼叫 BINARY,二進位字串會使用十六進位表示法顯示,具體取決於 --binary-as-hex 的值。如需有關該選項的詳細資訊,請參閱 第 6.5.1 節,「mysql — MySQL 命令列用戶端」

  • CAST(expr AS type [ARRAY])

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

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

    使用 CAST(expr AS type 語法,CAST() 函數會接收任何類型的表達式,並產生指定類型的結果值。此操作也可以表示為 CONVERT(expr, type),兩者是等效的。如果 exprNULL,則 CAST() 會回傳 NULL

    以下是允許的 type 值:

    • BINARY[(N)]

      產生一個具有 VARBINARY 資料類型的字串,但當表達式 expr 為空(零長度)時,結果類型為 BINARY(0)。如果提供了可選長度 N,則 BINARY(N) 會使轉換最多使用參數的 N 個位元組。短於 N 個位元組的值會以 0x00 位元組填充到長度為 N。如果未提供可選長度 N,MySQL 會從表達式計算最大長度。如果提供的或計算的長度大於內部閾值,則結果類型為 BLOB。如果長度仍然過長,則結果類型為 LONGBLOB

      有關轉換為 BINARY 如何影響比較,請參閱第 13.3.3 節,「The BINARY and VARBINARY Types」

    • CHAR[(N)] [charset_info]

      產生一個具有 VARCHAR 資料類型的字串,除非表達式 expr 為空(零長度),在這種情況下,結果類型為 CHAR(0)。如果提供了可選長度 N,則 CHAR(N) 會使轉換最多使用參數的 N 個字元。對於短於 N 個字元的值,不會發生填充。如果未提供可選長度 N,MySQL 會從表達式計算最大長度。如果提供的或計算的長度大於內部閾值,則結果類型為 TEXT。如果長度仍然過長,則結果類型為 LONGTEXT

      如果沒有 charset_info 子句,CHAR 會產生具有預設字元集的字串。要明確指定字元集,則允許使用以下 charset_info 值:

      • CHARACTER SET charset_name:產生具有給定字元集的字串。

      • ASCII:是 CHARACTER SET latin1 的簡寫。

      • UNICODE:是 CHARACTER SET ucs2 的簡寫。

      在所有情況下,字串都具有字元集的預設排序規則。

    • DATE

      產生一個 DATE 值。

    • DATETIME[(M)]

      產生一個 DATETIME 值。如果提供了可選的 M 值,則它指定小數秒的精度。

    • DECIMAL[(M[,D])]

      產生一個 DECIMAL 值。如果提供了可選的 MD 值,它們分別指定最大位數(精度)和小數位數(標度)。如果省略 D,則假定為 0。如果省略 M,則假定為 10。

    • DOUBLE

      產生一個 DOUBLE 結果。

    • FLOAT[(p)]

      如果未指定精度 p,則產生類型為 FLOAT 的結果。如果提供了 p 且 0 <= p <= 24,則結果類型為 FLOAT。如果 25 <= p <= 53,則結果類型為 DOUBLE。如果 p < 0 或 p > 53,則返回錯誤。

    • JSON

      產生一個 JSON 值。有關 JSON 和其他類型之間值轉換規則的詳細資訊,請參閱JSON 值的比較和排序

    • NCHAR[(N)]

      CHAR 類似,但產生一個具有國家字元集的字串。請參閱第 12.3.7 節,「國家字元集」

      CHAR 不同,NCHAR 不允許指定後面的字元集資訊。

    • REAL

      產生類型為 REAL 的結果。如果啟用了 REAL_AS_FLOAT SQL 模式,則實際上為 FLOAT;否則,結果類型為 DOUBLE

    • SIGNED [INTEGER]

      產生一個帶正負號的 BIGINT 值。

    • spatial_type

      CAST()CONVERT() 支援將幾何值從一個空間類型轉換為另一個空間類型,適用於某些空間類型的組合。有關詳細資訊,請參閱空間類型上的轉換操作

    • TIME[(M)]

      產生一個 TIME 值。如果提供了可選的 M 值,則它指定小數秒的精度。

    • UNSIGNED [INTEGER]

      產生一個不帶正負號的 BIGINT 值。

    • YEAR

      產生一個 YEAR 值。以下規則會控制轉換為 YEAR

      • 對於 1901 到 2155 範圍內(包含)的四位數字,或對於可以解釋為此範圍內四位數字的字串,則傳回相應的 YEAR 值。

      • 對於由一位或兩位數字組成的數字,或對於可以解釋為此類數字的字串,則傳回 YEAR 值,如下所示:

        • 如果數字在 1 到 69 範圍內(包含),則加 2000 並傳回總和。

        • 如果數字在 70 到 99 範圍內(包含),則加 1900 並傳回總和。

      • 對於評估結果為 0 的字串,則傳回 2000。

      • 對於數字 0,則傳回 0。

      • 對於 DATEDATETIMETIMESTAMP 值,則傳回值的 YEAR 部分。對於 TIME 值,則傳回目前的年份。

        如果您未指定 TIME 參數的類型,則可能會得到與預期不同的結果,如下所示:

        mysql> SELECT CAST("11:35:00" AS YEAR), CAST(TIME "11:35:00" AS YEAR);
        +--------------------------+-------------------------------+
        | CAST("11:35:00" AS YEAR) | CAST(TIME "11:35:00" AS YEAR) |
        +--------------------------+-------------------------------+
        |                     2011 |                          2021 |
        +--------------------------+-------------------------------+
      • 如果參數的類型為 DECIMALDOUBLEDECIMALREAL,則將值四捨五入為最接近的整數,然後嘗試使用整數值的規則將值轉換為 YEAR,如下所示:

        mysql> SELECT CAST(1944.35 AS YEAR), CAST(1944.50 AS YEAR);
        +-----------------------+-----------------------+
        | CAST(1944.35 AS YEAR) | CAST(1944.50 AS YEAR) |
        +-----------------------+-----------------------+
        |                  1944 |                  1945 |
        +-----------------------+-----------------------+
        
        mysql> SELECT CAST(66.35 AS YEAR), CAST(66.50 AS YEAR);
        +---------------------+---------------------+
        | CAST(66.35 AS YEAR) | CAST(66.50 AS YEAR) |
        +---------------------+---------------------+
        |                2066 |                2067 |
        +---------------------+---------------------+
      • 類型為 GEOMETRY 的參數無法轉換為 YEAR

      • 對於無法成功轉換為 YEAR 的值,則傳回 NULL

      包含非數字字元的字串值,必須在轉換之前截斷,會發出警告,如下所示:

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

    InnoDB 允許使用額外的 ARRAY 關鍵字,以便在 JSON 陣列上建立多值索引,作為 CREATE INDEXCREATE TABLEALTER TABLE 語句的一部分。ARRAY 僅在用於在這些語句之一中建立多值索引時才受支援,在這種情況下,它是必需的。被索引的欄位必須是 JSON 類型的欄位。使用 ARRAY 時,AS 關鍵字後面的 type 可以指定 CAST() 支援的任何類型,但 BINARYJSONYEAR 除外。有關語法資訊和範例,以及其他相關資訊,請參閱 多值索引

    注意

    CAST() 不同,CONVERT() 支援多值索引建立或 ARRAY 關鍵字。

    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' 作為時區指定符,且伺服器產生類似 Unknown or incorrect time zone: 'UTC' 的錯誤,您可能需要安裝 MySQL 時區表(請參閱 填入時區表)。

    AT TIME ZONE 不支援 ARRAY 關鍵字,且 CONVERT() 函式不支援它。

  • CONVERT(expr USING transcoding_name)

    CONVERT(expr,type)

    CONVERT(expr USING transcoding_name) 是標準 SQL 語法。非 USING 形式的 CONVERT() 是 ODBC 語法。無論使用哪種語法,如果 exprNULL,則該函式會傳回 NULL

    CONVERT(expr USING transcoding_name) 在不同的字元集之間轉換資料。在 MySQL 中,轉碼名稱與對應的字元集名稱相同。例如,此語句將預設字元集中的字串 'abc' 轉換為 utf8mb4 字元集中對應的字串

    SELECT CONVERT('abc' USING utf8mb4);

    CONVERT(expr, type) 語法(不含 USING)接受一個運算式和一個指定結果類型的 type 值,並產生指定類型的結果值。此運算也可以表示為 CAST(expr AS type),它們是等效的。如需更多資訊,請參閱 CAST() 的描述。

字元集轉換

帶有 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_namecharset_name 的預設定序。如果您省略 CHARACTER SET charset_name,則結果的字元集和定序由決定預設連線字元集和定序的 character_set_connectioncollation_connection 系統變數定義(請參閱 第 12.4 節,「連線字元集和定序」)。

不允許在 CONVERT()CAST() 呼叫中使用 COLLATE 子句,但您可以將它套用至函式結果。例如,以下是合法的

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);

對於字串文字,指定字元集的另一種方式是使用字元集引導符。前面範例中的 _latin1_latin2 是引導符的實例。與 CAST()CONVERT() 等轉換函式將字串從一個字元集轉換為另一個字元集不同,引導符會將字串文字指定為具有特定的字元集,不涉及轉換。如需更多資訊,請參閱 第 12.3.8 節,「字元集引導符」

字串比較的字元集轉換

通常,您無法以不區分大小寫的方式比較 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 |
+---------------------------------+

字元集轉換對於二進位字串的大小寫轉換也很有用。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 可能無法有效地使用索引。

空間類型的轉換運算

CAST()CONVERT() 支援將幾何值從一個空間類型轉換為另一個空間類型,適用於空間類型的某些組合。以下清單顯示允許的類型組合,其中 MySQL 擴充 表示在 MySQL 中實作的超出 SQL/MM 標準 中定義的轉換

  • 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 是相同結果類型的同義詞。

某些條件適用於所有空間類型轉換,而某些條件僅在轉換結果具有特定空間類型時才適用。有關 良好形成的幾何 等術語的資訊,請參閱 第 13.4.4 節,「幾何的良好形成和有效性」

空間轉換的一般條件

這些條件適用於所有空間轉換,無論結果類型為何

  • 轉換的結果與要轉換的表達式具有相同的 SRS。

  • 在空間類型之間轉換不會更改座標值或順序。

  • 如果要轉換的表達式為 NULL,則函數結果為 NULL

  • 不允許使用 JSON_VALUE() 函數並使用指定空間類型的 RETURNING 子句來轉換為空間類型。

  • 不允許轉換為空間類型的 ARRAY

  • 如果允許空間類型組合,但要轉換的表達式不是語法正確的幾何圖形,則會發生 ER_GIS_INVALID_DATA 錯誤。

  • 如果允許空間類型組合,但要轉換的表達式是未定義空間參考系統 (SRS) 中語法正確的幾何圖形,則會發生 ER_SRS_NOT_FOUND 錯誤。

  • 如果要轉換的表達式具有地理 SRS,但其經度或緯度超出範圍,則會發生錯誤。

    顯示的範圍以度為單位。 如果 SRS 使用其他單位,則該範圍將使用其單位中的相應值。由於浮點運算,確切的範圍限制會略有偏差。

轉換為 Point 的條件

當轉換結果類型為 Point 時,適用這些條件

  • 如果要轉換的表達式是語法正確的 Point 類型幾何圖形,則函數結果為該 Point

  • 如果要轉換的表達式是包含單個 Point 的語法正確的 MultiPoint 類型幾何圖形,則函數結果為該 Point。如果表達式包含多個 Point,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

  • 如果要轉換的表達式是僅包含單個 Point 的語法正確的 GeometryCollection 類型幾何圖形,則函數結果為該 Point。如果表達式為空、包含多個 Point 或包含其他幾何類型,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

  • 如果要轉換的表達式是 PointMultiPointGeometryCollection 以外的語法正確幾何圖形類型,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

轉換為 LineString 的條件

當轉換結果類型為 LineString 時,適用這些條件

  • 如果要轉換的表達式是語法正確的 LineString 類型幾何圖形,則函數結果為該 LineString

  • 如果要轉換的表達式是沒有內部環的語法正確的 Polygon 類型幾何圖形,則函數結果是包含外部環中相同順序的點的 LineString。如果表達式具有內部環,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

  • 如果要轉換的表達式是包含至少兩個點的語法正確的 MultiPoint 類型幾何圖形,則函數結果是一個 LineString,其中包含 MultiPoint 中依表達式出現順序排列的點。如果表達式僅包含一個 Point,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

  • 如果要轉換的表達式是包含單個 LineString 的語法正確的 MultiLineString 類型幾何圖形,則函數結果為該 LineString。如果表達式包含多個 LineString,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

  • 如果要轉換的表達式是僅包含單個 LineString 的語法正確的 GeometryCollection 類型幾何圖形,則函數結果為該 LineString。如果表達式為空、包含多個 LineString 或包含其他幾何類型,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

  • 如果要轉換的表達式是 LineStringPolygonMultiPointMultiLineStringGeometryCollection 以外的語法正確幾何圖形類型,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

轉換為 Polygon 的條件

當轉換結果類型為 Polygon 時,適用這些條件

  • 如果要轉換的表達式是一個環的語法正確的 LineString 類型幾何圖形(也就是說,起點和終點相同),則函數結果是一個 Polygon,其外部環由 LineString 中相同順序的點組成。如果表達式不是一個環,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。如果環的順序不正確(外部環必須為逆時針方向),則會發生 ER_INVALID_CAST_POLYGON_RING_DIRECTION 錯誤。

  • 如果要轉換的表達式是語法正確的 Polygon 類型幾何圖形,則函數結果為該 Polygon

  • 如果要轉換的表達式是所有元素都是環的語法正確的 MultiLineString 類型幾何圖形,則函數結果是一個 Polygon,其中第一個 LineString 作為外部環,任何其他 LineString 值作為內部環。如果表達式的任何元素不是一個環,則會發生 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 錯誤。

  • 如果要轉換的表達式是 LineStringPolygonMultiLineStringMultiPolygonGeometryCollection 以外的語法正確幾何圖形類型,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

轉換為 MultiPoint 的條件

當轉換結果類型為 MultiPoint 時,適用這些條件

  • 如果要轉換的表達式是語法正確的 Point 類型幾何圖形,則函數結果是一個 MultiPoint,其中包含該 Point 作為其唯一元素。

  • 如果要轉換的表達式是語法正確的 LineString 類型幾何圖形,則函數結果是一個 MultiPoint,其中包含 LineString 中相同順序的點。

  • 如果要轉換的表達式是語法正確的 MultiPoint 類型幾何圖形,則函數結果為該 MultiPoint

  • 如果要轉換的表達式是僅包含點的語法正確的 GeometryCollection 類型幾何圖形,則函數結果是一個 MultiPoint,其中包含這些點。如果 GeometryCollection 為空或包含其他幾何類型,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

  • 如果要轉換的表達式是 PointLineStringMultiPointGeometryCollection 以外的語法正確幾何圖形類型,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

轉換為 MultiLineString 的條件

當轉換結果類型為 MultiLineString 時,適用這些條件

  • 如果要轉換的表達式是語法正確的 LineString 類型幾何圖形,則函數結果是一個 MultiLineString,其中包含該 LineString 作為其唯一元素。

  • 如果要轉換的表達式是語法正確的 Polygon 類型幾何圖形,則函數結果是一個 MultiLineString,其中包含 Polygon 的外部環作為其第一個元素,以及任何內部環作為表達式中依序出現的其他元素。

  • 如果要轉換的表達式是語法正確的 MultiLineString 類型幾何圖形,則函數結果為該 MultiLineString

  • 如果要轉換的表達式是僅包含沒有內部環的多邊形的語法正確的 MultiPolygon 類型幾何圖形,則函數結果是一個 MultiLineString,其中包含依表達式出現順序排列的多邊形環。如果表達式包含任何帶有內部環的多邊形,則會發生 ER_WRONG_PARAMETERS_TO_STORED_FCT 錯誤。

  • 如果要轉換的表達式是僅包含線串的語法正確的 GeometryCollection 類型幾何圖形,則函數結果是一個 MultiLineString,其中包含這些線串。如果表達式為空或包含其他幾何類型,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

  • 如果要轉換的表達式是 LineStringPolygonMultiLineStringMultiPolygonGeometryCollection 以外的語法正確幾何圖形類型,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

轉換為 MultiPolygon 的條件

當轉換結果類型為 MultiPolygon 時,適用這些條件

  • 如果要轉換的表達式是語法正確的 Polygon 類型幾何圖形,則函數結果是一個 MultiPolygon,其中包含 Polygon 作為其唯一元素。

  • 如果轉換的表達式是格式良好的 MultiLineString 幾何類型,且所有元素都是環,則函數結果會是一個 MultiPolygon,其中包含一個 Polygon,針對表達式的每個元素都只有一個外環。如果任何元素不是環,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。如果任何環的順序不正確(外環必須為逆時針方向),則會發生 ER_INVALID_CAST_POLYGON_RING_DIRECTION 錯誤。

  • 如果轉換的表達式是格式良好的 MultiPolygon 幾何類型,則函數結果為該 MultiPolygon

  • 如果轉換的表達式是格式良好的 GeometryCollection 幾何類型,且僅包含多邊形,則函數結果會是一個包含這些多邊形的 MultiPolygon。如果表達式為空或包含其他幾何類型,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

  • 如果轉換的表達式是格式良好的幾何類型,但不是 PolygonMultiLineStringMultiPolygonGeometryCollection,則會發生 ER_INVALID_CAST_TO_GEOMETRY 錯誤。

轉換為 GeometryCollection 的條件

當轉換結果類型為 GeometryCollection 時,適用以下條件

  • GeometryCollectionGeomCollection 是相同結果類型的同義詞。

  • 如果轉換的表達式是格式良好的 Point 幾何類型,則函數結果會是一個 GeometryCollection,其中包含該 Point 作為其唯一的元素。

  • 如果轉換的表達式是格式良好的 LineString 幾何類型,則函數結果會是一個 GeometryCollection,其中包含該 LineString 作為其唯一的元素。

  • 如果轉換的表達式是格式良好的 Polygon 幾何類型,則函數結果會是一個 GeometryCollection,其中包含該 Polygon 作為其唯一的元素。

  • 如果轉換的表達式是格式良好的 MultiPoint 幾何類型,則函數結果會是一個 GeometryCollection,其中包含表達式中依序出現的點。

  • 如果轉換的表達式是格式良好的 MultiLineString 幾何類型,則函數結果會是一個 GeometryCollection,其中包含表達式中依序出現的線串。

  • 如果轉換的表達式是格式良好的 MultiPolygon 幾何類型,則函數結果會是一個 GeometryCollection,其中包含表達式中依序出現的 MultiPolygon 元素。

  • 如果轉換的表達式是格式良好的 GeometryCollection 幾何類型,則函數結果為該 GeometryCollection

轉換操作的其他用途

轉換函數可用於在 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 COLLATE=utf8mb4_0900_ai_ci

轉換函數可用於以詞彙順序排序 ENUM 欄位。通常,ENUM 欄位的排序會使用內部數值。將值轉換為 CHAR 會產生詞彙排序

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

如果您將 CAST() 作為更複雜的表達式的一部分使用,例如 CONCAT('Date: ',CAST(NOW() AS DATE)),則 CAST() 也會變更結果。

對於時間值,很少需要使用 CAST() 來提取不同格式的資料。而是使用諸如 EXTRACT()DATE_FORMAT()TIME_FORMAT() 之類的函數。請參閱 第 14.7 節,「日期和時間函數」

要將字串轉換為數字,通常只需要在數值內容中使用字串值即可

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

對於預設為二進制字串的十六進制和位元文字也是如此

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'

有關數字隱式轉換為字串的資訊,請參閱 第 14.3 節,「表達式評估中的類型轉換」

MySQL 支援帶正負號和不帶正負號的 64 位元數值算術。對於其中一個運算元是不帶正負號整數的數值運算子(例如 +-),預設情況下,結果是不帶正負號的(請參閱 第 14.6.1 節,「算術運算子」)。若要覆寫此設定,請使用 SIGNEDUNSIGNED 轉換運算子將值分別轉換為帶正負號或不帶正負號的 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 模式會影響轉換操作的結果(請參閱 第 7.1.11 節,「伺服器 SQL 模式」)。範例

  • 對於將 日期字串轉換為日期,當啟用 NO_ZERO_DATE SQL 模式時,CONVERT()CAST() 會傳回 NULL 並產生警告。

  • 對於整數減法,如果啟用 NO_UNSIGNED_SUBTRACTION SQL 模式,即使任何運算元不帶正負號,減法結果也帶有正負號。