從 MySQL 遷移結構定義總覽

本頁說明如何將 MySQL 結構定義遷移至 Spanner 結構定義。建議使用 Spanner 遷移工具,從現有的 MySQL 結構定義建構 Spanner 結構定義。這項工具會將大部分的 MySQL 資料類型對應至 Spanner 類型,並醒目顯示選項和提供建議,避免發生潛在的遷移問題。

資料類型比較

將下列 MySQL 資料類型對應至 Spanner 等價類型:

MySQL 資料類型 Spanner 等價資料類型 附註
INTEGER, INT, BIGINT, MEDIUMINT, SMALLINT, TINYINT INT64
TINYINTBOOLBOOLEAN BOOLEAN TINYINT(1) 值用於表示「true」(非零) 或「false」(0) 的布林值。
BIT BOOLEANINT64
CHAR, VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT STRING Spanner 一律使用 Unicode UTF8 字串,且無法設定排序規則。
VARCHAR 支援的最大長度為 65,535 個位元組,Spanner 則最多支援 2,621,440 個字元。
FLOAT FLOAT32
DOUBLE FLOAT64
DECIMALNUMERIC NUMERIC 在 MySQL 中,NUMERICDECIMAL 資料類型最多支援總共 65 位有效位數和小數位數,如欄位宣告中所定義。Spanner NUMERIC 資料類型最多支援 38 位精確度,包含小數點後 9 位數。
如需更高的精確度,請參閱「儲存任意精確度數值資料」,瞭解替代機制。
BINARY, VARBINARY, TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB BYTES 小型物件 (小於 10 MiB) 可儲存為 BYTES。請考慮使用其他 Google Cloud 產品 (例如 Cloud Storage) 來儲存較大型的物件。
DATE DATE Spanner 和 MySQL 都使用「yyyy-mm-dd」日期格式,因此不需要進行轉換。提供 SQL 函式,將日期轉換為格式化字串。
DATETIMETIMESTAMP TIMESTAMP Spanner 儲存與時區無關的時間。因此您必須儲存時區,則必須使用單獨的 STRING 列。提供 SQL 函式,使用時區將時間戳記轉換為格式化字串。
TEXTTINYTEXTENUM STRING 小型 TEXT 值 (小於 10 MiB) 可儲存為 STRING。請考慮使用其他 Google Cloud 產品 (例如 Cloud Storage) 來支援大型 TEXT 值。
ENUM STRING ENUM 值的驗證必須在應用程式中執行。
SET ARRAY<STRING> SET 元素值的驗證必須在應用程式中執行。
LONGBLOBMEDIUMBLOB 包含物件 URI 的 BYTESSTRING 小型物件 (小於 10 MiB) 可儲存為 BYTES。請考慮使用其他 Google Cloud 產品 (例如 Cloud Storage) 來儲存較大型的物件。
LONGTEXTMEDIUMTEXT STRING (包含資料或指向外部物件的 URI) 小型物件 (少於 2,621,440 個字元) 可儲存為 STRING。請考慮使用其他 Google Cloud 產品 (例如 Cloud Storage) 來儲存較大型的物件。
JSON JSON 小型 JSON 字串 (少於 2,621,440 個字元) 可儲存為 JSON。請考慮使用其他 Google Cloud 產品 (例如 Cloud Storage) 來儲存較大型的物件。
GEOMETRY, POINT, LINESTRING, POLYGON, MULTIPOINT, MULTIPOLYGON, GEOMETRYCOLLECTION STRING, ARRAY Spanner 不支援地理空間資料類型。您必須使用標準資料類型儲存此資料,並在應用程式中實作任何搜尋或篩選邏輯。

在許多情況下,多個 MySQL 型別會對應至單一 Spanner 型別。這是因為 MySQL 針對相同概念有一組類型,但長度限制不同,而 Spanner 則有一個整體類型,且限制相對較大。

請見以下範例:

  • MySQL 有 TEXTTINYTEXTMEDIUMTEXTLONGTEXT。在 Spanner 中,只有一種型別 STRING,且字元長度參數可設為任何值,最多 2,621,440 個字元。

  • MySQL 具有 INTEGERINTBIGINTMEDIUMINTSMALLINTTINYINT。 Spanner 只有一種 INT64 類型,可儲存 8 位元組的帶正負號整數值。主要差異在於,Spanner 的 INT64MEDIUMINTSMALLINTTINYINT 消耗更多儲存空間。此外,INT64 不會擷取 MEDIUMINTSMALLINTTINYINT 的範圍限制,但可透過新增 CHECK 限制來強制執行這些限制。

Spanner 不支援地理空間類型。您可以將這些類型的值編碼為字串、位元組或陣列,然後儲存。所有篩選、作業和函式都必須在應用程式層級執行。

查詢

Spanner 使用附擴充功能的 ANSI 2011 SQL 方言,而且擁有許多函式和運算子,以協助翻譯及匯總您的資料。任何使用 MySQL 特定方言、函式和類型的 SQL 查詢都需要轉換,使之與 Spanner 相容。

雖然 Spanner 不支援以結構化資料做為欄定義,但 SQL 查詢中可以利用 ARRAY<>STRUCT<> 類型,而使用結構化資料。例如,您可以撰寫查詢,在單一查詢中使用 ARRAYSTRUCT (利用預先彙整的資料),傳回某位演出者的所有專輯。詳情請參閱說明文件的子查詢一節。

您可以在 Google Cloud 控制台的 Spanner Studio 頁面執行 SQL 查詢。對大型資料表進行全資料表掃描的查詢通常非常昂貴,應該謹慎使用。如要進一步瞭解如何最佳化 SQL 查詢,請參閱 SQL 最佳做法說明文件。

內儲程序和觸發條件

Spanner 不支援在資料庫層級執行使用者程式碼。在遷移結構定義時,請將您在 MySQL 資料庫層級實作的內儲程序和企業邏輯觸發條件移至應用程式。

序列

Spanner 建議使用 UUID 第 4 版做為產生主鍵值的預設方法。GENERATE_UUID() 函式會傳回以 STRING 型別表示的 UUID 第 4 版值。

如要產生整數值,Spanner 支援位元反轉正序,可產生平均分布於正 64 位元數字空間的值。你可以使用這些數字,避免熱點問題。

詳情請參閱主鍵預設值策略

後續步驟