mysql 8.0版本 error 3516 ;error 3618
mysql 5.7 执行结果:
【
CREATE TABLE student (id int,name varchar(255),address varchar(255),wkt geometry not null);
alter table student add SPATIAL INDEX spidx(wkt);
INSERT INTO student VALUES (1, '张', '李家隔壁', st_geomfromtext('POINT(0 0)'));
INSERT INTO student VALUES (2, '李', '张家隔壁', st_geomfromtext('POINT(1 1)'));
mysql> SELECT id,name,st_astext(wkt),st_isvalid(wkt),st_x(wkt),st_y(wkt),st_centroid(wkt),st_area(wkt),st_length(wkt) FROM student;
+----+--------+----------------+-----------------+-----------+-----------+------------------------------------------------------+--------------+----------------+
| id | name | st_astext(wkt) | st_isvalid(wkt) | st_x(wkt) | st_y(wkt) | st_centroid(wkt) | st_area(wkt) | st_length(wkt) |
+----+--------+----------------+-----------------+-----------+-----------+------------------------------------------------------+--------------+----------------+
| 1 | 张 | POINT(0 0) | 1 | 0 | 0 | 0x00000000010100000000000000000000000000000000000000 | 0 | NULL |
| 2 | 李 | POINT(1 1) | 1 | 1 | 1 | 0x000000000101000000000000000000F03F000000000000F03F | 0 | NULL |
+----+--------+----------------+-----------------+-----------+-----------+------------------------------------------------------+--------------+----------------+
2 rows in set (0.00 sec)
】
MySQL 8.0 执行在函数st_centroid(wkt)、st_area(wkt) 报错。
点类型数据使用函数 st_area 报错:ERROR 3516 (HY000): POLYGON/MULTIPOLYGON value is a geometry of unexpected type POINT in st_area.
使用函数 st_centroid 报错:ERROR 3618 (HY000): st_centroid(POINT) has not been implemented for geographic spatial reference systems.
问题原因:MySQL 5.7 与MySQL 8.0 的区别
报错在MySQL8.0 版本环境上,8.0 对于函数的使用更加严格,官方文档中给出了相关的描述:
st_centroid:如果几何图形具有地理空间参考系统(SRS)的SRID值,则会出现ER_NOT_IMPLEMENTED_for_geographic_SRS错误。
st_area:如果几何体有效,但不是多边形或多多边形对象,则会出现ER_UNEXPECTED_geometry_TYPE错误。
详细描述:
ST_Centroid()处理其参数,但有以下例外:
对于参数为空几何集合的附加条件,返回值为NULL。
如果几何图形具有地理空间参考系统(SRS)的SRID值,则会出现ER_NOT_IMPLEMENTED_for_geographic_SRS错误。
从MySQL 8.0.13开始,ST_Area()处理其参数,但有以下例外:
如果几何图形在几何上无效,则结果是未定义的区域(也就是说,它可以是任何数字),或者出现错误。
如果几何体有效,但不是多边形或多多边形对象,则会出现ER_UNEXPECTED_geometry_TYPE错误。
如果几何体是笛卡尔SRS中的有效多边形,则结果是多边形的笛卡尔面积。
如果几何体是笛卡尔SRS中的有效多重多边形,则结果是多边形的笛卡尔面积之和。
如果几何图形是地理SRS中的有效多边形,则结果是该SRS中多边形的大地测量面积,单位为平方米。
如果几何图形是地理SRS中的有效多多边形,则结果是该SRS中多边形的大地测量面积之和,单位为平方米。
如果面积计算结果为+inf,则会出现ER_DATA_OUT_OF_RANGE错误。
如果几何图形的地理SRS的经度或纬度超出范围,则会发生错误:
如果经度值不在范围内(−180,180]时,会出现ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE错误(MySQL 8.0.12之前的ER_LONGIUTDE_OUT_OF_RANGE)。
如果纬度值不在范围内[−90,90],出现ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE错误(在MySQL 8.0.12之前的ER_LATITUDE_OUT_FO_RANGE)。
显示的范围以度为单位。由于浮点运算,精确范围限制略有偏差。
在MySQL 8.0.13之前,ST_Area()处理其参数,但有以下例外:
对于维度为0或1的参数,结果为0。
如果几何图形为空,则返回值为0而不是NULL。
对于几何图形集合,结果是所有组件的面积值之和。如果几何图形集合为空,则其面积将返回为0。
如果几何图形具有地理空间参考系统(SRS)的SRID值,则会出现ER_NOT_IMPLEMENTED_for_geographic_SRS错误。
报错解决方法:需要规范相关函数的使用,避免官档中描述的例外情况。