本页面介绍了如何将 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 支持的长度上限为 65535 字节,而 Spanner 最多支持 2621440 个字符。
|
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 。如需支持较大的 TEXT 值,建议使用替代性 Google Cloud 产品(如 Cloud Storage)。
|
ENUM |
STRING |
必须在应用中对 ENUM 值执行验证。 |
SET |
ARRAY<STRING> |
必须在应用中对 SET 元素值执行验证。 |
LONGBLOB 、MEDIUMBLOB |
BYTES 或 STRING (包含对象的 URI)。
|
小型对象(小于 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 字节有符号整数值。主要区别在于,与MEDIUMINT
、SMALLINT
和TINYINT
相比,Spanner 的INT64
会消耗更多存储空间。此外,INT64
不会捕获MEDIUMINT
、SMALLINT
和TINYINT
的范围限制,不过可以通过添加CHECK
限制条件来强制执行这些限制。
Spanner 不支持地理空间类型。您可以通过将这些类型的值编码为字符串、字节或数组来存储它们。任何过滤、操作和函数都必须在应用级执行。
查询
Spanner 采用 ANSI 2011 扩展版 SQL 方言,并提供了许多有助于转换和聚合数据的函数和运算符。对于使用 MySQL 专用的方言、函数和类型的任何 SQL 查询,都需要进行转换才能与 Spanner 兼容。
不支持使用结构化数据作为列定义,但您可以在 SQL 查询中通过 ARRAY<>
和 STRUCT<>
类型来使用结构化数据。例如,您可以使用由 STRUCT
组成的 ARRAY
(利用预联接的数据)编写一个返回艺术家的所有专辑的查询。如需了解详情,请参阅文档的子查询部分。
您可以在 Google Cloud 控制台中的 Spanner Studio 页面上运行 SQL 查询。对大型表执行全表扫描时,查询费用通常很高,因此应谨慎使用。如需详细了解如何优化 SQL 查询,请参阅 SQL 最佳实践文档。
存储过程和触发器
Spanner 不支持在数据库级运行用户代码。在架构迁移过程中,请将您在 MySQL 数据库级实现的存储过程和业务逻辑触发器迁移到应用中。
序列
Spanner 建议使用 UUID 版本 4 作为生成主键值的默认方法。GENERATE_UUID()
函数会返回以 STRING
类型表示的 UUID 版本 4 值。
如果您需要生成整数值,Spanner 支持位反转正值序列,这类序列生成的值在正 64 位数字空间中均匀分布。您可以使用这些数字来避免热点问题。
如需了解详情,请参阅主键默认值策略。