当前位置: 首页 > news >正文

MySQL【bug】- spatial key

【bug1】

MySQL建Spatial索引的前提条件是列定义NOT NULL,而当location列中有'GEOMETRYCOLLECTION EMPTY '的值时,这里'GEOMETRYCOLLECTION EMPTY'变相绕过了这个限制,会导致报错。

插入空集合GEOMETRYCOLLECTION EMPTY,空集合占一行空间,语义上“我知道这里该有几何,但当前没有数据”。

与 NULL 的区别

场景

存储值

ST_IsEmpty

ST_AsText

NULL

NULL

NULL

GEOMETRYCOLLECTION EMPTY

1

GEOMETRYCOLLECTION EMPTY

重建表也无法进行修复

CREATE TABLE `spatial_table` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `location` geometry NOT NULL SRID 4326, `number` varchar(20) NOT NULL DEFAULT '7425346', PRIMARY KEY (`id`), UNIQUE KEY `number` (`number`), SPATIAL KEY `location_index` (`location`) ); INSERT INTO spatial_table (id, name, location, number) VALUES (1, 'Place A', ST_GeomFromText('POINT(1 1)', 4326), '7425341'), (2, 'Place B', ST_GeomFromText('LINESTRING(1 1,2 2,3 3)', 4326), '7425342'), (3, 'Place C', ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))', 4326), '7425343'), (4, 'Place D', ST_GeomFromText('MULTIPOINT((0 0),(20 20),(60 60))', 4326), '7425344'), (5, 'Place E', ST_GeomFromText('GEOMETRYCOLLECTION(POINT(10 10),POINT(30 30),LINESTRING(15 15,20 20))', 4326), '7425345'), (6, 'Place F', ST_GeomFromText('GEOMETRYCOLLECTION(POINT(10 10),POINT(30 30),LINESTRING(15 15,20 20))', 4326), '7425348'), (7, 'Beijing', ST_GeomFromText('POINT(39.9042 116.4074)', 4326), '7425347'), (8, '<null>', ST_GeomFromText('GEOMETRYCOLLECTION EMPTY', 4326), '7425346'); SELECT id,name,st_astext(location),number From spatial_table;

解决方法:删除这些行并重建表

【bug2】

先对含SPATIAL KEY的表做过ALTER TABLE → R-tree根页指针错乱,后续UPDATE/DELETE走空间索引时找不到记录 → 报Record in index ... not found。在MySQL Server 5.7.498.0.418.4.49.2.0版本中修复。

官方文档:https://bugs.mysql.com/bug.php?id=93728

CREATE TABLE tab ( c1 INT NOT NULL PRIMARY KEY, c2 POINT NOT NULL SRID 4326, c3 LINESTRING NOT NULL SRID 4326, c4 POLYGON NOT NULL SRID 4326, c5 GEOMETRY NOT NULL SRID 4326, SPATIAL KEY idx2 (c2), SPATIAL KEY idx3 (c3), SPATIAL KEY idx4 (c4), SPATIAL KEY idx5 (c5) ) ENGINE = InnoDB; INSERT INTO tab(c1,c2,c3,c4,c5) VALUES (1, ST_GeomFromText('POINT(10 10)', 4326), ST_GeomFromText('LINESTRING(5 5,20 20,30 30)', 4326), ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))', 4326), ST_GeomFromText('POLYGON((30 30,40 40,50 50,30 50,30 40,30 30))', 4326)); INSERT INTO tab(c1,c2,c3,c4,c5) VALUES (2, ST_GeomFromText('POINT(20 20)', 4326), ST_GeomFromText('LINESTRING(20 20,30 30,40 40)', 4326), ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))', 4326), ST_GeomFromText('POLYGON((40 50,40 70,50 100,70 100,80 80,70 50,40 50))', 4326)); ALTER TABLE tab ADD COLUMN new_uniq_col INT NOT NULL AUTO_INCREMENT FIRST, ADD UNIQUE INDEX uniq_idx(new_uniq_col), DROP PRIMARY KEY; DELETE From tab;

解决方法:

  • 升级版本
  • 重建表再重新导入数据

http://www.jsqmd.com/news/222331/

相关文章:

  • 社区小店如何借助S2B2C模式实现40%营业额增长
  • vTaskDelay底层数据结构分析:图解说明任务延时链表
  • UDS 19服务实战案例:从请求到响应的完整流程
  • 开发具有视觉理解能力的AI Agent
  • 【2025最新】基于SpringBoot+Vue的大学生就业招聘系统管理系统源码+MyBatis+MySQL
  • 系统学习AUTOSAR NM模块唤醒机制的设计要点
  • L298N驱动直流电机多电源域供电方案解析
  • 前后端分离校园资料分享平台系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 掌握WinDbg Preview内存转储:新手教程快速上手指南
  • 提示工程监控预警系统的可视化设计:这5个仪表盘让问题一目了然
  • 1688价格API:批量报价功能,谈判优势!
  • 小天才USB驱动下载后无法连接?一文说清常见问题
  • SpringBoot+Vue 古典舞在线交流平台管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 基于与或非门的全加器实现:完整指南
  • RS232和RS485的区别:差分与单端传输的硬件解析
  • 前后端分离大学生就业招聘系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 互联网大厂Java面试题整理了350道(分布式+微服务+高并发)
  • 零基础掌握AUTOSAR诊断协议栈(UDS over CAN)
  • 程序员30岁前需要明白的几个人生真相!
  • CUDA高性能计算系列01:概述与GPU架构
  • cc2530构建自组织网络的协议开发详解
  • 知识生态重塑:从流量思维到共生价值的评估体系革命
  • AI全景之第十二章第三节:光子计算、量子计算与AI
  • 手把手教你识别影响USB3.1传输速度的关键因素
  • L298N四路PWM控制接口设计完整示例
  • 快速理解工控主板中大电流路径的线宽设计原则
  • CUDA高性能计算系列02:线程模型与执行配置
  • 新手必看:Proteus示波器配合8051仿真实践入门
  • 一文说清Keil5 Debug调试怎么使用于工控通信协议
  • CUDA高性能计算系列10:实战手写深度学习算子(Softmax)