MySQL 9.0 參考手冊  /  一般資訊  /  MySQL 9.0 的新功能

1.4 MySQL 9.0 的新功能

本節總結了自 MySQL 8.4 以來,MySQL 9.0 中新增、棄用、變更和移除的功能。相關章節列出了 MySQL 伺服器選項和變數,這些選項和變數已在 MySQL 9.0 中新增、棄用或移除;請參閱 第 1.5 節,「自 8.4 以來,MySQL 9.0 中新增、棄用或移除的伺服器與狀態變數和選項」

MySQL 9.0 中新增或變更的功能

以下功能已新增至 MySQL 9.0

  • JavaScript 儲存程式。 MySQL 企業版現在包含對以 JavaScript 編寫的儲存程式的支援,例如使用 CREATE FUNCTION 陳述式和此處顯示的 JavaScript 程式碼建立的簡單範例

    CREATE FUNCTION gcd(a INT, b INT) 
    RETURNS INT 
    NO SQL 
    LANGUAGE JAVASCRIPT AS
      $mle$
        let x = Math.abs(a)
        let y = Math.abs(b)
        while(y) {
          var t = y
          y = x % y
          x = t
        }
        return x
      $mle$
    ;

    請參閱 第 27.3.1 節,「JavaScript 儲存程式的建立與管理」,其中說明了 JavaScript 儲存程式的建立和執行的基本知識。

    支援以 JavaScript 編寫的儲存程序和儲存函數,並由多語系引擎元件 (MLE) 提供。有關判斷您的發行版本是否包含此元件以及啟用它的詳細資訊,請參閱 第 7.5.6 節,「多語系引擎元件 (MLE)」

    MySQL 中的 JavaScript 語言支援符合 ECMAScript 2023 規格,且預設使用嚴格模式。嚴格模式無法停用。此實作包含所有標準 ECMAScript 程式庫物件,例如 ObjectFunctionMathDateString 等。console.log()console.error() 也支援 (請參閱 第 27.3.9 節,「JavaScript 儲存程式範例」)。

    大多數 MySQL 資料類型都支援用於 JavaScript 儲存程式輸入和輸出引數,以及傳回資料類型。字串必須使用 utf8mb4 字元集。支援 MySQL BLOBTEXT 類型,以及許多 MySQL 時間類型。也支援 JSONVECTOR 類型不受 MLE 元件或 JavaScript 儲存程式支援。如需詳細資訊,請參閱 第 27.3.4 節,「JavaScript 儲存程式資料類型與引數處理」,以及 第 27.3.8 節,「JavaScript 儲存程式限制與約束」

    以 JavaScript 編寫的儲存程式支援一個 API,用於執行和擷取 SQL 陳述式的結果,該 API 由 MLE 元件提供。如需詳細資訊,請參閱 第 27.3.6 節,「JavaScript SQL API」,以及 第 27.3.7 節,「使用 JavaScript SQL API」。JavaScript 儲存程式也支援預備陳述式;請參閱 第 27.3.7.2 節,「預備陳述式」

    MLE 元件提供許多工作階段資訊和管理功能,包括 mle_session_state()mle_session_reset()第 7.5.6.1 節,「MLE 元件選項和變數參考」,以及 第 7.5.6.2 節,「MLE 元件狀態與工作階段資訊」,提供有關 MLE 組態選項和狀態變數的資訊;另請參閱 第 27.3.5 節,「JavaScript 儲存程式—工作階段資訊與選項」

    如需有關 JavaScript 儲存程式的一般資訊,請參閱 第 27.3 節,「JavaScript 儲存程式」

  • VECTOR 類型支援。 MySQL 9.0 支援 VECTOR 資料行類型。向量是一種資料結構,由一個項目清單 (4 位元組浮點值) 組成,可以表示為二進位字串值或清單格式的字串。VECTOR 資料行的宣告具有最大長度或項目數 (括號中);預設值為 2048,最大值為 16383。

    您可以使用 CREATE TABLE 建立具有 VECTOR 資料行的 InnoDB 資料表,如下所示

    mysql> CREATE TABLE v1 (c1 VECTOR(5000));
    Query OK, 0 rows affected (0.03 sec)

    向量資料行受到限制,其中一些限制在此處列出

    • VECTOR 資料行不能用作任何類型的索引鍵。這包括主索引鍵、外索引鍵、唯一索引鍵和分割索引鍵。

    • 某些類型的 MySQL 函數和運算子不接受向量作為引數。這些包括但不限於數值函數和運算子、時間函數、全文檢索函數、XML 函數、位元函數和 JSON 函數。

      向量可以與某些但不是全部字串和加密函數一起使用。有關這些函數的更完整資訊,請參閱 支援和不支援的 VECTOR 函數

    • VECTOR 無法與任何其他類型進行比較,並且只能與另一個 VECTOR 進行相等性比較。

    • 目前 NDB 資料表不支援 VECTOR 資料行。

    VECTOR_DIM() (也在 MySQL 9.0 中新增) 會傳回向量的長度。提供函數以在表示法之間轉換。STRING_TO_VECTOR() (別名:TO_VECTOR()) 採用向量的清單格式表示法,並傳回二進位字串表示法;VECTOR_TO_STRING() (別名:FROM_VECTOR()) 執行反向操作,如下所示

    mysql> SELECT STRING_TO_VECTOR('[2, 3, 5, 7]');
    +------------------------------------------------------+
    | TO_VECTOR('[2, 3, 5, 7]')                            |
    +------------------------------------------------------+
    | 0x00000040000040400000A0400000E040                   |
    +------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT VECTOR_TO_STRING(0x00000040000040400000A0400000E040);
    +------------------------------------------------------+
    | VECTOR_TO_STRING(0x00000040000040400000A0400000E040) |
    +------------------------------------------------------+
    | [2.00000e+00,3.00000e+00,5.00000e+00,7.00000e+00]    |
    +------------------------------------------------------+
    1 row in set (0.00 sec)

    如需詳細資訊和範例,請參閱 第 13.3.5 節,「VECTOR 類型」,以及 第 14.21 節,「向量函數」

  • 內嵌和隱式外索引鍵約束。 MySQL 現在強制執行內嵌外索引鍵規格,這些規格先前被剖析器接受,但被忽略。MySQL 9.0 也接受對父資料表主索引鍵資料行的隱式參考。

    考慮由以下陳述式建立的父資料表 person

    CREATE TABLE person (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        name CHAR(60) NOT NULL
    );

    若要建立在 person 上具有外索引鍵 owner 的資料表 shirt,MySQL 現在會根據標準接受並正確處理此處顯示的任何 CREATE TABLE 陳述式

    CREATE TABLE shirt (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        style ENUM('tee', 'polo', 'dress') NOT NULL,
        color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
        owner SMALLINT UNSIGNED NOT NULL,
        
        FOREIGN KEY (owner) REFERENCES person (id)
    );
    
    CREATE TABLE shirt (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        style ENUM('tee', 'polo', 'dress') NOT NULL,
        color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
        owner SMALLINT UNSIGNED NOT NULL,
        
        FOREIGN KEY (owner) REFERENCES person
    );
    
    CREATE TABLE shirt (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        style ENUM('tee', 'polo', 'dress') NOT NULL,
        color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
        owner SMALLINT UNSIGNED NOT NULL REFERENCES person (id)
    );
    
    CREATE TABLE shirt (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        style ENUM('tee', 'polo', 'dress') NOT NULL,
        color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
        owner SMALLINT UNSIGNED NOT NULL REFERENCES person
    );

    在先前的 MySQL 版本中,只有剛才顯示的語句中的第一條語句具有建立外鍵的效果。

    更多資訊,請參閱第 15.1.20.5 節「外鍵約束」

  • 儲存來自 EXPLAIN ANALYZE INTO 的 JSON 輸出。 現在支援使用此處顯示的語法,將來自 EXPLAIN ANALYZEJSON 輸出儲存到使用者變數中。

    EXPLAIN ANALYZE FORMAT=JSON INTO @variable select_stmt

    該變數隨後可用作任何 MySQL JSON 函數的 JSON 引數(請參閱第 14.17 節「JSON 函數」)。INTO 子句僅在 FORMAT=JSON 時支援;必須明確指定 FORMAT。此形式的 EXPLAIN ANALYZE 也支援選用的 FOR SCHEMAFOR DATABASE 子句。

    注意

    只有在將伺服器系統變數 explain_json_format_version 設定為 2 時,此功能才可用;否則,嘗試使用它會引發 ER_EXPLAIN_ANALYZE_JSON_FORMAT_VERSION_NOT_SUPPORTED 錯誤(EXPLAIN ANALYZE 不支援 explain_json_format_version=1 時的 FORMAT=JSON)。

    有關其他資訊和範例,請參閱取得執行計畫資訊

  • 預備語句中的事件 DDL。從 MySQL 9.0.0 開始,可以預備以下語句:

    這些語句不支援位置參數(? 預留位置);您必須從字串文字、系統變數和使用者變數的某種組合中組裝要預備的語句文字。實現可重複使用的方式之一是在預存程序的主體中組裝例如 CREATE EVENT 語句的文字,將語句的任何可變部分作為 IN 參數傳遞給預存程序;使用 PREPARE 預備組裝的文字;使用所需的參數值叫用程序。有關更多資訊,請參閱 PREPARE、EXECUTE 和 DEALLOCATE PREPARE 語句以及預備語句中允許的 SQL 語法。有關範例,請參閱第 15.1.13 節「CREATE EVENT 語句」

  • 效能架構系統變數表。MySQL 9.0 在效能架構中新增了兩個新表,提供有關伺服器系統變數的資訊。這些表在此處列出:

    • variables_metadata 表提供有關系統變數的一般資訊。此資訊包括 MySQL 伺服器識別的每個系統變數的名稱、範圍、類型、範圍(如果適用)和說明。

      此表中的兩個欄位(MIN_VALUEMAX_VALUE)旨在取代variables_info 表中已棄用的欄位。

    • global_variable_attributes 表提供有關伺服器指派給全域系統變數的屬性-值配對的資訊。

    更多資訊,請參閱第 29.12.14 節「效能架構系統變數表」

MySQL 9.0 中已棄用的功能

以下功能在 MySQL 9.0 中已棄用,並可能在未來的系列中移除。如果顯示替代方案,應更新應用程式以使用它們。

對於使用 MySQL 9.0 中已棄用但在較新 MySQL 版本中已移除的功能的應用程式,當從 MySQL 9.0 來源複製到執行較新版本的複本時,語句可能會失敗,或者可能在來源和複本上產生不同的效果。為了避免這些問題,應修訂使用 9.0 中已棄用功能的應用程式,以避免使用它們並在可能時使用替代方案。

  • 效能架構 variables_info 表欄位。效能架構 variables_info 表的 MIN_VALUEMAX_VALUE 欄位現在已棄用,並可能在未來的 MySQL 版本中移除。相反地,請使用具有相同名稱的 variables_metadata 表的欄位(請參閱MySQL 9.0 中新增或變更的功能)。

  • 更新交易式和非交易式表的交易。MySQL 9.0.0 棄用了更新交易式表以及非交易式或不可組合表的交易。現在,這樣的交易會導致將棄用警告寫入到用戶端和錯誤記錄檔。只有 InnoDBBLACKHOLE 儲存引擎是交易式且可組合的(NDBCLUSTER 是交易式但不可組合的)。這表示只有此處顯示的儲存引擎組合才會不會引發棄用警告:

    • InnoDBBLACKHOLE

    • MyISAMMerge

    • performance_schema 和任何其他儲存引擎

    • TempTable 和任何其他儲存引擎

    更多資訊,請參閱第 19.5.1.36 節「複製和交易」

MySQL 9.0 中移除的功能

以下項目已過時,並已在 MySQL 9.0 中移除。如果顯示替代方案,應更新應用程式以使用它們。

對於使用 MySQL 9.0 中移除的功能的 MySQL 8.4 應用程式,當從 MySQL 8.4 來源複製到 MySQL 9.0 複本時,語句可能會失敗,或者可能在來源和複本上產生不同的效果。為了避免這些問題,應修訂使用 MySQL 9.0 中移除功能的應用程式,以避免使用它們並在可能時使用替代方案。

  • mysql_native_password 外掛程式。MySQL 8.0 中已棄用的 mysql_native_password 驗證外掛程式已移除。伺服器現在會拒絕來自不具備 CLIENT_PLUGIN_AUTH 功能的舊版用戶端程式的 mysql_native 驗證請求。

    由於此變更,也已移除以下伺服器選項和變數:

    • --mysql-native-password 伺服器選項

    • --mysql-native-password-proxy-users 伺服器選項

    • default_authentication_plugin 伺服器系統變數

    為了回溯相容性,mysql_native_password 在用戶端上仍然可用,以便 MySQL 9.0 用戶端程式可以連線到較舊版本的 MySQL 伺服器。在 MySQL 9.0 中,內建於先前版本用戶端程式的 MySQL 原生驗證外掛程式已轉換為必須在執行時載入的外掛程式。

    更多資訊,請參閱第 8.4.1 節「驗證外掛程式」