mysql - 如何防止 MySQL Create View 破坏地理空间函数名称?

标签 mysql

当 View 中包含地理空间函数时,在 MySQL 上创建 View 似乎会生成无效的函数名称(MySQL 在 Amazon EC2/Amazon Linux 上运行);

mysql> create view test as select point(1,1);
Query OK, 0 rows affected (0.01 sec)

mysql> select * from test;
ERROR 1356 (HY000): View 'wordpress.test' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
mysql> show create view test
    -> ;
+------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View                                                                                                                      | character_set_client | collation_connection |
+------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| test | CREATE ALGORITHM=UNDEFINED DEFINER=`eric`@`localhost` SQL SECURITY DEFINER VIEW `test` AS select `st_point`(1,1) AS `point(1,1)` | utf8                 | utf8_general_ci      |
+------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set, 1 warning (0.01 sec)

mysql> drop view test;
Query OK, 0 rows affected (0.00 sec)

问题似乎是 st_point 不是一个有效的 MySQL 函数;

mysql> select st_point(1,1);
ERROR 1305 (42000): FUNCTION wordpress.st_point does not exist

问题是,为什么会发生这种情况,我该如何阻止它?

以下是出现问题的计算机上安装的软件包列表;

sudo yum list installed | grep mysql
mysql-config.x86_64                   5.5.51-1.11.amzn1            @amzn-updates
mysql56.x86_64                        5.6.32-1.16.amzn1            @amzn-updates
mysql56-common.x86_64                 5.6.32-1.16.amzn1            @amzn-updates
mysql56-devel.x86_64                  5.6.32-1.16.amzn1            @amzn-updates
mysql56-embedded.x86_64               5.6.32-1.16.amzn1            @amzn-updates
mysql56-errmsg.x86_64                 5.6.32-1.16.amzn1            @amzn-updates
mysql56-libs.x86_64                   5.6.32-1.16.amzn1            @amzn-updates
mysql56-server.x86_64                 5.6.32-1.16.amzn1            @amzn-updates
php70-mysqlnd.x86_64                  7.0.9-1.14.amzn1             @amzn-updates

具有较旧 mysql 软件包的类似计算机不会出现此问题 - 但我需要较新版本的 MySQL 才能访问新的地理空间功能。

在旧电脑上进行同样的测试;

mysql> create view test as select point(1,1);
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
+---------------------------+
| point(1,1)                |
+---------------------------+
|              ??      ??   |
+---------------------------+
1 row in set (0.00 sec)

mysql> show create view test;
+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View                                                                                                                 | character_set_client | collation_connection |
+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| test | CREATE ALGORITHM=UNDEFINED DEFINER=`eric`@`localhost` SQL SECURITY DEFINER VIEW `test` AS select point(1,1) AS `point(1,1)` | utf8                 | utf8_general_ci      |
+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)

mysql> drop view test;
Query OK, 0 rows affected (0.00 sec)

旧计算机上的软件包;

sudo yum list installed | grep mysql;
mysql.noarch                          5.5-1.6.amzn1                @amzn-main   
mysql-config.x86_64                   5.5.51-1.11.amzn1            @amzn-updates
mysql-devel.noarch                    5.5-1.6.amzn1                @amzn-main   
mysql-server.noarch                   5.5-1.6.amzn1                @amzn-main   
mysql55.x86_64                        5.5.51-1.11.amzn1            @amzn-updates
mysql55-devel.x86_64                  5.5.51-1.11.amzn1            @amzn-updates
mysql55-libs.x86_64                   5.5.51-1.11.amzn1            @amzn-updates
mysql55-server.x86_64                 5.5.51-1.11.amzn1            @amzn-updates
php-mysql.x86_64                      5.3.29-1.8.amzn1             @amzn-updates

我错过了什么?

更新:这个问题已经verified作为 MySQL 5.6.10+ 版本中的错误

最佳答案

是的,正如@Michael 提到的,GeomFromText 从 5.6.27 开始工作。

如果您需要将 lat/lng 列插入到 Point() 中,则:

  CREATE OR REPLACE VIEW `vw_some_table` AS
  SELECT
    id,
    name,
    lat,
    lng,
    status,
    GeomFromText(concat('point(',lng,' ', lat,')'))
  FROM vw_some_table;

注意 concat 的用法。

或如您的示例所示:

  CREATE OR REPLACE VIEW `vw_some_table` AS
  SELECT
    id,
    name,
    lat,
    lng,
    status,
    GeomFromText('point(1 1')
  FROM vw_some_table;

非常惊讶他们还没有修复这样一个严重的错误......不管它在 5.7.x 中工作

https://dev.mysql.com/doc/refman/5.6/en/gis-point-property-functions.html

关于mysql - 如何防止 MySQL Create View 破坏地理空间函数名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39179189/

相关文章:

mysql - 数据库动态字段(自定义属性)

php - 数据库查询总是返回 TRUE

mysql - 使用关键字作为ID会让你的mysql变慢吗?

c# - 无法加载文件或程序集 'MySql.Data, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' 或其依赖项之一

PHP MySql 更新否则插入错误 "Warning: mysql_result()"

php - 使用 CodeIgniter 和 jQuery 验证插件检查电子邮件是否存在总是返回 false

php - SMF - 升级 1-19 至 2-7 (upgrade.php)

javascript - 当他们发出请求数据时,如何在单个表上制作加载栏?

java-如何处理无法连接数据库的异常?

MySQL反向GROUP BY结果