使用--hex-blob导出MySQL仍遇GEOMETRY字段导入错误求助
分析MySQL 5.6导出到5.7后Geometry字段的问题
我来帮你拆解下你遇到的这个问题,结合你给出的查询和操作结果,咱们一步步梳理:
为什么导入报错但记录都存在?
你用mysqldump --hex-blob导出是正确的操作(这个参数确实能把二进制类型的字段转成十六进制文本导出,避免传输或导入时的二进制损坏),但MySQL 5.7对空间数据(Geometry类型)的验证比5.6严格很多:
- 5.6可能允许存储一些不符合OGC规范的WKB(Well-Known Binary)格式数据
- 5.7导入时会校验这些数据的有效性,所以会抛出
Cannot get geometry object from data you send to the GEOMETRY field错误 - 但因为你用了重定向导入(
mysql database < dump.sql),默认是继续执行后续语句的,所以所有记录还是被写入了库中,只是那些无效的Geometry数据无法被5.7的空间函数识别
关于Geometry显示为二进制是否正常?
正常情况下,MySQL的Geometry字段本身就是以WKB二进制格式存储的,但能被空间函数正常解析:
- 如果执行
AsText(location)能返回可读的WKT(Well-Known Text)格式(比如POINT(116.397 39.908)),那就是正常的 - 你查询到
AsText(location) IS NULL有45K条记录,说明这些二进制数据是无效的WKB,无法被解析成空间对象,这显然是不正常的
为什么UPDATE语句没生效?
你执行的UPDATE listingsaws SET location = NULL WHERE ST_IsEmpty(location) IS NULL;没更新任何记录,原因是:
- 当
location是无效的空间数据时,ST_IsEmpty()会返回NULL,但MySQL在执行UPDATE时,对于无效的空间数据可能会跳过这类条件判断(或者说,无法对无效数据执行空间函数判断,导致条件不匹配) - 换个思路,直接通过
AsText()的结果来筛选,或者结合ST_IsValid()函数(判断是否为有效的空间对象):
这个语句应该能把那些无效的Geometry数据批量设为NULLUPDATE listingsaws SET `location` = NULL WHERE AsText(`location`) IS NULL OR NOT ST_IsValid(`location`);
后续的修复建议
- 重新导出时增加兼容性参数:如果还能从5.6源库导出,加上
--compatible=mysql56参数,让导出的数据更兼容5.7的校验规则:mysqldump --hex-blob --compatible=mysql56 -u user -p database > dump.sql - 清理现有无效数据:用上面提到的UPDATE语句把无效的Geometry字段设为NULL,避免后续查询或操作报错
- 验证数据有效性:清理后,执行以下语句确认有效数据:
-- 统计有效Geometry记录数 SELECT COUNT(*) FROM listingsaws WHERE ST_IsValid(`location`) = 1; -- 查看一条有效数据的文本格式 SELECT AsText(`location`) FROM listingsaws WHERE ST_IsValid(`location`) = 1 LIMIT 1;
内容的提问来源于stack exchange,提问作者somejkuser
相关产品推荐
相关产品推荐

