文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 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.24 雜項函數

表 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 期間要使用的值

  • ANY_VALUE(arg)

    當啟用 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;也就是說,addressname 唯一決定。(如果必須允許 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)

    傳回表格欄的預設值。如果欄沒有預設值,則會發生錯誤。

    僅允許對於具有常值預設值的欄使用 DEFAULT(col_name) 指定具名欄的預設值,而不允許對於具有運算式預設值的欄使用。

    mysql> UPDATE t SET i = DEFAULT(i)+1 WHERE id < 100;
  • FORMAT(X,D)

    將數字 X 格式化為類似 '#,###,###.##' 的格式,四捨五入到 D 個小數位數,並以字串形式傳回結果。有關詳細資訊,請參閱第 14.8 節,「字串函數和運算子」

  • GROUPING(expr [, expr] ...)

    對於包含 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 值傳回 1

    mysql> 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 BYHAVING 的時機不同,因此比對可能會成功,但 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 ROLLUPGROUPING() 的詳細資訊,請參閱第 14.19.2 節,「GROUP BY 修飾符」

  • INET_ATON(expr)

    給定 IPv4 網路位址的點分四組表示法 (以字串形式),傳回一個整數,該整數代表該位址以網路位元組順序(大端)排列的數值。INET_ATON() 如果無法理解其引數,或者如果 exprNULL,則傳回 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 節,「超出範圍和溢位處理」

  • INET_NTOA(expr)

    給定以網路位元組順序排列的數值 IPv4 網路位址,以連線字元集以字串形式傳回該位址的點分四組字串表示法。INET_NTOA() 如果無法理解其引數,則傳回 NULL

    mysql> SELECT INET_NTOA(167773449);
            -> '10.0.5.9'
  • INET6_ATON(expr)

    給定 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%1fe80::3%eth0

    • 不允許使用尾隨網路遮罩,例如 2001:45f:3:ba::/64198.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 命令列用戶端」

  • INET6_NTOA(expr)

    給定以二進位字串數值形式表示的 IPv6 或 IPv4 網路位址,會以連線字元集中的字串形式傳回該位址的字串表示。如果參數不是有效的位址,或者為 NULLINET6_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 命令列用戶端」

  • IS_IPV4(expr)

    如果參數是指定為字串的有效 IPv4 位址,則傳回 1,否則傳回 0。如果 exprNULL,則傳回 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() 同樣嚴格。

  • IS_IPV4_COMPAT(expr)

    此函式會採用以二進位字串數值形式表示的 IPv6 位址,如 INET6_ATON() 所傳回。如果參數是有效的 IPv4 相容 IPv6 位址,則傳回 1,否則傳回 0(除非 exprNULL,在這種情況下,函式會傳回 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
  • IS_IPV4_MAPPED(expr)

    此函式會採用以二進位字串數值形式表示的 IPv6 位址,如 INET6_ATON() 所傳回。如果參數是有效的 IPv4 對應 IPv6 位址,則傳回 1,否則傳回 0,除非 exprNULL,在這種情況下,函式會傳回 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
  • IS_IPV6(expr)

    如果參數是指定為字串的有效 IPv6 位址,則傳回 1,否則傳回 0,除非 exprNULL,在這種情況下,函式會傳回 NULL。此函式不會將 IPv4 位址視為有效的 IPv6 位址。

    mysql> SELECT IS_IPV6('10.0.5.9'), IS_IPV6('::1');
            -> 0, 1

    對於給定的參數,如果 IS_IPV6() 傳回 1,INET6_ATON() 會傳回非 NULL 的值。

  • IS_UUID(string_uuid)

    如果參數是有效的字串格式 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(name,value)

    傳回給定的值。當用於產生結果集資料行時,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 陳述式」

  • SLEEP(duration)

    暫停(停止)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 時使用此函式,則會記錄警告。

  • UUID()

    傳回根據 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 時使用此函式,則會記錄警告。

  • UUID_SHORT()

    傳回一個以 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」

  • VALUES(col_name)

    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 陳述式」