本页面介绍了如何将 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 位数字空间中均匀分布。您可以使用这些数字来避免热点问题。
如需了解详情,请参阅主键默认值策略。