本頁說明如何將 MySQL 結構定義遷移至 Spanner 結構定義。建議使用 Spanner 遷移工具,從現有的 MySQL 結構定義建構 Spanner 結構定義。這項工具會將大部分的 MySQL 資料類型對應至 Spanner 類型,並醒目顯示選項和提供建議,避免發生潛在的遷移問題。
資料類型比較
將下列 MySQL 資料類型對應至 Spanner 等價類型:
MySQL 資料類型 | Spanner 等價資料類型 | 附註 |
---|---|---|
INTEGER ,
INT ,
BIGINT ,
MEDIUMINT ,
SMALLINT ,
TINYINT
|
INT64 |
|
TINYINT 、
BOOL 、
BOOLEAN 、
|
BOOLEAN |
TINYINT(1) 值用於表示「true」(非零) 或「false」(0) 的布林值。 |
BIT
|
BOOLEAN 、INT64 |
|
CHAR ,
VARCHAR ,
TINYTEXT ,
TEXT ,
MEDIUMTEXT ,
LONGTEXT
|
STRING |
Spanner 一律使用 Unicode UTF8 字串,且無法設定排序規則。VARCHAR 支援的最大長度為 65,535 個位元組,Spanner 則最多支援 2,621,440 個字元。
|
FLOAT |
FLOAT32 |
|
DOUBLE |
FLOAT64 |
|
DECIMAL 、NUMERIC |
NUMERIC
|
在 MySQL 中,NUMERIC 和 DECIMAL 資料類型最多支援總共 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 函式,將日期轉換為格式化字串。 |
DATETIME 、TIMESTAMP |
TIMESTAMP |
Spanner 儲存與時區無關的時間。因此您必須儲存時區,則必須使用單獨的 STRING 列。提供 SQL 函式,使用時區將時間戳記轉換為格式化字串。 |
TEXT 、TINYTEXT 、ENUM |
STRING |
小型 TEXT 值 (小於 10 MiB) 可儲存為 STRING 。請考慮使用其他 Google Cloud 產品 (例如 Cloud Storage) 來支援大型 TEXT 值。
|
ENUM |
STRING |
ENUM 值的驗證必須在應用程式中執行。 |
SET |
ARRAY<STRING> |
SET 元素值的驗證必須在應用程式中執行。 |
LONGBLOB 、MEDIUMBLOB |
包含物件 URI 的 BYTES 或 STRING 。
|
小型物件 (小於 10 MiB) 可儲存為 BYTES 。請考慮使用其他 Google Cloud 產品 (例如 Cloud Storage) 來儲存較大型的物件。
|
LONGTEXT 、MEDIUMTEXT |
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 有
TEXT
、TINYTEXT
、MEDIUMTEXT
、LONGTEXT
。在 Spanner 中,只有一種型別STRING
,且字元長度參數可設為任何值,最多 2,621,440 個字元。MySQL 具有
INTEGER
、INT
、BIGINT
、MEDIUMINT
、SMALLINT
和TINYINT
。 Spanner 只有一種INT64
類型,可儲存 8 位元組的帶正負號整數值。主要差異在於,Spanner 的INT64
比MEDIUMINT
、SMALLINT
和TINYINT
消耗更多儲存空間。此外,INT64
不會擷取MEDIUMINT
、SMALLINT
和TINYINT
的範圍限制,但可透過新增CHECK
限制來強制執行這些限制。
Spanner 不支援地理空間類型。您可以將這些類型的值編碼為字串、位元組或陣列,然後儲存。所有篩選、作業和函式都必須在應用程式層級執行。
查詢
Spanner 使用附擴充功能的 ANSI 2011 SQL 方言,而且擁有許多函式和運算子,以協助翻譯及匯總您的資料。任何使用 MySQL 特定方言、函式和類型的 SQL 查詢都需要轉換,使之與 Spanner 相容。
雖然 Spanner 不支援以結構化資料做為欄定義,但 SQL 查詢中可以利用 ARRAY<>
和 STRUCT<>
類型,而使用結構化資料。例如,您可以撰寫查詢,在單一查詢中使用 ARRAY
的 STRUCT
(利用預先彙整的資料),傳回某位演出者的所有專輯。詳情請參閱說明文件的子查詢一節。
您可以在 Google Cloud 控制台的 Spanner Studio 頁面執行 SQL 查詢。對大型資料表進行全資料表掃描的查詢通常非常昂貴,應該謹慎使用。如要進一步瞭解如何最佳化 SQL 查詢,請參閱 SQL 最佳做法說明文件。
內儲程序和觸發條件
Spanner 不支援在資料庫層級執行使用者程式碼。在遷移結構定義時,請將您在 MySQL 資料庫層級實作的內儲程序和企業邏輯觸發條件移至應用程式。
序列
Spanner 建議使用 UUID 第 4 版做為產生主鍵值的預設方法。GENERATE_UUID()
函式會傳回以 STRING
型別表示的 UUID 第 4 版值。
如要產生整數值,Spanner 支援位元反轉正序,可產生平均分布於正 64 位元數字空間的值。你可以使用這些數字,避免熱點問題。
詳情請參閱主鍵預設值策略。