轉換函式和運算子可讓您將值從一種資料類型轉換為另一種資料類型。
BINARYexprBINARY運算子會將表達式轉換為二進位字串(具有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如果從 mysql 用戶端中呼叫
BINARY,二進位字串會使用十六進位表示法顯示,具體取決於--binary-as-hex的值。如需有關該選項的詳細資訊,請參閱 第 6.5.1 節,「mysql — MySQL 命令列用戶端」。CAST(timestamp_valueAT TIME ZONEtimezone_specifierAS DATETIME[(precision)])timezone_specifier: [INTERVAL] '+00:00' | 'UTC'使用
CAST(語法,exprAStypeCAST()函數會接收任何類型的表達式,並產生指定類型的結果值。此操作也可以表示為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如何影響比較,請參閱第 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_nameASCII:是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和其他類型之間值轉換規則的詳細資訊,請參閱JSON 值的比較和排序。NCHAR[(N)]與
CHAR類似,但產生一個具有國家字元集的字串。請參閱第 12.3.7 節,「國家字元集」。與
CHAR不同,NCHAR不允許指定後面的字元集資訊。REAL產生類型為
REAL的結果。如果啟用了REAL_AS_FLOATSQL 模式,則實際上為FLOAT;否則,結果類型為DOUBLE。SIGNED [INTEGER]產生一個帶正負號的
BIGINT值。spatial_typeCAST()和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。
對於
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允許使用額外的ARRAY關鍵字,以便在JSON陣列上建立多值索引,作為CREATE INDEX、CREATE TABLE和ALTER TABLE語句的一部分。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(exprUSINGtranscoding_name)CONVERT(是標準 SQL 語法。非exprUSINGtranscoding_name)USING形式的CONVERT()是 ODBC 語法。無論使用哪種語法,如果expr為NULL,則該函式會傳回NULL。CONVERT(在不同的字元集之間轉換資料。在 MySQL 中,轉碼名稱與對應的字元集名稱相同。例如,此語句將預設字元集中的字串exprUSINGtranscoding_name)'abc'轉換為utf8mb4字元集中對應的字串SELECT CONVERT('abc' USING utf8mb4);CONVERT(語法(不含expr,type)USING)接受一個運算式和一個指定結果類型的type值,並產生指定類型的結果值。此運算也可以表示為CAST(,它們是等效的。如需更多資訊,請參閱exprAStype)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_namecharset_name 和 charset_name 的預設定序。如果您省略 CHARACTER SET ,則結果的字元集和定序由決定預設連線字元集和定序的 charset_namecharacter_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到MultiPointGeometryCollection
從
LineString到Polygon(MySQL 擴充)MultiPoint(MySQL 擴充)MultiLineStringGeometryCollection
從
Polygon到LineString(MySQL 擴充)MultiLineString(MySQL 擴充)MultiPolygonGeometryCollection
從
MultiPoint到PointLineString(MySQL 擴充)GeometryCollection
從
MultiLineString到LineStringPolygon(MySQL 擴充)MultiPolygon(MySQL 擴充)GeometryCollection
從
MultiPolygon到PolygonMultiLineString(MySQL 擴充)GeometryCollection
從
GeometryCollection到PointLineStringPolygonMultiPointMultiLineStringMultiPolygon
在空間轉換中,GeometryCollection 和 GeomCollection 是相同結果類型的同義詞。
某些條件適用於所有空間類型轉換,而某些條件僅在轉換結果具有特定空間類型時才適用。有關 「良好形成的幾何」 等術語的資訊,請參閱 第 13.4.4 節,「幾何的良好形成和有效性」。
空間轉換的一般條件
這些條件適用於所有空間轉換,無論結果類型為何
轉換的結果與要轉換的表達式具有相同的 SRS。
在空間類型之間轉換不會更改座標值或順序。
如果要轉換的表達式為
NULL,則函數結果為NULL。不允許使用
JSON_VALUE()函數並使用指定空間類型的RETURNING子句來轉換為空間類型。不允許轉換為空間類型的
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。如果要轉換的表達式是包含單個
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錯誤。如果要轉換的表達式是包含至少兩個點的語法正確的
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錯誤。如果要轉換的表達式是
LineString、Polygon、MultiPoint、MultiLineString或GeometryCollection以外的語法正確幾何圖形類型,則會發生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錯誤。如果要轉換的表達式是
LineString、Polygon、MultiLineString、MultiPolygon或GeometryCollection以外的語法正確幾何圖形類型,則會發生ER_INVALID_CAST_TO_GEOMETRY錯誤。
轉換為 MultiPoint 的條件
當轉換結果類型為 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,針對表達式的每個元素都只有一個外環。如果任何元素不是環,則會發生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.0SQL 模式會影響轉換操作的結果(請參閱 第 7.1.11 節,「伺服器 SQL 模式」)。範例
對於將 「零」日期字串轉換為日期,當啟用
NO_ZERO_DATESQL 模式時,CONVERT()和CAST()會傳回NULL並產生警告。對於整數減法,如果啟用
NO_UNSIGNED_SUBTRACTIONSQL 模式,即使任何運算元不帶正負號,減法結果也帶有正負號。