【问题标题】:Cannot Restore Geometry Backup MySQL 5.7 Error无法恢复几何备份 MySQL 5.7 错误
【发布时间】:2017-11-28 01:42:34
【问题描述】:

我一直在将一个网站从 Mysql 5.6 升级到 5.7。当从mysqldump 恢复备份时,在 Mysql 5.1-5.6 下已经工作了 10 年(不变),它在 MySQL 5.7 下不再工作。

具体来说,第一行几何数据恢复失败:

ERROR 1416 (22003) at line 1580 Cannot get geometry object from data you send to the GEOMETRY field

所以,这个是有效的几何体,但不再是。

尝试的补救措施:

  • 将mysqldump切换到--hex-blob
  • 在导入之前尝试使用astext( <some geometry> )
  • 累手从备份加载各种几何行,都失败了

【问题讨论】:

    标签: mysql geometry


    【解决方案1】:

    看起来MySQL 5.7 的几何类型比MySQL 5.6 更严格。因此,在 5.6 中有效的数据现在在 5.7 中无效

    这是对MySQL Bug #76337 的修复,在发布MySQL 5.7.8 中。

    在这种情况下,LINESTRING 被存储在 POINT 类型的列中。这工作了近十年,但没有更多。将列更改为类型LINESTRING 修复了上述加载错误。

    -- The Fix - run on MySQL 5.6 database before Upgrade/Export
    ALTER TABLE routes MODIFY COLUMN route_path LINESTRING;
    

    其他故障模式

    这个错误也出现在几何列上,它们能够保持 NULL 几何(但不是正式的 NULL)。 MySQL IS NULL 会说不为空,但asText( myGeo )MySQL 5.7 下返回 NULL。将这些导出到 MySQL 5.6 中的字符串返回 '',空字符串。因此,来自 5.6 的 '' 几何输出是 5.7 的无效输入。

    解决方法是取消这些。

    -- Convert NULL geometries to actual NULL's
    UPDATE myTable SET myGeo = NULL WHERE asText(myGeo) IS NULL;
    

    【讨论】:

    • 我遇到了这个问题!我就是解决不了!我什至将它缩小到 1 条记录,所以我知道它是 POINT 数据,并且我知道它不为空。
    • asText 在 5.6 上产生 'POINT(54.89731 -12.884215)',字段类型在 5.6 和 5.7 中都是 POINT。但是在 mysqldump 中发生了一些事情
    • @AntonyD'Andrea - 2 年后! ST_IsEmpty 呢。如果几何值无效,它将返回“1”,如果为空,则返回 NULL。 0 如果有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2013-03-31
    • 2019-12-05
    • 1970-01-01
    • 2013-09-03
    • 2011-05-28
    相关资源
    最近更新 更多