表 14.34 雜項函數
名稱 | 描述 |
---|---|
ANY_VALUE() |
抑制 ONLY_FULL_GROUP_BY 值拒絕 |
BIN_TO_UUID() |
將二進位 UUID 轉換為字串 |
DEFAULT() |
傳回資料表欄位的預設值 |
GROUPING() |
區分超級彙總 ROLLUP 列與一般列 |
INET_ATON() |
傳回 IP 位址的數值 |
INET_NTOA() |
從數值傳回 IP 位址 |
IS_UUID() |
引數是否為有效的 UUID |
NAME_CONST() |
使欄位具有指定的名稱 |
SLEEP() |
睡眠指定秒數 |
UUID() |
傳回通用唯一識別碼 (UUID) |
UUID_SHORT() |
傳回整數值的通用識別碼 |
UUID_TO_BIN() |
將字串 UUID 轉換為二進位 |
VALUES() |
定義 INSERT 期間要使用的值 |
當啟用
ONLY_FULL_GROUP_BY
SQL 模式時,此函數對於GROUP BY
查詢很有用,適用於 MySQL 基於 MySQL 無法判定的原因拒絕您知道有效的查詢的情況。函數傳回值和類型與其引數的傳回值和類型相同,但不檢查函數結果是否符合ONLY_FULL_GROUP_BY
SQL 模式。例如,如果
name
是未建立索引的欄位,則在啟用ONLY_FULL_GROUP_BY
的情況下,下列查詢會失敗mysql> SELECT name, address, MAX(age) FROM t GROUP BY name; ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mydb.t.address' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
發生失敗的原因是
address
是未彙總的欄位,既未在GROUP BY
欄位中命名,也未在功能上相依於這些欄位。因此,每個name
群組中列的address
值是不確定的。有多種方式可讓 MySQL 接受查詢變更資料表以使
name
成為主鍵或唯一的NOT NULL
欄位。這會讓 MySQL 判斷address
在功能上相依於name
;也就是說,address
由name
唯一決定。(如果必須允許NULL
作為有效的name
值,則此技術不適用。)使用
ANY_VALUE()
參考address
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
在此情況下,MySQL 會忽略每個
name
群組中address
值的不確定性,並接受查詢。如果您只是不在意每個群組選擇哪個未彙總欄位的值,這可能會很有用。ANY_VALUE()
不是彙總函數,不像SUM()
或COUNT()
等函數。它只會作用於抑制不確定性的測試。停用
ONLY_FULL_GROUP_BY
。這相當於使用ANY_VALUE()
並啟用ONLY_FULL_GROUP_BY
,如上一個項目所述。
如果欄位之間存在函數相依性,但 MySQL 無法判定,
ANY_VALUE()
也很有用。下列查詢有效,因為age
在功能上相依於分組欄位age-1
,但 MySQL 無法判斷,並在啟用ONLY_FULL_GROUP_BY
的情況下拒絕查詢SELECT age FROM t GROUP BY age-1;
若要讓 MySQL 接受查詢,請使用
ANY_VALUE()
SELECT ANY_VALUE(age) FROM t GROUP BY age-1;
在沒有
GROUP BY
子句的情況下,ANY_VALUE()
可用於引用彙總函數的查詢。mysql> SELECT name, MAX(age) FROM t; ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'mydb.t.name'; this is incompatible with sql_mode=only_full_group_by
沒有
GROUP BY
時,只有單一群組,且對於該群組要選擇哪個name
值是不確定的。ANY_VALUE()
會告訴 MySQL 接受該查詢。SELECT ANY_VALUE(name), MAX(age) FROM t;
可能因為特定資料集的某些屬性,您知道選取的非彙總欄實際上會函數式地依賴於
GROUP BY
欄。例如,應用程式可能會強制某個欄對於另一個欄的唯一性。在這種情況下,對於實際函數式相依的欄使用ANY_VALUE()
可能有意義。如需更多討論,請參閱第 14.19.3 節,「MySQL 的 GROUP BY 處理」。
BIN_TO_UUID(
、binary_uuid
)BIN_TO_UUID(
binary_uuid
,swap_flag
)BIN_TO_UUID()
是UUID_TO_BIN()
的反函數。它會將二進位 UUID 轉換為字串 UUID,並傳回結果。二進位值應為VARBINARY(16)
值格式的 UUID。傳回值是一個由破折號分隔的五個十六進位數字組成的字串。(有關此格式的詳細資訊,請參閱UUID()
函數的說明。)如果 UUID 引數為NULL
,則傳回值為NULL
。如果任何引數無效,則會發生錯誤。BIN_TO_UUID()
接受一或兩個引數單一引數形式接受二進位 UUID 值。假設 UUID 值沒有交換其 time-low 和 time-high 部分。字串結果與二進位引數的順序相同。
雙引數形式接受二進位 UUID 值和 swap-flag 值
如果
swap_flag
為 0,則雙引數形式等同於單一引數形式。字串結果與二進位引數的順序相同。如果
swap_flag
為 1,則假設 UUID 值已交換其 time-low 和 time-high 部分。這些部分將交換回結果值中的原始位置。
有關使用範例和時間部分交換的資訊,請參閱
UUID_TO_BIN()
函數的說明。傳回表格欄的預設值。如果欄沒有預設值,則會發生錯誤。
僅允許對於具有常值預設值的欄使用
DEFAULT(
指定具名欄的預設值,而不允許對於具有運算式預設值的欄使用。col_name
)mysql> UPDATE t SET i = DEFAULT(i)+1 WHERE id < 100;
將數字
X
格式化為類似'#,###,###.##'
的格式,四捨五入到D
個小數位數,並以字串形式傳回結果。有關詳細資訊,請參閱第 14.8 節,「字串函數和運算子」。對於包含
WITH ROLLUP
修飾符的GROUP BY
查詢,ROLLUP
運算會產生超級彙總輸出列,其中NULL
代表所有值的集合。GROUPING()
函數可讓您區分超級彙總列的NULL
值和一般分組列中的NULL
值。允許在選取清單、
HAVING
子句和ORDER BY
子句中使用GROUPING()
。GROUPING()
的每個引數都必須是一個運算式,且該運算式必須與GROUP BY
子句中的運算式完全相符。該運算式不能是位置指定符。對於每個運算式,如果目前列中的運算式值是代表超級彙總值的NULL
,則GROUPING()
會產生 1。否則,GROUPING()
會產生 0,表示該運算式值是常規結果列的NULL
,或者不是NULL
。假設表格
t1
包含下列列,其中NULL
表示類似 「其他」 或 「未知」 的內容mysql> SELECT * FROM t1; +------+-------+----------+ | name | size | quantity | +------+-------+----------+ | ball | small | 10 | | ball | large | 20 | | ball | NULL | 5 | | hoop | small | 15 | | hoop | large | 5 | | hoop | NULL | 3 | +------+-------+----------+
不含
WITH ROLLUP
的表格摘要如下mysql> SELECT name, size, SUM(quantity) AS quantity FROM t1 GROUP BY name, size; +------+-------+----------+ | name | size | quantity | +------+-------+----------+ | ball | small | 10 | | ball | large | 20 | | ball | NULL | 5 | | hoop | small | 15 | | hoop | large | 5 | | hoop | NULL | 3 | +------+-------+----------+
結果包含
NULL
值,但這些值不代表超級彙總列,因為查詢不包含WITH ROLLUP
。加入
WITH ROLLUP
會產生包含額外NULL
值的超級彙總摘要列。但是,如果不將此結果與先前的結果進行比較,則不容易看出哪些NULL
值出現在超級彙總列中,哪些出現在一般分組列中mysql> SELECT name, size, SUM(quantity) AS quantity FROM t1 GROUP BY name, size WITH ROLLUP; +------+-------+----------+ | name | size | quantity | +------+-------+----------+ | ball | NULL | 5 | | ball | large | 20 | | ball | small | 10 | | ball | NULL | 35 | | hoop | NULL | 3 | | hoop | large | 5 | | hoop | small | 15 | | hoop | NULL | 23 | | NULL | NULL | 58 | +------+-------+----------+
為了區分超級彙總列中的
NULL
值和一般分組列中的NULL
值,請使用GROUPING()
,它僅為超級彙總NULL
值傳回 1mysql> SELECT name, size, SUM(quantity) AS quantity, GROUPING(name) AS grp_name, GROUPING(size) AS grp_size FROM t1 GROUP BY name, size WITH ROLLUP; +------+-------+----------+----------+----------+ | name | size | quantity | grp_name | grp_size | +------+-------+----------+----------+----------+ | ball | NULL | 5 | 0 | 0 | | ball | large | 20 | 0 | 0 | | ball | small | 10 | 0 | 0 | | ball | NULL | 35 | 0 | 1 | | hoop | NULL | 3 | 0 | 0 | | hoop | large | 5 | 0 | 0 | | hoop | small | 15 | 0 | 0 | | hoop | NULL | 23 | 0 | 1 | | NULL | NULL | 58 | 1 | 1 | +------+-------+----------+----------+----------+
GROUPING()
的常見用途為超級彙總
NULL
值取代標籤mysql> SELECT IF(GROUPING(name) = 1, 'All items', name) AS name, IF(GROUPING(size) = 1, 'All sizes', size) AS size, SUM(quantity) AS quantity FROM t1 GROUP BY name, size WITH ROLLUP; +-----------+-----------+----------+ | name | size | quantity | +-----------+-----------+----------+ | ball | NULL | 5 | | ball | large | 20 | | ball | small | 10 | | ball | All sizes | 35 | | hoop | NULL | 3 | | hoop | large | 5 | | hoop | small | 15 | | hoop | All sizes | 23 | | All items | All sizes | 58 | +-----------+-----------+----------+
透過篩除一般分組列來僅傳回超級彙總列
mysql> SELECT name, size, SUM(quantity) AS quantity FROM t1 GROUP BY name, size WITH ROLLUP HAVING GROUPING(name) = 1 OR GROUPING(size) = 1; +------+------+----------+ | name | size | quantity | +------+------+----------+ | ball | NULL | 35 | | hoop | NULL | 23 | | NULL | NULL | 58 | +------+------+----------+
GROUPING()
允許有多個運算式引數。在這種情況下,GROUPING()
傳回值代表從每個運算式的結果組合而成的位元遮罩,其中最低位對應於最右邊運算式的結果。例如,使用三個運算式引數時,GROUPING(
的評估方式如下expr1
,expr2
,expr3
)result for GROUPING(expr3) + result for GROUPING(expr2) << 1 + result for GROUPING(expr1) << 2
下列查詢顯示單一引數的
GROUPING()
結果如何組合以產生多引數呼叫的位元遮罩值mysql> SELECT name, size, SUM(quantity) AS quantity, GROUPING(name) AS grp_name, GROUPING(size) AS grp_size, GROUPING(name, size) AS grp_all FROM t1 GROUP BY name, size WITH ROLLUP; +------+-------+----------+----------+----------+---------+ | name | size | quantity | grp_name | grp_size | grp_all | +------+-------+----------+----------+----------+---------+ | ball | NULL | 5 | 0 | 0 | 0 | | ball | large | 20 | 0 | 0 | 0 | | ball | small | 10 | 0 | 0 | 0 | | ball | NULL | 35 | 0 | 1 | 1 | | hoop | NULL | 3 | 0 | 0 | 0 | | hoop | large | 5 | 0 | 0 | 0 | | hoop | small | 15 | 0 | 0 | 0 | | hoop | NULL | 23 | 0 | 1 | 1 | | NULL | NULL | 58 | 1 | 1 | 3 | +------+-------+----------+----------+----------+---------+
使用多個運算式引數時,如果任何運算式代表超級彙總值,則
GROUPING()
傳回值為非零值。因此,透過使用單一多引數GROUPING()
呼叫,而不是多個單一引數呼叫,多引數GROUPING()
語法提供了一種更簡單的方式來寫出先前僅傳回超級彙總列的查詢mysql> SELECT name, size, SUM(quantity) AS quantity FROM t1 GROUP BY name, size WITH ROLLUP HAVING GROUPING(name, size) <> 0; +------+------+----------+ | name | size | quantity | +------+------+----------+ | ball | NULL | 35 | | hoop | NULL | 23 | | NULL | NULL | 58 | +------+------+----------+
GROUPING()
的使用受限於下列限制請勿將子查詢
GROUP BY
運算式作為GROUPING()
引數,因為比對可能會失敗。例如,此查詢的比對會失敗mysql> SELECT GROUPING((SELECT MAX(name) FROM t1)) FROM t1 GROUP BY (SELECT MAX(name) FROM t1) WITH ROLLUP; ERROR 3580 (HY000): Argument #1 of GROUPING function is not in GROUP BY
GROUP BY
常值運算式不應在HAVING
子句中用作GROUPING()
引數。由於最佳化工具評估GROUP BY
和HAVING
的時機不同,因此比對可能會成功,但GROUPING()
評估不會產生預期的結果。請考量此查詢SELECT a AS f1, 'w' AS f2 FROM t GROUP BY f1, f2 WITH ROLLUP HAVING GROUPING(f2) = 1;
對於常值常數運算式,
GROUPING()
的評估早於整個HAVING
子句,並傳回 0。若要檢查此類查詢是否受到影響,請使用EXPLAIN
,並在Extra
欄中尋找Impossible having
。
有關
WITH ROLLUP
和GROUPING()
的詳細資訊,請參閱第 14.19.2 節,「GROUP BY 修飾符」。給定 IPv4 網路位址的點分四組表示法 (以字串形式),傳回一個整數,該整數代表該位址以網路位元組順序(大端)排列的數值。
INET_ATON()
如果無法理解其引數,或者如果expr
為NULL
,則傳回NULL
。mysql> SELECT INET_ATON('10.0.5.9'); -> 167773449
對於此範例,傳回值的計算方式為 10×2563 + 0×2562 + 5×256 + 9。
對於簡短格式的 IP 位址(例如
'127.1'
作為'127.0.0.1'
的表示),INET_ATON()
可能會或可能不會傳回非NULL
的結果。因此,不應將INET_ATON()
a 用於此類位址。注意若要儲存
INET_ATON()
產生的值,請使用INT UNSIGNED
欄,而不是有符號的INT
。如果您使用有符號的欄,則無法正確儲存第一個八位元大於 127 的 IP 位址所對應的值。請參閱第 13.1.7 節,「超出範圍和溢位處理」。給定以網路位元組順序排列的數值 IPv4 網路位址,以連線字元集以字串形式傳回該位址的點分四組字串表示法。
INET_NTOA()
如果無法理解其引數,則傳回NULL
。mysql> SELECT INET_NTOA(167773449); -> '10.0.5.9'
給定 IPv6 或 IPv4 網路位址 (以字串形式),傳回一個二進位字串,該字串代表該位址以網路位元組順序(大端)排列的數值。由於數值格式的 IPv6 位址需要的位元組多於最大的整數類型,因此此函數傳回的表示法具有
VARBINARY
資料類型:IPv6 位址為VARBINARY(16)
,IPv4 位址為VARBINARY(4)
。如果引數不是有效的位址,或者引數為NULL
,則INET6_ATON()
會傳回NULL
。下列範例使用
HEX()
來以可列印的形式顯示INET6_ATON()
結果mysql> SELECT HEX(INET6_ATON('fdfe::5a55:caff:fefa:9089')); -> 'FDFE0000000000005A55CAFFFEFA9089' mysql> SELECT HEX(INET6_ATON('10.0.5.9')); -> '0A000509'
INET6_ATON()
觀察有效引數的數個限制。這些限制在下列清單中以及範例中給出。不允許尾隨區域 ID,例如
fe80::3%1
或fe80::3%eth0
。不允許使用尾隨網路遮罩,例如
2001:45f:3:ba::/64
或198.51.100.0/24
。對於代表 IPv4 位址的值,僅支援無類別位址。像
198.51.1
這樣的有類別位址會被拒絕。不允許使用尾隨埠號,例如198.51.100.2:8080
。位址組成部分中不允許使用十六進位數字,例如198.0xa0.1.2
。不支援八進位數字:198.51.010.1
會被視為198.51.10.1
,而不是198.51.8.1
。這些 IPv4 限制也適用於具有 IPv4 位址部分的 IPv6 位址,例如 IPv4 相容或 IPv4 對應位址。
若要將以數值形式表示為
INT
值的 IPv4 位址expr
轉換為以數值形式表示為VARBINARY
值的 IPv6 位址,請使用以下表示式INET6_ATON(INET_NTOA(expr))
例如
mysql> SELECT HEX(INET6_ATON(INET_NTOA(167773449))); -> '0A000509'
如果從 mysql 用戶端內調用
INET6_ATON()
,二進位字串會使用十六進位表示法顯示,具體取決於--binary-as-hex
的值。有關該選項的更多資訊,請參閱 第 6.5.1 節,「mysql — MySQL 命令列用戶端」。給定以二進位字串數值形式表示的 IPv6 或 IPv4 網路位址,會以連線字元集中的字串形式傳回該位址的字串表示。如果參數不是有效的位址,或者為
NULL
,INET6_NTOA()
會傳回NULL
。INET6_NTOA()
具有以下屬性它不會使用作業系統函式執行轉換,因此輸出字串與平台無關。
傳回字串的最大長度為 39 (4 x 8 + 7)。假設有以下陳述式
CREATE TABLE t AS SELECT INET6_NTOA(expr) AS c1;
產生的表格將具有此定義
CREATE TABLE t (c1 VARCHAR(39) CHARACTER SET utf8mb3 DEFAULT NULL);
傳回字串會對 IPv6 位址使用小寫字母。
mysql> SELECT INET6_NTOA(INET6_ATON('fdfe::5a55:caff:fefa:9089')); -> 'fdfe::5a55:caff:fefa:9089' mysql> SELECT INET6_NTOA(INET6_ATON('10.0.5.9')); -> '10.0.5.9' mysql> SELECT INET6_NTOA(UNHEX('FDFE0000000000005A55CAFFFEFA9089')); -> 'fdfe::5a55:caff:fefa:9089' mysql> SELECT INET6_NTOA(UNHEX('0A000509')); -> '10.0.5.9'
如果從 mysql 用戶端內調用
INET6_NTOA()
,二進位字串會使用十六進位表示法顯示,具體取決於--binary-as-hex
的值。有關該選項的更多資訊,請參閱 第 6.5.1 節,「mysql — MySQL 命令列用戶端」。如果參數是指定為字串的有效 IPv4 位址,則傳回 1,否則傳回 0。如果
expr
為NULL
,則傳回NULL
。mysql> SELECT IS_IPV4('10.0.5.9'), IS_IPV4('10.0.5.256'); -> 1, 0
對於給定的參數,如果
IS_IPV4()
傳回 1,INET_ATON()
(和INET6_ATON()
) 會傳回非NULL
的值。反之則不成立:在某些情況下,當IS_IPV4()
傳回 0 時,INET_ATON()
會傳回非NULL
的值。如前述說明所暗示的,對於什麼構成有效的 IPv4 位址,
IS_IPV4()
比INET_ATON()
更嚴格,因此對於需要針對無效值執行強檢查的應用程式可能很有用。或者,使用INET6_ATON()
將 IPv4 位址轉換為內部格式,並檢查NULL
結果(表示無效的位址)。在檢查 IPv4 位址方面,INET6_ATON()
與IS_IPV4()
同樣嚴格。此函式會採用以二進位字串數值形式表示的 IPv6 位址,如
INET6_ATON()
所傳回。如果參數是有效的 IPv4 相容 IPv6 位址,則傳回 1,否則傳回 0(除非expr
為NULL
,在這種情況下,函式會傳回NULL
)。IPv4 相容位址的形式為::
。ipv4_address
mysql> SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9')); -> 1 mysql> SELECT IS_IPV4_COMPAT(INET6_ATON('::ffff:10.0.5.9')); -> 0
IPv4 相容位址的 IPv4 部分也可以使用十六進位表示法表示。例如,
198.51.100.1
具有以下原始十六進位值mysql> SELECT HEX(INET6_ATON('198.51.100.1')); -> 'C6336401'
以 IPv4 相容形式表示,
::198.51.100.1
等同於::c0a8:0001
或(不含開頭的零)::c0a8:1
mysql> SELECT -> IS_IPV4_COMPAT(INET6_ATON('::198.51.100.1')), -> IS_IPV4_COMPAT(INET6_ATON('::c0a8:0001')), -> IS_IPV4_COMPAT(INET6_ATON('::c0a8:1')); -> 1, 1, 1
此函式會採用以二進位字串數值形式表示的 IPv6 位址,如
INET6_ATON()
所傳回。如果參數是有效的 IPv4 對應 IPv6 位址,則傳回 1,否則傳回 0,除非expr
為NULL
,在這種情況下,函式會傳回NULL
。IPv4 對應位址的形式為::ffff:
。ipv4_address
mysql> SELECT IS_IPV4_MAPPED(INET6_ATON('::10.0.5.9')); -> 0 mysql> SELECT IS_IPV4_MAPPED(INET6_ATON('::ffff:10.0.5.9')); -> 1
與
IS_IPV4_COMPAT()
相同,IPv4 對應位址的 IPv4 部分也可以使用十六進位表示法表示mysql> SELECT -> IS_IPV4_MAPPED(INET6_ATON('::ffff:198.51.100.1')), -> IS_IPV4_MAPPED(INET6_ATON('::ffff:c0a8:0001')), -> IS_IPV4_MAPPED(INET6_ATON('::ffff:c0a8:1')); -> 1, 1, 1
如果參數是指定為字串的有效 IPv6 位址,則傳回 1,否則傳回 0,除非
expr
為NULL
,在這種情況下,函式會傳回NULL
。此函式不會將 IPv4 位址視為有效的 IPv6 位址。mysql> SELECT IS_IPV6('10.0.5.9'), IS_IPV6('::1'); -> 0, 1
對於給定的參數,如果
IS_IPV6()
傳回 1,INET6_ATON()
會傳回非NULL
的值。如果參數是有效的字串格式 UUID,則傳回 1,如果參數不是有效的 UUID,則傳回 0,如果參數為
NULL
,則傳回NULL
。「有效」表示該值採用可剖析的格式。也就是說,它具有正確的長度,並且僅包含允許的字元(任何大小寫的十六進位數字,以及選擇性的連字號和大括號)。這種格式最常見
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
也允許使用以下其他格式
aaaaaaaabbbbccccddddeeeeeeeeeeee {aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}
有關值中各欄位的含義,請參閱
UUID()
函式說明。mysql> SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c656024db'); +-------------------------------------------------+ | IS_UUID('6ccd780c-baba-1026-9564-5b8c656024db') | +-------------------------------------------------+ | 1 | +-------------------------------------------------+ mysql> SELECT IS_UUID('6CCD780C-BABA-1026-9564-5B8C656024DB'); +-------------------------------------------------+ | IS_UUID('6CCD780C-BABA-1026-9564-5B8C656024DB') | +-------------------------------------------------+ | 1 | +-------------------------------------------------+ mysql> SELECT IS_UUID('6ccd780cbaba102695645b8c656024db'); +---------------------------------------------+ | IS_UUID('6ccd780cbaba102695645b8c656024db') | +---------------------------------------------+ | 1 | +---------------------------------------------+ mysql> SELECT IS_UUID('{6ccd780c-baba-1026-9564-5b8c656024db}'); +---------------------------------------------------+ | IS_UUID('{6ccd780c-baba-1026-9564-5b8c656024db}') | +---------------------------------------------------+ | 1 | +---------------------------------------------------+ mysql> SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c6560'); +---------------------------------------------+ | IS_UUID('6ccd780c-baba-1026-9564-5b8c6560') | +---------------------------------------------+ | 0 | +---------------------------------------------+ mysql> SELECT IS_UUID(RAND()); +-----------------+ | IS_UUID(RAND()) | +-----------------+ | 0 | +-----------------+
傳回給定的值。當用於產生結果集資料行時,
NAME_CONST()
會使資料行具有給定的名稱。參數應為常數。mysql> SELECT NAME_CONST('myname', 14); +--------+ | myname | +--------+ | 14 | +--------+
此函式僅供內部使用。當伺服器從包含對本機程式變數的參考的儲存程式寫入陳述式時,會使用它,如 第 27.8 節,「儲存程式二進位記錄」中所述。您可能會在 mysqlbinlog 的輸出中看到此函式。
對於您的應用程式,您可以使用簡單的別名來獲得與剛才範例中顯示的完全相同的結果,如下所示
mysql> SELECT 14 AS myname; +--------+ | myname | +--------+ | 14 | +--------+ 1 row in set (0.00 sec)
有關資料行別名的更多資訊,請參閱 第 15.2.13 節,「SELECT 陳述式」。
暫停(停止)
duration
參數指定的秒數,然後傳回 0。持續時間可能具有小數部分。如果參數為NULL
或負數,SLEEP()
會產生警告,或者在嚴格 SQL 模式下產生錯誤。當 sleep 正常傳回(未中斷)時,會傳回 0
mysql> SELECT SLEEP(1000); +-------------+ | SLEEP(1000) | +-------------+ | 0 | +-------------+
當
SLEEP()
是由中斷的查詢所調用的唯一內容時,它會傳回 1,並且查詢本身不會傳回錯誤。無論查詢是被終止還是逾時,都是如此此陳述式會使用來自另一個工作階段的
KILL QUERY
來中斷mysql> SELECT SLEEP(1000); +-------------+ | SLEEP(1000) | +-------------+ | 1 | +-------------+
此陳述式會因逾時而中斷
mysql> SELECT /*+ MAX_EXECUTION_TIME(1) */ SLEEP(1000); +-------------+ | SLEEP(1000) | +-------------+ | 1 | +-------------+
當
SLEEP()
只是中斷查詢的一部分時,查詢會傳回錯誤此陳述式會使用來自另一個工作階段的
KILL QUERY
來中斷mysql> SELECT 1 FROM t1 WHERE SLEEP(1000); ERROR 1317 (70100): Query execution was interrupted
此陳述式會因逾時而中斷
mysql> SELECT /*+ MAX_EXECUTION_TIME(1000) */ 1 FROM t1 WHERE SLEEP(1000); ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded
此函式對於基於陳述式的複寫是不安全的。如果當
binlog_format
設定為STATEMENT
時使用此函式,則會記錄警告。傳回根據 RFC 4122,「通用唯一 IDentifier (UUID) URN 命名空間」(http://www.ietf.org/rfc/rfc4122.txt) 產生的通用唯一識別碼 (UUID)。
UUID 被設計為在空間和時間上全域唯一的數字。即使這些呼叫是在兩個未互相連線的獨立裝置上執行,對
UUID()
的兩個呼叫也應產生兩個不同的值。警告雖然
UUID()
值旨在成為唯一的,但它們不一定無法猜測或不可預測。如果需要不可預測性,則應以其他方式產生 UUID 值。UUID()
會傳回符合 RFC 4122 中描述的 UUID 版本 1 的值。該值是 128 位元的數字,以utf8mb3
字串形式表示,由五個十六進位數字組成,格式為aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
前三個數字是從時間戳記的低、中和高位部分產生的。高位部分還包括 UUID 版本號。
第四個數字保留時間唯一性,以防時間戳記值失去單調性(例如,由於夏令時間)。
第五個數字是 IEEE 802 節點號碼,提供空間唯一性。如果後者不可用,則會替換為隨機數字(例如,因為主機裝置沒有乙太網路卡,或不知道如何在主機作業系統上尋找介面的硬體位址)。在這種情況下,無法保證空間唯一性。儘管如此,衝突的機率應該非常低。
只有在 FreeBSD、Linux 和 Windows 上才會考慮介面的 MAC 位址。在其他作業系統上,MySQL 會使用隨機產生的 48 位元數字。
mysql> SELECT UUID(); -> '6ccd780c-baba-1026-9564-5b8c656024db'
若要在字串和二進位 UUID 值之間轉換,請使用
UUID_TO_BIN()
和BIN_TO_UUID()
函式。若要檢查字串是否為有效的 UUID 值,請使用IS_UUID()
函式。此函式對於基於陳述式的複寫是不安全的。如果當
binlog_format
設定為STATEMENT
時使用此函式,則會記錄警告。傳回一個以 64 位元無號整數表示的 「short」 通用識別碼。
UUID_SHORT()
傳回的值與UUID()
函式傳回的字串格式 128 位元識別碼不同,且具有不同的唯一性屬性。UUID_SHORT()
的值在下列條件成立時保證為唯一值:目前伺服器的
server_id
值介於 0 到 255 之間,且在您的來源和副本伺服器集中是唯一的。在 mysqld 重新啟動之間,您不會將伺服器主機的系統時間往回調整。
在 mysqld 重新啟動之間,您平均每秒呼叫
UUID_SHORT()
的次數少於 1600 萬次。
UUID_SHORT()
的傳回值以下列方式建構:(server_id & 255) << 56 + (server_startup_time_in_seconds << 24) + incremented_variable++;
mysql> SELECT UUID_SHORT(); -> 92395783831158784
注意UUID_SHORT()
不適用於以陳述式為基礎的複寫。UUID_TO_BIN(
,string_uuid
)UUID_TO_BIN(
string_uuid
,swap_flag
)將字串 UUID 轉換為二進位 UUID,並傳回結果。(
IS_UUID()
函式說明列出了允許的字串 UUID 格式。) 傳回的二進位 UUID 為VARBINARY(16)
值。如果 UUID 引數為NULL
,則傳回值為NULL
。如果任何引數無效,則會發生錯誤。UUID_TO_BIN()
接受一或兩個引數:單一引數形式接受字串 UUID 值。二進位結果的順序與字串引數相同。
雙引數形式接受字串 UUID 值和旗標值:
如果
swap_flag
為 0,則雙引數形式等同於單一引數形式。二進位結果的順序與字串引數相同。如果
swap_flag
為 1,則傳回值的格式不同:時間低位和時間高位部分(分別為十六進位數字的第一組和第三組)會交換。這會將變化較快的部分移到右邊,如果結果儲存在已建立索引的欄位中,則可以提高索引效率。
時間部分交換假設使用 UUID 版本 1 的值,例如由
UUID()
函式產生的值。對於以其他方式產生且不遵循版本 1 格式的 UUID 值,時間部分交換沒有任何好處。有關版本 1 格式的詳細資訊,請參閱UUID()
函式說明。假設您有以下字串 UUID 值:
mysql> SET @uuid = '6ccd780c-baba-1026-9564-5b8c656024db';
若要將字串 UUID 轉換為具有或不具有時間部分交換的二進位 UUID,請使用
UUID_TO_BIN()
:mysql> SELECT HEX(UUID_TO_BIN(@uuid)); +----------------------------------+ | HEX(UUID_TO_BIN(@uuid)) | +----------------------------------+ | 6CCD780CBABA102695645B8C656024DB | +----------------------------------+ mysql> SELECT HEX(UUID_TO_BIN(@uuid, 0)); +----------------------------------+ | HEX(UUID_TO_BIN(@uuid, 0)) | +----------------------------------+ | 6CCD780CBABA102695645B8C656024DB | +----------------------------------+ mysql> SELECT HEX(UUID_TO_BIN(@uuid, 1)); +----------------------------------+ | HEX(UUID_TO_BIN(@uuid, 1)) | +----------------------------------+ | 1026BABA6CCD780C95645B8C656024DB | +----------------------------------+
若要將
UUID_TO_BIN()
傳回的二進位 UUID 轉換為字串 UUID,請使用BIN_TO_UUID()
。如果您呼叫UUID_TO_BIN()
並使用第二個引數 1 來交換時間部分,以產生二進位 UUID,則也應該將第二個引數 1 傳遞給BIN_TO_UUID()
,以便在將二進位 UUID 轉換回字串 UUID 時取消交換時間部分。mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid)); +--------------------------------------+ | BIN_TO_UUID(UUID_TO_BIN(@uuid)) | +--------------------------------------+ | 6ccd780c-baba-1026-9564-5b8c656024db | +--------------------------------------+ mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,0),0); +--------------------------------------+ | BIN_TO_UUID(UUID_TO_BIN(@uuid,0),0) | +--------------------------------------+ | 6ccd780c-baba-1026-9564-5b8c656024db | +--------------------------------------+ mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,1),1); +--------------------------------------+ | BIN_TO_UUID(UUID_TO_BIN(@uuid,1),1) | +--------------------------------------+ | 6ccd780c-baba-1026-9564-5b8c656024db | +--------------------------------------+
如果兩個方向轉換的時間部分交換使用方式不同,則無法正確復原原始 UUID。
mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,0),1); +--------------------------------------+ | BIN_TO_UUID(UUID_TO_BIN(@uuid,0),1) | +--------------------------------------+ | baba1026-780c-6ccd-9564-5b8c656024db | +--------------------------------------+ mysql> SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,1),0); +--------------------------------------+ | BIN_TO_UUID(UUID_TO_BIN(@uuid,1),0) | +--------------------------------------+ | 1026baba-6ccd-780c-9564-5b8c656024db | +--------------------------------------+
如果從 mysql 用戶端內呼叫
UUID_TO_BIN()
,二進位字串會使用十六進位表示法顯示,具體取決於--binary-as-hex
的值。有關該選項的詳細資訊,請參閱 第 6.5.1 節,「mysql — The MySQL Command-Line Client」。在
INSERT ... ON DUPLICATE KEY UPDATE
陳述式中,您可以在UPDATE
子句中使用VALUES(
函式來參考陳述式col_name
)INSERT
部分中的欄位值。換句話說,UPDATE
子句中的VALUES(
參考的是col_name
)col_name
的值,如果未發生重複索引鍵衝突,則會插入該值。此函式在多列插入中特別有用。VALUES()
函式僅在INSERT
陳述式的ON DUPLICATE KEY UPDATE
子句中才有意義,否則會傳回NULL
。請參閱 第 15.2.7.2 節,「INSERT ... ON DUPLICATE KEY UPDATE 陳述式」。mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
重要此用法已過時,並會在 MySQL 未來的版本中移除。請改用資料列別名或資料列與欄別名。如需詳細資訊和範例,請參閱 第 15.2.7.2 節,「INSERT ... ON DUPLICATE KEY UPDATE 陳述式」。