類型轉換函數和運算符可以將值從一種資料類型轉換為另一種資料類型。
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
在
CHAR
、VARCHAR
或TEXT
欄位的定義中使用CHARACTER SET binary
會導致該欄位被視為對應的二進位字串資料類型。例如,以下幾對定義是等效的CHAR(10) CHARACTER SET binary BINARY(10) VARCHAR(10) CHARACTER SET binary VARBINARY(10) TEXT CHARACTER SET binary BLOB
如果在
BINARY
從 mysql 客戶端內調用,二進制字串會根據--binary-as-hex
的值,使用十六進位表示法顯示。有關該選項的更多資訊,請參閱 Section 6.5.1, “mysql — The MySQL Command-Line Client”。CAST(
timestamp_value
AT TIME ZONEtimezone_specifier
AS DATETIME[(precision
)])timezone_specifier
: [INTERVAL] '+00:00' | 'UTC'使用
CAST(
語法,expr
AStype
CAST()
函數會接受任何類型的表達式,並產生指定類型的值。此操作也可以表示為CONVERT(
,兩者是等效的。如果expr
,type
)expr
為NULL
,CAST()
會回傳NULL
。允許使用這些
type
值BINARY[(
N
)]產生一個具有
VARBINARY
資料類型的字串,但當表達式expr
為空 (零長度) 時,結果類型為BINARY(0)
。如果給定可選長度N
,BINARY(
會導致轉換使用不超過N
)N
個位元組的參數。短於N
個位元組的值會以0x00
位元組填充到長度為N
。如果未給定可選長度N
,MySQL 會從表達式計算最大長度。如果提供的或計算的長度大於內部閾值,則結果類型為BLOB
。如果長度仍然太長,則結果類型為LONGBLOB
。有關轉換為
BINARY
如何影響比較的說明,請參閱 Section 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
值。如果給定可選的M
和D
值,則指定最大位數 (精度) 和小數點後的位數 (比例)。如果省略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
與其他類型之間值轉換規則的詳細資訊,請參閱 Comparison and Ordering of JSON Values。NCHAR[(
N
)]類似於
CHAR
,但產生一個具有國家字元集的字串。請參閱 Section 12.3.7, “The National Character Set”。與
CHAR
不同,NCHAR
不允許指定尾隨字元集資訊。REAL
產生一個
REAL
類型的值。如果啟用REAL_AS_FLOAT
SQL 模式,這實際上是FLOAT
;否則,結果為DOUBLE
類型。SIGNED [INTEGER]
產生一個帶正負號的
BIGINT
值。spatial_type
CAST()
和CONVERT()
支援將幾何值從一個空間類型轉換為另一個空間類型,適用於某些空間類型的組合。有關詳細資訊,請參閱 Cast Operations on Spatial Types。TIME[(
M
)]產生一個
TIME
值。如果給定可選的M
值,則指定小數秒的精度。UNSIGNED [INTEGER]
產生一個不帶正負號的
BIGINT
值。YEAR
產生一個
YEAR
值。以下規則適用於轉換為YEAR
對於 1901-2155 (含) 範圍內的四位數,或對於可以解釋為此範圍內四位數的字串,回傳對應的
YEAR
值。對於由一位或兩位數字組成的數字,或對於可以解釋為這種數字的字串,回傳
YEAR
值,如下所示如果數字在 1-69 (含) 範圍內,則加上 2000 並回傳總和。
如果數字在 70-99 (含) 範圍內,則加上 1900 並回傳總和。
對於評估結果為 0 的字串,回傳 2000。
對於數字 0,回傳 0。
對於
DATE
、DATETIME
或TIMESTAMP
值,回傳該值的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 | +--------------------------+-------------------------------+
如果參數的類型為
DECIMAL
、DOUBLE
、DECIMAL
或REAL
,則將值四捨五入到最接近的整數,然後嘗試使用整數值的規則將值轉換為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 | +---------------------+---------------------+
對於無法成功轉換為
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
允許在CREATE INDEX
、CREATE TABLE
和ALTER TABLE
語句中,使用額外的ARRAY
關鍵字,為JSON
陣列建立多值索引。ARRAY
僅在上述語句中用於建立多值索引時才受支援,且在這種情況下是必需的。被索引的欄位必須是JSON
類型。使用ARRAY
時,AS
關鍵字後面的type
可以指定CAST()
支援的任何類型,但BINARY
、JSON
和YEAR
除外。有關語法資訊、範例和其他相關資訊,請參閱 多值索引。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
USINGtranscoding_name
)CONVERT(
是標準 SQL 語法。expr
USINGtranscoding_name
)CONVERT()
的非USING
形式是 ODBC 語法。無論使用何種語法,如果expr
為NULL
,函式都會回傳NULL
。CONVERT(
會在不同的字元集之間轉換資料。在 MySQL 中,轉碼名稱與對應的字元集名稱相同。例如,此語句將預設字元集中的字串expr
USINGtranscoding_name
)'abc'
轉換為utf8mb4
字元集中對應的字串SELECT CONVERT('abc' USING utf8mb4);
CONVERT(
語法(不含expr
,type
)USING
)接受一個運算式和一個指定結果類型的type
值,並產生指定類型結果值。此運算也可以表示為CAST(
,兩者等效。有關更多資訊,請參閱expr
AStype
)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_name
和 charset_name
的預設排序規則。如果您省略 CHARACTER SET
,則結果的字元集和排序規則由決定預設連線字元集和排序規則的 charset_name
character_set_connection
和 collation_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 |
+-------------+------------------------------------+
請注意,如果您將 BINARY
、CAST()
或 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
在空間轉換中,GeometryCollection
和 GeomCollection
是同義詞,表示相同的結果類型。
某些條件適用於所有空間類型轉換,而某些條件僅在轉換結果要具有特定的空間類型時才適用。 有關諸如 「形式良好的幾何圖形」 等術語的資訊,請參閱 第 13.4.4 節「幾何圖形的良好形式和有效性」。
空間轉換的一般條件
這些條件適用於所有空間轉換,無論結果類型為何
轉換的結果與要轉換的運算式具有相同的 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
。如果要轉換的運算式是類型為
MultiPoint
且包含單個Point
的形式良好的幾何圖形,則函數結果是該Point
。 如果運算式包含多個Point
,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。如果要轉換的運算式是類型為
GeometryCollection
且僅包含單個Point
的形式良好的幾何圖形,則函數結果是該Point
。 如果運算式為空、包含多個Point
或包含其他幾何圖形類型,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。如果要轉換的運算式是類型為
Point
、MultiPoint
、GeometryCollection
以外的其他類型的形式良好的幾何圖形,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。
轉換為線的條件
當轉換結果類型為 LineString
時,這些條件適用
如果要轉換的運算式是類型為
LineString
的形式良好的幾何圖形,則函數結果是該LineString
。如果要轉換的運算式是類型為
Polygon
且沒有內部環的形式良好的幾何圖形,則函數結果是一個LineString
,其中包含外部環中的點,順序相同。 如果運算式有內部環,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。如果要轉換的運算式是類型為
MultiPoint
且至少包含兩個點的形式良好的幾何圖形,則函數結果是一個LineString
,其中包含MultiPoint
的點,順序與它們在運算式中出現的順序相同。 如果運算式僅包含一個Point
,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。如果要轉換的運算式是類型為
MultiLineString
且包含單個LineString
的形式良好的幾何圖形,則函數結果是該LineString
。 如果運算式包含多個LineString
,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。如果要轉換的運算式是類型為
GeometryCollection
且僅包含單個LineString
的形式良好的幾何圖形,則函數結果是該LineString
。 如果運算式為空、包含多個LineString
或包含其他幾何圖形類型,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。如果要轉換的運算式是類型為
LineString
、Polygon
、MultiPoint
、MultiLineString
或GeometryCollection
以外的其他類型的形式良好的幾何圖形,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。
轉換為多邊形的條件
當轉換結果類型為 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
錯誤。如果要轉換的運算式是類型為
MultiPolygon
且包含單個Polygon
的形式良好的幾何圖形,則函數結果是該Polygon
。 如果運算式包含多個Polygon
,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。如果要轉換的運算式是類型為
GeometryCollection
且僅包含單個Polygon
的形式良好的幾何圖形,則函數結果是該Polygon
。 如果運算式為空、包含多個Polygon
或包含其他幾何圖形類型,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。如果要轉換的運算式是類型為
LineString
、Polygon
、MultiLineString
、MultiPolygon
或GeometryCollection
以外的其他類型的形式良好的幾何圖形,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。
轉換為多點的條件
當轉換結果類型為 MultiPoint
時,這些條件適用
如果要轉換的運算式是類型為
Point
的形式良好的幾何圖形,則函數結果是一個MultiPoint
,其中包含該Point
作為其唯一元素。如果要轉換的運算式是類型為
LineString
的形式良好的幾何圖形,則函數結果是一個MultiPoint
,其中包含LineString
的點,順序相同。如果要轉換的運算式是類型為
MultiPoint
的形式良好的幾何圖形,則函數結果是該MultiPoint
。如果轉換的運算式是格式正確的
GeometryCollection
類型幾何,且僅包含點,則函數結果會是一個包含這些點的MultiPoint
。如果GeometryCollection
為空或包含其他幾何類型,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。如果轉換的運算式是格式正確的幾何,且類型不是
Point
、LineString
、MultiPoint
或GeometryCollection
,則會發生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
錯誤。如果要轉換的運算式是類型為
LineString
、Polygon
、MultiLineString
、MultiPolygon
或GeometryCollection
以外的其他類型的形式良好的幾何圖形,則會發生ER_INVALID_CAST_TO_GEOMETRY
錯誤。
轉換為 MultiPolygon 的條件
當轉換結果類型為 MultiPolygon
時,會套用這些條件
如果轉換的運算式是格式正確的
Polygon
類型幾何,則函數結果會是一個MultiPolygon
,其中包含該Polygon
作為其唯一元素。如果轉換的運算式是格式正確的
MultiLineString
類型幾何,其中所有元素都是環,則函數結果會是一個MultiPolygon
,其中包含一個Polygon
,該Polygon
僅包含運算式每個元素的外環。如果任何元素不是環,則會發生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
時,會套用這些條件
GeometryCollection
和GeomCollection
是同一結果類型的同義詞。如果轉換的運算式是格式正確的
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 節,「算術運算符」)。若要覆寫此行為,請使用 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 模式會影響轉換操作的結果(請參閱 第 7.1.11 節,「伺服器 SQL 模式」)。範例
若要將「零」日期字串轉換為日期,當啟用
NO_ZERO_DATE
SQL 模式時,CONVERT()
和CAST()
會傳回NULL
並產生警告。對於整數減法,如果啟用
NO_UNSIGNED_SUBTRACTION
SQL 模式,即使任何運算元都不帶正負號,減法結果也會帶正負號。