目录搜索
目录前言1. 一般信息1.1. 关于本手册1.2. 本手册采用的惯例1.3. MySQL AB概述1.4. MySQL数据库管理系统概述1.4.1. MySQL的历史1.4.2. MySQL的的主要特性1.4.3. MySQL稳定性1.4.4. MySQL表最大能达到多少1.4.5. 2000年兼容性1.5. MaxDB数据库管理系统概述1.5.1. 什么是MaxDB?1.5.2. MaxDB的历史1.5.3. MaxDB的特性1.5.4. 许可和支持1.5.5. MaxDB和MySQL之间的特性差异1.5.6. MaxDB和MySQL之间的协同性1.5.7. 与MaxDB有关的链接1.6. MySQL发展大事记1.6.1. MySQL 5.1的新特性1.7. MySQL信息源1.7.1. MySQL邮件列表1.7.2. IRC(在线聊天系统)上的MySQL社区支持1.7.3. MySQL论坛上的MySQL社区支持1.8. MySQL标准的兼容性1.8.1. MySQL遵从的标准是什么1.8.2. 选择SQL模式1.8.3. 在ANSI模式下运行MySQL1.8.4. MySQL对标准SQL的扩展1.8.5. MySQL与标准SQL的差别1.8.6. MySQL处理约束的方式2. 安装MySQL2.1. 一般安装问题2.1.1. MySQL支持的操作系统2.1.2. 选择要安装的MySQL分发版2.1.3. 怎样获得MySQL2.1.4. 通过MD5校验和或GnuPG验证软件包的完整性2.1.5. 安装布局2.2. 使用二进制分发版的标准MySQL安装2.3. 在Windows上安装MySQL2.3.1. Windows系统要求2.3.2. 选择安装软件包2.3.3. 用自动安装器安装MySQL2.3.4. 使用MySQL安装向导2.3.5. 使用配置向导2.3.6. 通过非安装Zip文件安装MySQL2.3.7. 提取安装档案文件2.3.8. 创建选项文件2.3.9. 选择MySQL服务器类型2.3.10. 首次启动服务器2.3.11. 从Windows命令行启动MySQL2.3.12. 以Windows服务方式启动MySQL2.3.13. 测试MySQL安装2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除2.3.15. 在Windows下升级MySQL2.3.16. Windows版MySQL同Unix版MySQL对比2.4. 在Linux下安装MySQL2.5.在Mac OS X中安装MySQL2.6. 在NetWare中安装MySQL2.7. 在其它类Unix系统中安装MySQL2.8. 使用源码分发版安装MySQL2.8.1. 源码安装概述2.8.2. 典型配置选项2.8.3. 从开发源码树安装2.8.4. 处理MySQL编译问题2.8.5. MIT-pthreads注意事项2.8.6. 在Windows下从源码安装MySQL2.8.7. 在Windows下编译MySQL客户端2.9. 安装后的设置和测试2.9.1. Windows下安装后的过程2.9.2. Unix下安装后的过程2.9.3. 使初始MySQL账户安全2.10. 升级MySQL2.10.1. 从5.0版升级2.10.2. 升级授权表2.10.3. 将MySQL数据库拷贝到另一台机器2.11. 降级MySQL2.12. 具体操作系统相关的注意事项2.12.1. Linux注意事项2.12.2. Mac OS X注意事项2.12.3. Solaris注意事项2.12.4. BSD注意事项2.12.5. 其它Unix注意事项2.12.6. OS/2注意事项2.13. Perl安装注意事项2.13.1. 在Unix中安装Perl2.13.2. 在Windows下安装ActiveState Perl2.13.3. 使用Perl DBI/DBD接口的问题3. 教程3.1. 连接与断开服务器3.2. 输入查询3.3. 创建并使用数据库3.3.1. 创建并选择数据库3.3.2. 创建表3.3.3. 将数据装入表中3.3.4. 从表检索信息3.4. 获得数据库和表的信息NoName3.6. 常用查询的例子3.6.1. 列的最大值3.6.2. 拥有某个列的最大值的行3.6.3. 列的最大值:按组3.6.4. 拥有某个字段的组间最大值的行3.6.5. 使用用户变量3.6.6. 使用外键3.6.7. 根据两个键搜索3.6.8. 根据天计算访问量3.6.9. 使用AUTO_INCREMENT3.7. 孪生项目的查询3.7.1. 查找所有未分发的孪生项3.7.2. 显示孪生对状态的表3.8. 与Apache一起使用MySQL4. MySQL程序概述4.1. MySQL程序概述4.2. 调用MySQL程序4.3. 指定程序选项4.3.1. 在命令行上使用选项4.3.2. 使用选项文件4.3.3. 用环境变量指定选项4.3.4. 使用选项设置程序变量5. 数据库管理5.1. MySQL服务器和服务器启动脚本5.1.1. 服务器端脚本和实用工具概述5.1.2. mysqld-max扩展MySQL服务器5.1.3. mysqld_safe:MySQL服务器启动脚本5.1.4. mysql.server:MySQL服务器启动脚本5.1.5. mysqld_multi:管理多个MySQL服务器的程序5.2. mysqlmanager:MySQL实例管理器5.2.1. 用MySQL实例管理器启动MySQL服务器5.2.2. 连接到MySQL实例管理器并创建用户账户5.2.3. MySQL实例管理器命令行选项5.2.4. MySQL实例管理器配置文件5.2.5. MySQL实例管理器识别的命令5.3. mysqld:MySQL服务器5.3.1. mysqld命令行选项5.3.2. SQL服务器模式5.3.3. 服务器系统变量5.3.4. 服务器状态变量5.4. mysql_fix_privilege_tables:升级MySQL系统表5.5. MySQL服务器关机进程5.6. 一般安全问题5.6.1. 通用安全指南5.6.2. 使MySQL在攻击者面前保持安全5.6.3. Mysqld安全相关启动选项5.6.4. LOAD DATA LOCAL安全问题5.7. MySQL访问权限系统5.7.1. 权限系统的作用5.7.2. 权限系统工作原理5.7.3. MySQL提供的权限5.7.4. 与MySQL服务器连接5.7.5. 访问控制5.7.6. 访问控制5.7.7. 权限更改何时生效5.7.8. 拒绝访问错误的原因5.7.9. MySQL 4.1中的密码哈希处理5.8. MySQL用户账户管理5.8.1. MySQL用户名和密码5.8.2. 向MySQL增加新用户账户5.8.3. 从MySQL删除用户账户5.8.4. 限制账户资源5.8.5. 设置账户密码5.8.6. 使你的密码安全5.8.7. 使用安全连接5.9. 备份与恢复5.9.1. 数据库备份5.9.2. 示例用备份与恢复策略5.9.3. 自动恢复5.9.4. 表维护和崩溃恢复5.9.5. myisamchk:MyISAM表维护实用工具5.9.6. 建立表维护计划5.9.7. 获取关于表的信息5.10. MySQL本地化和国际应用5.10.1. 数据和排序用字符集5.10.2. 设置错误消息语言5.10.3. 添加新的字符集5.10.4. 字符定义数组5.10.5. 字符串比较支持5.10.6. 多字节字符支持5.10.7. 字符集问题5.10.8. MySQL服务器时区支持5.11. MySQL日志文件5.11.1. 错误日志5.11.2. 通用查询日志5.11.3. 二进制日志5.11.4. 慢速查询日志5.11.5. 日志文件维护5.12. 在同一台机器上运行多个MySQL服务器5.12.1. 在Windows下运行多个服务器5.12.2. 在Unix中运行多个服务器5.12.3. 在多服务器环境中使用客户端程序5.13. MySQL查询高速缓冲5.13.1. 查询高速缓冲如何工作5.13.2. 查询高速缓冲SELECT选项5.13.3. 查询高速缓冲配置5.13.4. 查询高速缓冲状态和维护6. MySQL中的复制6.1. 复制介绍6.2. 复制实施概述6.3. 复制实施细节6.3.1. 复制主线程状态6.3.2. 复制从I/O线程状态6.3.3. 复制从SQL线程状态6.3.4. 复制传递和状态文件6.4. 如何设置复制6.5. 不同MySQL版本之间的复制兼容性6.6. 升级复制设置6.6.1. 将复制升级到5.0版6.7. 复制特性和已知问题6.8. 复制启动选项6.9. 复制FAQ6.10. 复制故障诊断与排除6.11. 通报复制缺陷6.12. 多服务器复制中的Auto-Increment7. 优化7.1. 优化概述7.1.1. MySQL设计局限与折衷7.1.2. 为可移植性设计应用程序7.1.3. 我们已将MySQL用在何处?7.1.4. MySQL基准套件7.1.5. 使用自己的基准7.2. 优化SELECT语句和其它查询7.2.1. EXPLAIN语法(获取SELECT相关信息)7.2.2. 估计查询性能7.2.3. SELECT查询的速度7.2.4. MySQL怎样优化WHERE子句7.2.5. 范围优化7.2.6. 索引合并优化7.2.7. MySQL如何优化IS NULL7.2.8. MySQL如何优化DISTINCT7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN7.2.10. MySQL如何优化嵌套Join7.2.11. MySQL如何简化外部联合7.2.12. MySQL如何优化ORDER BY7.2.13. MySQL如何优化GROUP BY7.2.14. MySQL如何优化LIMIT7.2.15. 如何避免表扫描7.2.16. INSERT语句的速度7.2.17. UPDATE语句的速度7.2.18. DELETE语句的速度7.2.19. 其它优化技巧7.3. 锁定事宜7.3.1. 锁定方法7.3.2. 表锁定事宜7.4. 优化数据库结构7.4.1. 设计选择7.4.2. 使你的数据尽可能小7.4.3. 列索引7.4.4. 多列索引7.4.5. MySQL如何使用索引7.4.6. MyISAM键高速缓冲7.4.7. MyISAM索引统计集合7.4.8. MySQL如何计算打开的表7.4.9. MySQL如何打开和关闭表7.4.10. 在同一个数据库中创建多个表的缺陷7.5. 优化MySQL服务器7.5.1. 系统因素和启动参数的调节7.5.2. 调节服务器参数7.5.3. 控制查询优化器的性能7.5.4. 编译和链接怎样影响MySQL的速度7.5.5. MySQL如何使用内存7.5.6. MySQL如何使用DNS7.6. 磁盘事宜7.6.1. 使用符号链接8. 客户端和实用工具程序8.1. 客户端脚本和实用工具概述8.2. myisampack:生成压缩、只读MyISAM表8.3. mysql:MySQL命令行工具8.3.1. 选项8.3.2. mysql命令8.3.3. 怎样从文本文件执行SQL语句8.3.4. mysql技巧8.4. mysqlaccess:用于检查访问权限的客户端8.5. mysqladmin:用于管理MySQL服务器的客户端8.6. mysqlbinlog:用于处理二进制日志文件的实用工具8.7. mysqlcheck:表维护和维修程序8.8. mysqldump:数据库备份程序8.9. mysqlhotcopy:数据库备份程序8.10. mysqlimport:数据导入程序8.11. mysqlshow-显示数据库、表和列信息8.12. myisamlog:显示MyISAM日志文件内容8.13. perror:解释错误代码8.14. replace:字符串替换实用工具8.15. mysql_zap:杀死符合某一模式的进程9. 语言结构9.1. 文字值9.1.1. 字符串9.1.2. 数值9.1.3. 十六进制值9.1.4. 布尔值9.1.5. 位字段值9.1.6. NULL值9.2. 数据库、表、索引、列和别名9.2.1. 识别符限制条件9.2.2. 识别符大小写敏感性9.3. 用户变量9.4. 系统变量9.4.1. 结构式系统变量9.5. 注释语法9.6. MySQL中保留字的处理10. 字符集支持10.1. 常规字符集和校对10.2. MySQL中的字符集和校对10.3. 确定默认字符集和校对10.3.1. 服务器字符集和校对10.3.2. 数据库字符集和校对10.3.3. 表字符集和校对10.3.4. 列字符集和校对10.3.5. 字符集和校对分配示例10.3.6. 连接字符集和校对10.3.7. 字符串文字字符集和校对10.3.8. 在SQL语句中使用COLLATE10.3.9. COLLATE子句优先10.3.10. BINARY操作符10.3.11. 校对确定较为复杂的一些特殊情况10.3.12. 校对必须适合字符集10.3.13. 校对效果的示例10.4. 字符集支持影响到的操作10.4.1. 结果字符串10.4.2. CONVERT()10.4.3. CAST()10.4.4. SHOW语句10.5. Unicode支持10.6. 用于元数据的UTF810.7. 与其它DBMS的兼容性10.8. 新字符集配置文件格式10.9. 国家特有字符集10.10. MySQL支持的字符集和校对10.10.1. Unicode字符集10.10.2. 西欧字符集10.10.3. 中欧字符集10.10.4. 南欧与中东字符集10.10.5. 波罗的海字符集10.10.6. 西里尔字符集10.10.7. 亚洲字符集11. 列类型11.1. 列类型概述11.1.1. 数值类型概述11.1.2. 日期和时间类型概述11.1.3. 字符串类型概述11.2. 数值类型11.3. 日期和时间类型11.3.1. DATETIME、DATE和TIMESTAMP类型11.3.2. TIME类型11.3.3. YEAR类型11.3.4. Y2K事宜和日期类型11.4. String类型11.4.1. CHAR和VARCHAR类型11.4.2. BINARY和VARBINARY类型11.4.3. BLOB和TEXT类型11.4.4. ENUM类型11.4.5. SET类型11.5. 列类型存储需求11.6. 选择正确的列类型11.7. 使用来自其他数据库引擎的列类型12. 函数和操作符12.1. 操作符12.1.1. 操作符优先级12.1.2. 圆括号12.1.3. 比较函数和操作符12.1.4. 逻辑操作符12.2. 控制流程函数12.3. 字符串函数12.3.1. 字符串比较函数12.4. 数值函数12.4.1. 算术操作符12.4.2. 数学函数12.5. 日期和时间函数12.6. MySQL使用什么日历?12.7. 全文搜索功能12.7.1. 布尔全文搜索12.7.2. 全文搜索带查询扩展12.7.3. 全文停止字12.7.4. 全文限定条件12.7.5. 微调MySQL全文搜索12.8. Cast函数和操作符12.9. 其他函数12.9.1. 位函数12.9.2. 加密函数12.9.3. 信息函数12.9.4. 其他函数NoName12.10.1. GROUP BY(聚合)函数12.10.2. GROUP BY修改程序12.10.3. 具有隐含字段的GROUP BY13. SQL语句语法13.1. 数据定义语句13.1.1. ALTER DATABASE语法13.1.2. ALTER TABLE语法13.1.3. CREATE DATABASE语法13.1.4. CREATE INDEX语法13.1.5. CREATE TABLE语法13.1.6. DROP DATABASE语法13.1.7. DROP INDEX语法13.1.8. DROP TABLE语法13.1.9. RENAME TABLE语法13.2. 数据操作语句13.2.1. DELETE语法13.2.2. DO语法13.2.3. HANDLER语法13.2.4. INSERT语法13.2.5. LOAD DATA INFILE语法13.2.6. REPLACE语法13.2.7. SELECT语法13.2.8. Subquery语法13.2.9. TRUNCATE语法13.2.10. UPDATE语法13.3. MySQL实用工具语句13.3.1. DESCRIBE语法(获取有关列的信息)13.3.2. USE语法13.4. MySQL事务处理和锁定语句13.4.1. START TRANSACTION13.4.2. 不能回滚的语句13.4.3. 会造成隐式提交的语句13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法13.4.5. LOCK TABLES和UNLOCK TABLES语法13.4.6. SET TRANSACTION语法13.4.7. XA事务13.5. 数据库管理语句13.5.1. 账户管理语句13.5.2. 表维护语句13.5.3. SET语法13.5.4. SHOW语法13.5.5. 其它管理语句13.6. 复制语句13.6.1. 用于控制主服务器的SQL语句13.6.2. 用于控制从服务器的SQL语句13.7. 用于预处理语句的SQL语法14. 插件式存储引擎体系结构14.1. 前言14.2. 概述14.3. 公共MySQL数据库服务器层14.4. 选择存储引擎14.5. 将存储引擎指定给表14.6. 存储引擎和事务14.7. 插入存储引擎14.8. 拔出存储引擎14.9. 插件式存储器的安全含义15. 存储引擎和表类型15.1. MyISAM存储引擎15.1.1. MyISAM启动选项15.1.2. 键所需的空间15.1.3. MyISAM表的存储格式15.1.4. MyISAM表方面的问题15.2. InnoDB存储引擎15.2.1. InnoDB概述15.2.2. InnoDB联系信息15.2.3. InnoDB配置15.2.4. InnoDB启动选项15.2.5. 创建InnoDB表空间15.2.6. 创建InnoDB表15.2.7. 添加和删除InnoDB数据和日志文件15.2.8. InnoDB数据库的备份和恢复15.2.9. 将InnoDB数据库移到另一台机器上15.2.10. InnoDB事务模型和锁定15.2.11. InnoDB性能调节提示15.2.12. 多版本的实施15.2.13. 表和索引结构15.2.14. 文件空间管理和磁盘I/O15.2.15. InnoDB错误处理15.2.16. 对InnoDB表的限制15.2.17. InnoDB故障诊断与排除15.3. MERGE存储引擎15.3.1. MERGE表方面的问题15.4. MEMORY (HEAP)存储引擎15.5. BDB (BerkeleyDB)存储引擎15.5.1. BDB支持的操作系统15.5.2. 安装BDB15.5.3. BDB启动选项15.5.4. BDB表的特性15.5.5. 修改BDB所需的事宜15.5.6. 对BDB表的限制15.5.7. 使用BDB表时可能出现的错误15.6. EXAMPLE存储引擎15.7. FEDERATED存储引擎15.7.1. 安装FEDERATED存储引擎15.7.2. FEDERATED存储引擎介绍15.7.3. 如何使用FEDERATED表15.7.4. FEDERATED存储引擎的局限性15.8. ARCHIVE存储引擎15.9. CSV存储引擎15.10. BLACKHOLE存储引擎16. 编写自定义存储引擎16.1. 前言16.2. 概述16.3. 创建存储引擎源文件NoName16.5. 对处理程序进行实例化处理16.6. 定义表扩展16.7. 创建表16.8. 打开表16.9. 实施基本的表扫描功能16.9.1. 实施store_lock()函数16.9.2. 实施external_lock()函数16.9.3. 实施rnd_init()函数16.9.4. 实施info()函数16.9.5. 实施extra()函数16.9.6. 实施rnd_next()函数16.10. 关闭表NoNameNoNameNoName16.14. API引用16.14.1. bas_ext16.14.2. close16.14.3. create16.14.4. delete_row16.14.5. delete_table16.14.6. external_lock16.14.7. extra16.14.8. info16.14.9. open16.14.10. rnd_init16.14.11. rnd_next16.14.12. store_lock16.14.13. update_row16.14.14. write_row17. MySQL簇17.1. MySQL簇概述17.2. MySQL簇的基本概念17.3. 多计算机的简单基础知识17.3.1. 硬件、软件和联网17.3.2. 安装17.3.3. 配置17.3.4. 首次启动17.3.5. 加载示例数据并执行查询17.3.6. 安全关闭和重启17.4. MySQL簇的配置17.4.1. 从源码创建MySQL簇17.4.2. 安装软件17.4.3. MySQL簇的快速测试设置17.4.4. 配置文件17.5. MySQL簇中的进程管理17.5.1. 用于MySQL簇的MySQL服务器进程使用17.5.2. ndbd,存储引擎节点进程17.5.3. ndb_mgmd,“管理服务器”进程17.5.4. ndb_mgm,“管理客户端”进程17.5.5. 用于MySQL簇进程的命令选项17.6. MySQL簇的管理17.6.1. MySQL簇的启动阶段17.6.2. “管理客户端”中的命令17.6.3. MySQL簇中生成的事件报告17.6.4. 单用户模式17.6.5. MySQL簇的联机备份17.7. 使用与MySQL簇的高速互连17.7.1. 配置MySQL簇以使用SCI套接字17.7.2. 理解簇互连的影响17.8. MySQL簇的已知限制17.9. MySQL簇发展的重要历程17.9.1. MySQL 5.0中的MySQL簇变化17.9.2. 关于MySQL簇的MySQL 5.1发展历程17.10. MySQL簇常见问题解答17.11. MySQL簇术语表18. 分区18.1. MySQL中的分区概述18.2. 分区类型18.2.1. RANGE分区18.2.2. LIST分区18.2.3. HASH分区18.2.4. KEY分区18.2.5. 子分区18.2.6. MySQL分区处理NULL值的方式18.3. 分区管理18.3.1. RANGE和LIST分区的管理18.3.2. HASH和KEY分区的管理18.3.3. 分区维护18.3.4. 获取关于分区的信息19. MySQL中的空间扩展19.1. 前言19.2. OpenGIS几何模型19.2.1. Geometry类的层次19.2.2. 类Geometry19.2.3. 类Point19.2.4. 类Curve19.2.5. 类LineString19.2.6. 类Surface19.2.7. 类Polygon19.2.8. 类GeometryCollection19.2.9. 类MultiPoint19.2.10. 类MultiCurve19.2.11. 类MultiLineString19.2.12. 类MultiSurface19.2.13. 类MultiPolygon19.3. 支持的空间数据格式19.3.1. 著名的文本(WKT)格式19.3.2. 著名的二进制(WKB)格式19.4. 创建具备空间功能的MySQL数据库19.4.1. MySQL空间数据类型19.4.2. 创建空间值19.4.3. 创建空间列19.4.4. 填充空间列19.4.5. 获取空间数据19.5. 分析空间信息19.5.1. Geometry格式转换函数19.5.2. Geometry函数19.5.3. 从已有Geometry创建新Geometry的函数19.5.4. 测试几何对象间空间关系的函数19.5.5. 关于几何最小边界矩形(MBR)的关系19.5.6. 测试几何类之间空间关系的函数19.6. 优化空间分析19.6.1. 创建空间索引19.6.2. 使用空间索引19.7. MySQL的一致性和兼容性19.7.1. 尚未实施的GIS特性20. 存储程序和函数20.1. 存储程序和授权表20.2. 存储程序的语法20.2.1. CREATE PROCEDURE和CREATE FUNCTION20.2.2. ALTER PROCEDURE和ALTER FUNCTION20.2.3. DROP PROCEDURE和DROP FUNCTION20.2.4.SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION20.2.5.SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS20.2.6. CALL语句20.2.7. BEGIN ... END复合语句20.2.8. DECLARE语句20.2.9. 存储程序中的变量20.2.10. 条件和处理程序20.2.11. 光标20.2.12. 流程控制构造20.3. 存储程序、函数、触发程序和复制:常见问题20.4. 存储子程序和触发程序的二进制日志功能21. 触发程序21.1. CREATE TRIGGER语法21.2. DROP TRIGGER语法21.3. 使用触发程序22. 视图22.1. ALTER VIEW语法22.2. CREATE VIEW语法22.3. DROP VIEW语法22.4. SHOW CREATE VIEW语法23. INFORMATION_SCHEMA信息数据库23.1. INFORMATION_SCHEMA表23.1.1. INFORMATION_SCHEMA SCHEMATA表23.1.2. INFORMATION_SCHEMA TABLES表23.1.3. INFORMATION_SCHEMA COLUMNS表23.1.4. INFORMATION_SCHEMA STATISTICS表23.1.5. INFORMATION_SCHEMA USER_PRIVILEGES表23.1.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES表23.1.7. INFORMATION_SCHEMA TABLE_PRIVILEGES表23.1.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES表23.1.9. INFORMATION_SCHEMA CHARACTER_SETS表23.1.10. INFORMATION_SCHEMA COLLATIONS表23.1.11. INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY表23.1.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS表23.1.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE表23.1.14. INFORMATION_SCHEMA ROUTINES表23.1.15. INFORMATION_SCHEMA VIEWS表23.1.16. INFORMATION_SCHEMA TRIGGERS表23.1.17. 其他INFORMATION_SCHEMA表NoName24. 精度数学24.1. 数值的类型24.2. DECIMAL数据类型更改24.3. 表达式处理24.4. 四舍五入24.5. 精度数学示例25. API和库25.1. libmysqld,嵌入式MySQL服务器库25.1.1. 嵌入式MySQL服务器库概述25.1.2. 使用libmysqld编译程序25.1.3. 使用嵌入式MySQL服务器时的限制25.1.4. 与嵌入式服务器一起使用的选项25.1.5. 嵌入式服务器中尚需完成的事项(TODO)25.1.6. 嵌入式服务器示例25.1.7. 嵌入式服务器的许可25.2. MySQL C API25.2.1. C API数据类型25.2.2. C API函数概述25.2.3. C API函数描述25.2.4. C API预处理语句25.2.5. C API预处理语句的数据类型25.2.6. C API预处理语句函数概述25.2.7. C API预处理语句函数描述25.2.8. C API预处理语句方面的问题25.2.9. 多查询执行的C API处理25.2.10. 日期和时间值的C API处理25.2.11. C API线程函数介绍25.2.12. C API嵌入式服务器函数介绍25.2.13. 使用C API时的常见问题25.2.14. 创建客户端程序25.2.15. 如何生成线程式客户端25.3. MySQL PHP API25.3.1. 使用MySQL和PHP的常见问题25.4. MySQL Perl API25.5. MySQL C++ API25.5.1. Borland C++25.6. MySQL Python API25.7. MySQL Tcl API25.8. MySQL Eiffel Wrapper25.9. MySQL程序开发实用工具25.9.1. msql2mysql:转换mSQL程序以用于MySQL25.9.2. mysql_config:获取编译客户端的编译选项26. 连接器26.1. MySQL Connector/ODBC26.1.1. MyODBC介绍26.1.2. 关于ODBC和MyODBC的一般信息26.1.3. 如何安装MyODBC26.1.4. 在Windows平台上从二进制版本安装MyODBC26.1.5. I在Unix平台上从二进制版本安装MyODBC26.1.6. 在Windows平台上从源码版本安装MyODBC26.1.7. 在Unix平台上从源码版本安装MyODBC26.1.8. 从BitKeeper开发源码树安装MyODBC26.1.9. MyODBC配置26.1.10. 与MyODBC连接相关的事宜26.1.11. MyODBC和Microsoft Access26.1.12. MyODBC和Microsoft VBA及ASP26.1.13. MyODBC和第三方ODBC工具26.1.14. MyODBC通用功能26.1.15. 基本的MyODBC应用步骤26.1.16. MyODBC API引用26.1.17. MyODBC数据类型26.1.18. MyODBC错误代码26.1.19. MyODBC与VB:ADO、DAO和RDO26.1.20. MyODBC与Microsoft.NET26.1.21. 感谢26.2. MySQL Connector/NET26.2.1. 前言26.2.2. 下载并安装MySQL Connector/NET26.2.3. Connector/NET体系结构26.2.4. 使用MySQL Connector/NET26.2.5. MySQL Connector/NET变更史26.3. MySQL Connector/J26.3.1. 基本的JDBC概念26.3.2. 安装 Connector/J26.3.3. JDBC引用26.3.4. 与J2EE和其他Java框架一起使用 Connector/J26.3.5. 诊断 Connector/J方面的问题26.3.6. Changelog26.4. MySQL Connector/MXJ26.4.1. 前言26.4.2. 支持平台:26.4.3. Junit测试要求26.4.4. 运行Junit测试26.4.5. 作为JDBC驱动程序的一部分运行26.4.6. 在Java对象中运行26.4.7. MysqldResource API26.4.8. 在JMX代理(custom)中运行26.4.9. 部署在标准的JMX代理环境下 (JBoss)26.4.10. 安装27. 扩展MySQL27.1. MySQL内部控件27.1.1. MySQL线程27.1.2. MySQL测试套件27.2. 为MySQL添加新函数27.2.1. 自定义函数接口的特性27.2.2. CREATE FUNCTION/DROP FUNCTION语法27.2.3. 添加新的自定义函数27.2.4. 添加新的固有函数27.3. 为MySQL添加新步骤27.3.1. 步骤分析27.3.2. 编写步骤A. 问题和常见错误A.1. 如何确定导致问题的原因A.2. 使用MySQL程序时的常见错误A.2.1. 拒绝访问A.2.2. 无法连接到[local] MySQL服务器A.2.3. 客户端不支持鉴定协议A.2.4. 输入密码时出现密码错误NoNameA.2.6. 连接数过多A.2.7. 内存溢出A.2.8. MySQL服务器不可用A.2.9. 信息包过大A.2.10. 通信错误和失效连接A.2.11. 表已满A.2.12. 无法创建文件/写入文件A.2.13. 命令不同步A.2.14. 忽略用户A.2.15. 表tbl_name不存在A.2.16. 无法初始化字符集A.2.17. 文件未找到A.3. 与安装有关的事宜A.3.1. 与MySQL客户端库的链接问题A.3.2. 如何以普通用户身份运行MySQLA.3.3. 与文件许可有关的问题A.4. 与管理有关的事宜A.4.1. 如何复位根用户密码A.4.2. 如果MySQL依然崩溃,应作些什么A.4.3. MySQL处理磁盘满的方式A.4.4. MySQL将临时文件储存在哪里A.4.5. 如何保护或更改MySQL套接字文件/tmp/mysql.sockA.4.6. 时区问题A.5. 与查询有关的事宜A.5.1. 搜索中的大小写敏感性A.5.2. 使用DATE列方面的问题A.5.3. 与NULL值有关的问题A.5.4. 与列别名有关的问题A.5.5. 非事务表回滚失败A.5.6. 从相关表删除行A.5.7. 解决与不匹配行有关的问题A.5.8. 与浮点比较有关的问题A.6. 与优化器有关的事宜A.7. 与表定义有关的事宜A.7.1. 与ALTER TABLE有关的问题A.7.2. 如何更改表中的列顺序A.7.3. TEMPORARY TABLE问题A.8. MySQL中的已知事宜A.8.1. MySQL中的打开事宜B. 错误代码和消息B.1. 服务器错误代码和消息B.2. 客户端错误代码和消息C. 感谢C.1. MySQL AB处的开发人C.2. MySQL贡献人C.3. 资料员和译员C.4. MySQL使用和包含的库C.5. 支持MySQL的软件包C.6. 用于创建MySQL的工具C.7. MySQL支持人员D. MySQL变更史D.1. 5.1.x版中的变更情况(开发)D.1.1. 5.1.2版中的变更情况(尚未发布)D.1.2. 5.1.1版中的变更情况(尚未发布)D.2. MyODBC的变更情况D.2.1. MyODBC 3.51.12的变更情况D.2.2. MyODBC 3.51.11的变更情况E. 移植到其他系统E.1. 调试MySQL服务器E.1.1. 针对调试编译MySQLE.1.2. 创建跟踪文件E.1.3. 在gdb环境下调试mysqldE.1.4. 使用堆栈跟踪E.1.5. 使用日志文件找出mysqld中的错误原因E.1.6. 如果出现表崩溃,请生成测试案例E.2. 调试MySQL客户端E.3. DBUG软件包E.4. 关于RTS线程的注释E.5. 线程软件包之间的差异F. 环境变量G. MySQL正则表达式H. MySQL中的限制H.1. 联合的限制I. 特性限制I.1. 对存储子程序和触发程序的限制I.2. 对服务器端光标的限制I.3. 对子查询的限制I.4. 对视图的限制I.5. 对XA事务的限制J. GNU通用公共许可K. MySQL FLOSS许可例外索引
文字

第19章:MySQL中的空间扩展

目录

19.1. 前言
19.2. OpenGIS几何模型
19.2.1. Geometry类的层次
19.2.2. 类Geometry
19.2.3. 类Point
19.2.4. 类Curve
19.2.5. 类LineString
19.2.6. 类Surface
19.2.7. 类Polygon
19.2.8. 类GeometryCollection
19.2.9. 类MultiPoint
19.2.10. 类MultiCurve
19.2.11. 类MultiLineString
19.2.12. 类MultiSurface
19.2.13. 类MultiPolygon
19.3. 支持的空间数据格式
19.3.1. 著名的文本(WKT)格式
19.3.2. 著名的二进制(WKB)格式
19.4. 创建具备空间功能的MySQL数据库
19.4.1. MySQL空间数据类型
19.4.2. 创建空间值
19.4.3. 创建空间列
19.4.4. 填充空间列
19.4.5. 获取空间数据
19.5. 分析空间信息
19.5.1. Geometry格式转换函数
19.5.2. Geometry函数
19.5.3. 从已有Geometry创建新Geometry的函数
19.5.4. 测试几何对象间空间关系的函数
19.5.5. 关于几何最小边界矩形(MBR)的关系
19.5.6. 测试几何类之间空间关系的函数
19.6. 优化空间分析
19.6.1. 创建空间索引
19.6.2. 使用空间索引
19.7. MySQL的一致性和兼容性
19.7.1. 尚未实施的GIS特性

MySQL支持空间扩展,允许生成、保存和分析地理特征。这些特征可用于MyISAMInnoDBNDBBDBARCHIVE表(但是,ARCHIVE引擎不支持索引功能,因此,不能为ARCHIVE列中的空间列编制索引)。

本章介绍了下述议题:

·         OpenGIS几何模型中这些空间扩展的基础。

·         用于表示空间数据的数据格式。

·         如何在MySQL中使用空间数据。

·         使用关于空间数据的索引功能。

·         MySQLOpenGIS规范的差异。

如果在MySQL空间扩展的使用方面有任何问题,可在我们网站的GIS论坛 中讨论。

19.1. 前言

遵从OpenGIS联盟(OGC)的规范,MySQL实施了空间扩展。OGC是一个由250多家公司、代理机构和大学参与的国际联盟,负责开发公开的概念解决方案,这类解决方案对所有用来管理空间数据的应用都是有用的。OGC的网站是http://www.opengis.org/

1997年,OpenGIS联盟(OGC)发布了针对SQLOpenGIS®简单特征规范,在该文档中,提出了扩展SQL RDBMS以支持空间数据的一些概念性方法。该规范可从OpenGIS网站上获得http://www.opengis.org/docs/99-049.pdf。其中包含与本章有关的额外信息。

MySQL实施了OGC建议的具有Geometry类型的SQL环境的一个子集。该术语指的是用一组集合类型扩展的环境。具有几何值的SQL列是作为拥有集合类型的列实施的。该规范描述了SQL几何类型集合,以及作用在这些类型上用于创建和分析几何值的函数。

地理特征指的是世界上具有地理位置的任何事物。它可以是:

·         实体,如山、池溏、城市。

·         空间,如邮政区域、热带。

·         可定义的位置,如两条街道相交的十字路口。

有些文件采用术语地理空间特征来指代地理特征。

几何是另一个表示地理特征的术语。最初,单词几何表示的是对大地的测量。来自制图学的另一个含义指的是制图人员用于绘制世界地图的地理特征。

本章将所有这些术语当作同义词对待:地理特征、地理空间特征或几何。最常使用的术语是几何

我们将几何定义为世界上具有地理位置的点或点的集合。

19.2. OpenGIS几何模型

19.2.1. Geometry类的层次
19.2.2. 类Geometry
19.2.3. 类Point
19.2.4. 类Curve
19.2.5. 类LineString
19.2.6. 类Surface
19.2.7. 类Polygon
19.2.8. 类GeometryCollection
19.2.9. 类MultiPoint
19.2.10. 类MultiCurve
19.2.11. 类MultiLineString
19.2.12. 类MultiSurface
19.2.13. 类MultiPolygon

OGC具有几何类型的SQL环境建议的几何类型集合,基于OpenGIS几何模型。在本模型中,每个几何对象均具有下述一般属性:

·         与空间参考系统相关,其中介绍了定义对象的坐标空间。

·         属于某种几何类。

19.2.1. Geometry类的层次

几何类定义了下述层次:

·         Geometry(非实例化)

o        Point(可实例化的)

o        Curve(非实例化)

§         LineString(可实例化的)

·         Line

·         LinearRing

o        Surface(非实例化)

§         Polygon(可实例化的)

o        GeometryCollection(可实例化的)

§         MultiPoint(可实例化的)

§         MultiCurve(非实例化)

·         MultiLineString(可实例化的)

§         MultiSurface(非实例化)

·         MultiPolygon(可实例化的)

不能在非实例化类中创建对象。能够在可实例化类中创建对象。所有类均有属性,可实例化类还可以包含声明(定义有效类实例的规则)。

Geometry是一种基本类。它是一种抽象类。Geometry的可实例化子类限制为可在2维坐标空间中存在的012维几何对象。所有的可实例化几何类是这样定义的,从而使得几何类的实例从拓扑意义上讲是闭合的(也就是说,所有定义的几何类包含其边界)。

基本Geometry类具有关于PointCurveSurfaceGeometryCollection的子类:

·         Point表示0维对象。

·         Curve表示1维对象,具有子类LineString,以及次级子类LineLinearRing

·         Surface是为2维对象设计的,具有子类Polygon

·         GeometryCollection具有特殊的0维、1维和2维类集合,名为MultiPointMultiLineStringMultiPolygon,分别用于为对应的PointsLineStringsPolygons集合进行几何建模。MultiCurveMultiSurface是作为抽象超类引入的,它们归纳了用于处理CurvesSurfaces的集合接口。

GeometryCurveSurfaceMultiCurveMultiSurface定义为非实例化类。它们为其子类定义了公用方法集合,而且是为扩展而包含在内的。

PointLineStringPolygonGeometryCollectionMultiPointMultiLineStringMultiPolygon定义为可实例化类。

19.2.2. 类Geometry

Geometry是层次结构的根类。它是一种非实例化类,但具有很多属性,这些属性对由任何Geometry子类创建的所有几何值来说是共同的。下面介绍了这些属性(尤其是具有自己特殊属性的子类)。

Geometry属性

Geometry值具有下述属性:

·         type(类型)。每个geometry属于层次结构中可实例化类之一。

·         SRID,或空间参考ID。该值确定了用于描述定义几何对象的坐标空间的空间坐标系统。

MySQL中,SRID值仅是与geometry值相关的整数值。所有计算均是在欧几里得几何系(平面)中进行的。

·         它在其空间坐标系统中的coordinates(坐标),表示为双精度数值(8字节)。所有的非空几何对象至少包含一对坐标(XY)。空几何对象不含坐标。

坐标与SRID相关。例如,在不同的坐标系内,两个对象之间的距离会有所不同,即使这两个对象具有相同的坐标也同样。这是因为,平面坐标系中的距离和地心坐标系(地球表面上的坐标)中的距离是不同的事项。

·         interior(内部)、boundary(边界)和exterior(外部)。

每个几何对象均占据空间中的某一位置。几何对象的exterior(外部)指的是未被该对象占据的所有空间。其interior(内部)指的是被该对象占据的空间。其boundary(边界)指的是几何对象内部和外部之间的界面。

·         MBR(最小边界矩形)或包络面。这是一种边界几何值,由最小和最大坐标(X,Y)构成。

·                ((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))

·         无论值是简单的非简单的。类型(LineStringMultiPointMultiLineString)的几何值或是简单的,或是非简单的。每个类型决定了其自己的简单或非简单声明。

·         无论值是封闭的非封闭的。类型(LineStringMultiPoint)的几何值或是封闭的,或是非封闭的。每个类型决定了其自己的封闭或非封闭声明。

·         无论值是空的非空的。如果没有任何点,几何对象是空的。空几何对象的内部、外部和边界未定义(也就是说,它们由Null值表示)。空的几何对象定义为总是简单的,面积为0

·         dimension(维数)。几何对象的维数为1012

o        1用于空几何对象。

o        0用于无长度、无面积的几何对象。

o        1用于具有非0长度和0面积的几何对象。

o        2用于具有非0面积的几何对象。

Point对象的维数为0LineString对象的维数为1Polygon对象的维数为2MultiPointMultiLineStringMultiPolygon对象的维数与构成它们的元素的维数相同。

19.2.3. 类Point

Point(点)指的是代表坐标空间中单个位置的几何类。

Point示例

·         想像一张具有众多城市的大世界地图。每个Point对象可代表1个城市。

·         在城市地图上,Point对象可代表1个公共汽车站。

Point属性

·         X-坐标值。

·         Y-坐标值。

·         Point定义为0维几何对象。

·         Point的边界为空集合。

19.2.4. 类Curve

Curve(曲线)是一种1几何对象,通常由一系列点表示。Curve的特殊子类定义了点之间的内插类型。Curve是一种非实例化类。

Curve属性

·         Curve具有其点的坐标。

·         Curve定义为1维几何对象。

·         如果未通过相同的点两次,Curve就是简单的。

·         如果其起点等于其终点,Curve就是封闭的。

·         封闭Curve的边界为空。

·         非封闭Curve的边界由其两个端点构成。

·         简单且封闭的CurveLinearRing

19.2.5. 类LineString

LineString是具有点之间线性内插特性的Curve

LineString示例

·         在世界地图上,LineString对象可表示河流。

·         在城市地图上,LineString对象可表示街道。

LineString属性

·         LineString具有线段的坐标,由每个连续的点对(两点)定义。

·         如果仅包含两点,LineStringLine

·         如果它既是简单的也是封闭的,LineStringLinearRing

19.2.6. 类Surface

Surface是一种2维几何对象。它是一种非实例化类。其唯一的可实例化子类是Polygon.

Surface属性

·         Surface定义为2维几何对象。

·         OpenGIS规范中,将简单的Surface定义为由单一patch”构成的几何对象,它与单个外部边界以及0或多个内部边界有关。

·         简单Surface的边界是一组与其内部和外部边界对应的封闭曲线的集合。

19.2.7. 类Polygon

Polygon是代表多边几何对象的平面Surface。它由单个外部边界以及0或多个内部边界定义,其中,每个内部边界定义为Polygon中的1个孔。

Polygon示例

·         在地区地图上,Polygon对象可表示森林、区等。

Polygon声明

·         Polygon的边界由一组构成其外部边界和比内部边界的LinearRing归向集合构成(即,简单且封闭的LineString对象)。

·         Polygon没有交叉的环。Polygon边界中的环可能会在Point处相交,但仅以切线方式相交。

·         Polygon没有线、尖峰或穿孔。

·         Polygon有由连接点集合构成的内部。

·         Polygon可能包含孔。对于具有孔的Polygon,其外部不连接。每个孔定义了连接的外部部件。

前述声明使得Polygon成为简单的几何对象。

19.2.8. 类GeometryCollection

GeometryCollection是由1个或多个任意类几何对象构成的几何对象。

GeometryCollection中的所有元素必须具有相同的空间参考系(即相同的坐标系)。对GeometryCollection的元素无任何限制,但下面介绍的GeometryCollection的子类会限制其成员。这类限制可能基于:

·         元素类型(例如,MultiPoint可能仅包含Point元素)。

·         维数。

·         对元素间空间交迭程度的限制。

19.2.9. 类MultiPoint

MultiPoint是一种由Point元素构成的几何对象集合。这些点未以任何方式连接或排序。

MultiPoint示例

·         在世界地图上,MultiPoint可以代表岛链。

·         在城市地图上,MultiPoint可以表示售票处的出口。

MultiPoint属性

·         MultiPoint0维几何对象。

·         如果没有两个Point是相同的(具有等同的坐标值),MultiPoint是简单的。

·         MultiPoint的边界为空集合。

19.2.10. 类MultiCurve

MultiCurve是一种由Curve元素构成的几何对象集合。MultiCurve是一种非实例化类。

MultiCurve属性

·         MultiCurve1维几何对象。

·         当且仅当其所有元素均是简单的时,MultiCurve才是简单的。任意两元素的唯一交叉仅出现在两元素边界的点上。

·         MultiCurve边界是通过采用“模2联合规则”(也称为奇偶规则)获得的:如果某一点位于奇数编号MultiCurve元素的边界内,它将位于MultiCurve的边界内。

·         如果其所有元素均是封闭的,则MultiCurve为封闭的。

·         封闭MultiCurve的边界总为空。

19.2.11. 类MultiLineString

MultiLineString是一种由 LineString元素构成的MultiCurve几何对象集合。

MultiLineString示例

·         在地区地图上,MultiLineString可表示河流体系或高速路系统。

19.2.12. 类MultiSurface

MultiSurface是一种由Surface元素构成的几何对象集合。MultiSurface是一种非实例化类。其唯一的可实例化子类是MultiPolygon

MultiSurface声明

·         2MultiSurface面没有相交的内部。

·         2MultiSurface元素具有最多在有限点上相交的边界。

19.2.13. 类MultiPolygon

MultiPolygon是一种由Polygon元素构成的几何对象集合。

MultiPolygon示例

·         在地区地图上,MultiPolygon可表示湖泊系统。

MultiPolygon声明

·         MultiPolygon没有内部相交的的2Polygon元素。

·         MultiPolygon没有2个交叉的Polygon元素(前述声明也禁止交叉),也没有在无数点处相接触的2Polugon元素。

·         MultiPolygon不能含有有断开的线、尖峰或穿孔。MultiPolygon是一种正常的封闭点集合。

·         对于有1个以上Polygon元素的MultiPolygon具有不连接的内部。MultiPolygon内部已连接部件的数目等于MultiPolygonPolygon值的数目。

MultiPolygon属性

·         MultiPolygon2维几何对象。

·         MultiPolygon边界是与其Polygon元素的边界对应的封闭曲线集合LineString值)。

·         MultiPolygon边界中的每个Curve准确位于1Polygon元素的边界内。

·         Polygon元素边界中的每个Curve位于MultiPolygon的边界中。

19.3. 支持的空间数据格式

19.3.1. 著名的文本(WKT)格式
19.3.2. 著名的二进制(WKB)格式
在本节中,介绍了用于表示查询中几何对象的标准空间数据格式。它们是:

·         著名的文本(WKT)格式

·         著名的二进制(WKB)格式

从其内部看,MySQL以不完全等同于WKTWKB的格式保存几何对象值。

19.3.1. 著名的文本(WKT)格式

对于Geometry的著名文本(WKT)表示,它是为与采用ASCII格式的几何数据进行交换而设计的。

几何对象WKT表示的示例:

·         Point

·                POINT(15 20)

注意,指定点坐标时不使用分隔用逗号。

·         具有4个点的LineString

·                LINESTRING(0 0, 10 10, 20 25, 50 60)

注意,点坐标对采用逗号隔开。

·         具有1个外部环和1个内部环的Polygon

·                POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))

·         具有三个Point值的MultiPoint

·                MULTIPOINT(0 0, 20 20, 60 60)

·         具有2LineString值的MultiLineString

·                MULTILINESTRING((10 10, 20 20), (15 15, 30 15))

·         具有2Polygon值的MultiPolygon

·                MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))

·         2Point值和1LineString构成的GeometryCollection

·                GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))

在本章开始处给出的OGC规范文档中,可找到相应的Backus-Naur语法,它指定了用于编写WKT值的正式生产规则。

19.3.2. 著名的二进制(WKB)格式

用于几何值的著名二进制(WKB)表示是由OpenGIS规范定义的。它还定义在ISO SQL/MM Part 3: Spatial”标准中。

WKB用于以二进制流的形式交换几何数据,二进制流由含几何WKB信息的BLOB值表示。

WKB使用1字节无符号整数、4字节无符号整数、以及8字节双精度数(IEEE 754格式)。1字节等于8比特。

例如,与POINT(1 1)对应的WKB值由下述21字节序列构成(在此,每个字节由2个十六进制数值表示):

0101000000000000000000F03F000000000000F03F

该序列可分为下述部分:

Byte order : 01
WKB type   : 01000000
X          : 000000000000F03F
Y          : 000000000000F03F

表示如下:

·         字节顺序(Byte order)可以是01,分别表明little-endianbig-endian存储。little-endianbig-endian字节顺序也分别称为网络数据表示(NDR)和外部数据表示(XDR)。

·         WKB type”(WKB类型)是指明几何类型的代码。取值从17,分别表示PointLineStringPolygonMultiPointMultiLineStringMultiPolygon、和GeometryCollection

·         Point值具有XY坐标,每个值均用双精度值表示。

对于更复杂几何值的WKB值,它们是由更复杂的数据结构表示的,详情请参见OpenGIS规范。

19.4. 创建具备空间功能的MySQL数据库

19.4.1. MySQL空间数据类型
19.4.2. 创建空间值
19.4.3. 创建空间列
19.4.4. 填充空间列
19.4.5. 获取空间数据
本节介绍了可用于表示MySQL中空间数据的数据类型,以及用于创建和检索空间值的函数。

19.4.1. MySQL空间数据类型

MySQL具有与OpenGIS类对应的数据类型。某些类型只能保存单个几何值:

·         GEOMETRY

·         POINT

·         LINESTRING

·         POLYGON

GEOMETRY能够保存任何类型的几何值。其他的单值类型POINTLINESTRING以及POLYGON只能保存特定几何类型的值。

其他数据类型能保存多个值:

·         MULTIPOINT

·         MULTILINESTRING

·         MULTIPOLYGON

·         GEOMETRYCOLLECTION

GEOMETRYCOLLECTION能保存任意类型的对象集合。对于其他集合类型,MULTIPOINTMULTILINESTRINGMULTIPOLYGONGEOMETRYCOLLECTION,仅限于具有特定几何类型的集合成员。

19.4.2. 创建空间值

19.4.2.1. 使用WKT函数创建Geometry(几何)值
19.4.2.2. 使用WKB函数创建Geometry(几何)值
19.4.2.3. 使用MySQL函数创建几何值
在本节中,介绍了使用OpenGIS标准中定义的WKTWKB函数创建空间值的方法,以及使用相应MySQL函数的方法。

19.4.2.1. 使用WKT函数创建Geometry(几何)值

MySQL提供了众多以WKT表达式、以及可选的空间参考系IDSRID)为输入参数的函数。它们将返回对应的几何对象。

GeomFromText()接受任何几何类型的WKT作为其第1个参量。在实施方案中也提供了与类型相关的构造函数,用于构造每一种几何类型的几何值。

  • GeomCollFromText(wkt[,srid]) , GeometryCollectionFromText(wkt[,srid])

    使用其WKT表示和SRID构造GEOMETRYCOLLECTION值。

  • GeomFromText(wkt[,srid]) , GeometryFromText(wkt[,srid])

    使用其WKT表示和SRID构造任何类型的几何值。

  • LineFromText(wkt[,srid]) , LineStringFromText(wkt[,srid])

    使用其WKT表示和SRID构造LINESTRING值。

  • MLineFromText(wkt[,srid]) , MultiLineStringFromText(wkt[,srid])

    使用其WKT表示和SRID构造MULTILINESTRING值。

  • MPointFromText(wkt[,srid]) , MultiPointFromText(wkt[,srid])

    使用其WKT表示和SRID构造MULTIPOINT值。

  • MPolyFromText(wkt[,srid]) , MultiPolygonFromText(wkt[,srid])

    使用其WKT表示和SRID构造MULTIPOLYGON值。

  • PointFromText(wkt[,srid])

    使用其WKT表示和SRID构造POINT值。

  • PolyFromText(wkt[,srid]) , PolygonFromText(wkt[,srid])

    使用其WKT表示和SRID构造POLYGON值。

OpenGIS规范还介绍了用于构造PolygonMultiPolygon值的可选函数,这些值基于环和封闭LineString值集合的WKT表达式。这些值可以相交。MySQL未实施下述函数:

  • BdMPolyFromText(wkt,srid)

    以包含已关闭LineString值任意集合的WKT格式,从MultiLineString值构造MultiPolygon值。

  • BdPolyFromText(wkt,srid)

    以包含已关闭LineString值任意集合的WKT格式,从MultiLineString值构造Polygon值。

19.4.2.2. 使用WKB函数创建Geometry(几何)值

MySQL提供了众多函数,它们将包含WKT表达式、或可选的空间参考系统IDSRID)的BLOB作为输入参数。它们返回对应的几何对象。

GeomFromWKB()接受任何几何类型的WKB作为其第1个参量。在实施方案中也提供了与类型相关的构造函数,用于构造每一种几何类型的几何值。
  • GeomCollFromWKB(wkb[,srid]) , GeometryCollectionFromWKB(wkb[,srid])

    使用其WKB表示和SRID构造GEOMETRYCOLLECTION值。

  • GeomFromWKB(wkb[,srid]) , GeometryFromWKB(wkb[,srid])

    使用其WKB表示和SRID构造任意类型的几何值。

  • LineFromWKB(wkb[,srid]) , LineStringFromWKB(wkb[,srid])

    使用其WKB表示和SRID构造LINESTRING值。

  • MLineFromWKB(wkb[,srid]) , MultiLineStringFromWKB(wkb[,srid])

    使用其WKB表示和SRID构造MULTILINESTRING值。

  • MPointFromWKB(wkb[,srid]) , MultiPointFromWKB(wkb[,srid])

    使用其WKB表示和SRID构造MULTIPOINT值。

  • MPolyFromWKB(wkb[,srid]) , MultiPolygonFromWKB(wkb[,srid])

    使用其WKB表示和SRID构造MULTIPOLYGON值。

  • PointFromWKB(wkb[,srid])

    使用其WKB表示和SRID构造POINT值。

  • PolyFromWKB(wkb[,srid]) , PolygonFromWKB(wkb[,srid])

    使用其WKB表示和SRID构造POLYGON值。

OpenGIS规范还介绍了用于构造PolygonMultiPolygon值的可选函数,这些值基于环和封闭LineString值集合的WKB表达式。这些值可以相交。MySQL未实施下述函数:

  • BdMPolyFromWKB(wkb,srid)

    以包含已关闭LineString值任意集合的WKB格式,从MultiLineString值构造MultiPolygon值。

  • BdPolyFromWKB(wkb,srid)

    以包含已关闭LineString值任意集合的WKB格式,从MultiLineString值构造Polygon值。

19.4.2.3. 使用MySQL函数创建几何值

注释:MySQL未实施本节所列的函数。

MySQL为创建几何WKB表达式提供了有用的函数集合。本节介绍的函数是对OpenGIS规范的MySQL扩展。这些函数的结果是包含几何值(无SRID)的BLOB值。这些函数的结果可被GeomFromWKB()函数系列中任意函数的第1个参量取代。
  • GeometryCollection(g1,g2,...)

    构造WKB GeometryCollection。如果任何参量不是构造良好的几何对象WKB表达式,返回值为NULL

  • LineString(pt1,pt2,...)

    从多个WKB Point参量构造WKB LineString。如果任何参量不是WKB Point,返回值为NULL。如果Point参量的数目小于2,返回值为NULL

  • MultiLineString(ls1,ls2,...)

    使用WKB LineString参量构造WKB MultiLineString。如果任何参量不是WKB LineString,返回值为NULL

  • MultiPoint(pt1,pt2,...)

    使用WKB Point参量构造WKB MultiPoint值。如果任何参量不是WKB Point,返回值为NULL

  • MultiPolygon(poly1,poly2,...)

    从一组WKB Polygon参量构造WKB MultiPolygon值。如果任何参量不是WKB Polygon,返回值为NULL

  • Point(x,y)

    使用其坐标构造WKB Point

  • Polygon(ls1,ls2,...)

    从多个WKB LineString参量构造WKB Polygon值。如果任何参量未表示为LinearRingWKB形式(即,非封闭和简单LineString,返回值为NULL

19.4.3. 创建空间列

MySQL提供了为几何类型创建空间列的标准方法,例如,使用CREATE TABLEALTER TABLE。目前,仅对MyISAM标支持空间列。

·         使用CREATE TABLE语句创建具有空间列的表:

·                mysql> CREATE TABLE geom (g GEOMETRY);
·                Query OK, 0 rows affected (0.02 sec)

·         使用ALTER TABLE语句在已有表中增加空间列,或将空间列从已有表中删除:

·                mysql> ALTER TABLE geom ADD pt POINT;
·                Query OK, 0 rows affected (0.00 sec)
·                Records: 0  Duplicates: 0  Warnings: 0
·                mysql> ALTER TABLE geom DROP pt;
·                Query OK, 0 rows affected (0.00 sec)
·                Records: 0  Duplicates: 0  Warnings: 0

19.4.4. 填充空间列

创建了空间列后,可用空间数据填充它们。

值应以内部几何格式保存,但你也能将其从WKTWKB格式转换为内部几何格式。在下面的示例中,介绍了通过将WKT值转换为内部几何格式以便将几何值插入表中的方法。

你可以在INSERT语句中执行直接转换操作:

INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));
 
SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (GeomFromText(@g));

也可以在INSERT之前执行转换操作:

SET @g = GeomFromText('POINT(1 1)');
INSERT INTO geom VALUES (@g);

在下面的示例中,将多个复杂的几何值插入到了表中:

SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (GeomFromText(@g));
 
SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INSERT INTO geom VALUES (GeomFromText(@g));
 
SET @g =
'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (GeomFromText(@g));

在前面的所有示例中,均采用了GeomFromText()来创建几何值。你也可以使用与类型相关的函数:

SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (PointFromText(@g));
 
SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (LineStringFromText(@g));
 
SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INSERT INTO geom VALUES (PolygonFromText(@g));
 
SET @g =
'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (GeomCollFromText(@g));

注意,如果客户端应用程序打算使用几何值的WKB表示,它需要在队列中将正确构造的WKB发送至服务器。但是,存在数种满足该要求的方法。例如:

·         用十六进制文字语法插入POINT(1 1)值:

·                mysql> INSERT INTO geom VALUES
·                    -> (GeomFromWKB(0x0101000000000000000000F03F000000000000F03F));

·         ODBC应用程序能够发送WKB表达式,并使用具有BLOB类型的参量将其绑定到占位符:

·                INSERT INTO geom VALUES (GeomFromWKB(?))

其他编程接口或许也支持类似的占位符机制。

C程序中,可以使用mysql_real_escape_string()转义二进制值,并将结果包含在将发送至服务器的查询字符串。请参见25.2.3.52节,“mysql_real_escape_string()”

19.4.5. 获取空间数据

19.4.5.1. 以内部格式获取空间数据
19.4.5.2. 以WKT格式获取空间数据
19.4.5.3. 以格式获取空间数据
对于表中保存的几何值,能够以内部格式获取。你也能将其转换为WKTWKB格式。

19.4.5.1. 以内部格式获取空间数据

在表对表传输中,使用内部格式来获取几何值可能是有用的。
CREATE TABLE geom2 (g GEOMETRY) SELECT g FROM geom;

19.4.5.2. 以WKT格式获取空间数据

AsText()函数能够将几何值从内部格式转换为WKT字符串。
SELECT AsText(g) FROM geom;

19.4.5.3. 以格式获取空间数据

AsBinary()函数能够将几何值从内部格式转换为包含WKB值的BLOB
SELECT AsBinary(g) FROM geom;

19.5. 分析空间信息

19.5.1. Geometry格式转换函数
19.5.2. Geometry函数
19.5.3. 从已有Geometry创建新Geometry的函数
19.5.4. 测试几何对象间空间关系的函数
19.5.5. 关于几何最小边界矩形(MBR)的关系
19.5.6. 测试几何类之间空间关系的函数
用值填充了空间列后,即可查询和分析它们。MySQL提供了一组在空间数据上执行各种操作的函数。根据它们所执行的操作类型,可以将这些函数分为四种主要类别:

·         用于在各种格式间转换几何值的函数。

·         用于访问几何值定性或定量属性的函数。

·         描述两种几何值之间关系的函数。

·         从已有Geometry创建新Geometry的函数

空间分析函数可用于很多场合下,如:

·         任何交互式SQL程序,如mysqlMySQLCC

·         以任何语言编写的、支持MySQL客户端API的应用程序。

19.5.1. Geometry格式转换函数

MySQL支持下述用于在内部格式和WKTWKB格式间转换几何值的函数:

  • AsBinary(g)

    将采用内部几何格式的值转换为其WKB表示,并返回二进制结果。

    SELECT AsBinary(g) FROM geom;
    
  • AsText(g)

    将采用内部几何格式的值转换为其WKT表示,并返回字符串结果。

    mysql> SET @g = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(GeomFromText(@g));
    +--------------------------+
    | AsText(GeomFromText(@g)) |
    +--------------------------+
    | LINESTRING(1 1,2 2,3 3)  |
    +--------------------------+
    
  • GeomFromText(wkt[,srid])

    将字符串值从其WKT表示转换为内部几何格式,并返回结果。也支持多种与类型相关的函数,如PointFromText()LineFromText()请参见19.4.2.1节,“使用WKT函数创建Geometry(几何)值”

  • GeomFromWKB(wkb[,srid])

    将二进制值从其WKB表示转换为内部几何格式,并返回结果。也支持多种与类型相关的函数,如PointFromWKB()LineFromWKB(),请参见19.4.2.2节,“使用WKB函数创建Geometry(几何)值”

19.5.2. Geometry函数

19.5.2.1. 通用几何函数
19.5.2.2. Point函数
 
19.5.2.3. LineString函数
19.5.2.4. MultiLineString函数
19.5.2.5. Polygon函数
19.5.2.6. MultiPolygon函数
19.5.2.7. GeometryCollection函数
属于该组的每个函数均将几何值作为其参量,并返回几何值的定性或定量属性。某些函数限制了其参量类型。如果参量是不正确的几何类型,这类函数将返回NULL。例如,如果对象类型既不是Polygon也不是MultiPolygonArea()将返回NULL

19.5.2.1. 通用几何函数

本节列出的函数不限制其参量,可接受任何类型的几何值。

  • Dimension(g)

    返回几何值g的固有维数。结果可以是-1012。(关于这些值的含义,请参见19.2.2节,“类Geometry”)。

    mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)'));
    +------------------------------------------------+
    | Dimension(GeomFromText('LineString(1 1,2 2)')) |
    +------------------------------------------------+
    |                                              1 |
    +------------------------------------------------+
    
  • Envelope(g)

    返回几何值g的最小边界矩形(MBR)。结果以Polygon值的形式返回。

    多边形(polygon)是由边界框的顶点定义的:
    POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
    
    mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)')));
    +-------------------------------------------------------+
    | AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))) |
    +-------------------------------------------------------+
    | POLYGON((1 1,2 1,2 2,1 2,1 1))                        |
    +-------------------------------------------------------+
    
  • GeometryType(g)

    以字符串形式返回几何类型的名称,几何实例g是几何类型的成员。该名称与可实例化几何子类之一对应。

    mysql> SELECT GeometryType(GeomFromText('POINT(1 1)'));
    +------------------------------------------+
    | GeometryType(GeomFromText('POINT(1 1)')) |
    +------------------------------------------+
    | POINT                                    |
    +------------------------------------------+
    
  • SRID(g)

    返回指明了几何值g的空间参考系统ID的整数。

    MySQL中,SRID值仅是与几何值相关的整数。所有计算均是在欧几里得(平面)几何中进行的。

    mysql> SELECT SRID(GeomFromText('LineString(1 1,2 2)',101));
    +-----------------------------------------------+
    | SRID(GeomFromText('LineString(1 1,2 2)',101)) |
    +-----------------------------------------------+
    |                                           101 |
    +-----------------------------------------------+
    

OpenGIS规范还定义了下述函数,MySQL未实施这类函数:

  • Boundary(g)

    返回几何值g的组合边界的闭包的几何对象。

  • IsEmpty(g)

    如果几何值g为空的几何对象,返回1,如果非空,返回0,如果参量为NULL,返回-1。如果几何对象是空的,它表示空的点集合。

  • IsSimple(g)

    目前该函数是占位符,不应使用它。如果实施了它,其行为与下段所给出的描述类似。

    如果几何值g没有异常的几何点(如自相交或自相切),返回1。如果参量不是简单参量,IsSimple()返回0,如果参量是NULL,返回-1。

    对于本章前面介绍的每个可实例化几何类,均包含特定的条件,这类条件会使类实例被分类为非简单的。

19.5.2.2. Point函数
 

PointXY坐标构成,可使用下述函数获得它们:

  • X(p)

    以双精度数值返回点pX坐标值。

    mysql> SELECT X(GeomFromText('Point(56.7 53.34)'));
    +--------------------------------------+
    | X(GeomFromText('Point(56.7 53.34)')) |
    +--------------------------------------+
    |                                 56.7 |
    +--------------------------------------+
    
  • Y(p)

    以双精度数值返回点pY坐标值。

    mysql> SELECT Y(GeomFromText('Point(56.7 53.34)'));
    +--------------------------------------+
    | Y(GeomFromText('Point(56.7 53.34)')) |
    +--------------------------------------+
    |                                53.34 |
    +--------------------------------------+
    

19.5.2.3. LineString函数

LineStringPoint值组成。你可以提取LineString的特定点,计数它所包含的点数,或获取其长度。

  • EndPoint(ls)

    返回LineString1s的最后一个点的Point

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(EndPoint(GeomFromText(@ls)));
    +-------------------------------------+
    | AsText(EndPoint(GeomFromText(@ls))) |
    +-------------------------------------+
    | POINT(3 3)                          |
    +-------------------------------------+
    
  • GLength(ls)

    以双精度数值返回LineString1s在相关的空间参考系中的长度。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT GLength(GeomFromText(@ls));
    +----------------------------+
    | GLength(GeomFromText(@ls)) |
    +----------------------------+
    |            2.8284271247462 |
    +----------------------------+
    
  • NumPoints(ls)

    返回LineString1s中的点数。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT NumPoints(GeomFromText(@ls));
    +------------------------------+
    | NumPoints(GeomFromText(@ls)) |
    +------------------------------+
    |                            3 |
    +------------------------------+
    
  • PointN(ls,n)

    返回LineString1s中的第n个点。点编号从1开始。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(PointN(GeomFromText(@ls),2));
    +-------------------------------------+
    | AsText(PointN(GeomFromText(@ls),2)) |
    +-------------------------------------+
    | POINT(2 2)                          |
    +-------------------------------------+
    
  • StartPoint(ls)

    返回LineString1s的第一个点的Point

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(StartPoint(GeomFromText(@ls)));
    +---------------------------------------+
    | AsText(StartPoint(GeomFromText(@ls))) |
    +---------------------------------------+
    | POINT(1 1)                            |
    +---------------------------------------+
    

OpenGIS规范还定义了下述函数,MySQL尚未实施这些函数:

  • IsRing(ls)

    如果LineStringls是封闭的(即其StartPoint()EndPoint()值相同)和简单的(未通过相同的点1次以上)返回1。如果ls不是环,返回0,如果它是NULL,返回-1

19.5.2.4. MultiLineString函数

  • GLength(mls)

    以双精度数值形式返回MultiLineStringm1s的长度。mls的长度等于其元素的长度之和。

    mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))';
    mysql> SELECT GLength(GeomFromText(@mls));
    +-----------------------------+
    | GLength(GeomFromText(@mls)) |
    +-----------------------------+
    |             4.2426406871193 |
    +-----------------------------+
    
  • IsClosed(mls)

    如果MultiLineStringm1s是封闭的(即StartPoint()EndPoint()值对m1s中的每个LineString是相同的)返回1。如果mls是非封闭的,返回0,如果它是NULL,返回-1

    mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))';
    mysql> SELECT IsClosed(GeomFromText(@mls));
    +------------------------------+
    | IsClosed(GeomFromText(@mls)) |
    +------------------------------+
    |                            0 |
    +------------------------------+
    

19.5.2.5. Polygon函数

  • Area(poly)

    以双精度数值形式返回Polygonpoly的面积,根据在其空间参考系中的测量值。

    mysql> SET @poly = 'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1 1))';
    mysql> SELECT Area(GeomFromText(@poly));
    +---------------------------+
    | Area(GeomFromText(@poly)) |
    +---------------------------+
    |                         4 |
    +---------------------------+
    
  • ExteriorRing(poly)

    LineString形式返回Polygonpoly的外环。

    mysql> SET @poly =
        -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';
    mysql> SELECT AsText(ExteriorRing(GeomFromText(@poly)));
    +-------------------------------------------+
    | AsText(ExteriorRing(GeomFromText(@poly))) |
    +-------------------------------------------+
    | LINESTRING(0 0,0 3,3 3,3 0,0 0)           |
    +-------------------------------------------+
    
  • InteriorRingN(poly,n)

    LineString形式返回Polygonpoly的第n个内环。环编号从1开始。

    mysql> SET @poly =
        -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';
    mysql> SELECT AsText(InteriorRingN(GeomFromText(@poly),1));
    +----------------------------------------------+
    | AsText(InteriorRingN(GeomFromText(@poly),1)) |
    +----------------------------------------------+
    | LINESTRING(1 1,1 2,2 2,2 1,1 1)              |
    +----------------------------------------------+
    
  • NumInteriorRings(poly)

    返回Polygonpoly的内环的数目。

    mysql> SET @poly =
        -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';
    mysql> SELECT NumInteriorRings(GeomFromText(@poly));
    +---------------------------------------+
    | NumInteriorRings(GeomFromText(@poly)) |
    +---------------------------------------+
    |                                     1 |
    +---------------------------------------+
    

19.5.2.6. MultiPolygon函数

  • Area(mpoly)

    以双精度数值形式返回MultiPolygonmpoly的面积,根据在其空间参考系中的测量结果。

    mysql> SET @mpoly =
        -> 'MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))';
    mysql> SELECT Area(GeomFromText(@mpoly));
    +----------------------------+
    | Area(GeomFromText(@mpoly)) |
    +----------------------------+
    |                          8 |
    +----------------------------+
    

OpenGIS规范还定义了下述函数,MySQL未实施这类函数:

  • Centroid(mpoly)

    Point形式返回用于MultiPolygonmpoly的数学质心。不保证结果位于MultiPolygon上。

  • PointOnSurface(mpoly)

    返回Point值,保证该值位于MultiPolygonmpoly上。

19.5.2.7. GeometryCollection函数

  • GeometryN(gc,n)

    返回GeometryCollectiongc中第n个几何对象。几何对象的编号从1开始。

    mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2, 3 3))';
    mysql> SELECT AsText(GeometryN(GeomFromText(@gc),1));
    +----------------------------------------+
    | AsText(GeometryN(GeomFromText(@gc),1)) |
    +----------------------------------------+
    | POINT(1 1)                             |
    +----------------------------------------+
    
  • NumGeometries(gc)

    返回GeometryCollectiongc中几何对象的数目。

    mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2, 3 3))';
    mysql> SELECT NumGeometries(GeomFromText(@gc));
    +----------------------------------+
    | NumGeometries(GeomFromText(@gc)) |
    +----------------------------------+
    |                                2 |
    +----------------------------------+
    

19.5.3. 从已有Geometry创建新Geometry的函数

19.5.3.1. 生成新Geometry的Geometry函数
19.5.3.2. 空间操作符

19.5.3.1. 生成新Geometry的Geometry函数

19.5.2节,“Geometry函数”中,我们讨论了一些可从已有几何对象构造新几何对象的函数:

  • Envelope(g)

  • StartPoint(ls)

  • EndPoint(ls)

  • PointN(ls,n)

  • ExteriorRing(poly)

  • InteriorRingN(poly,n)

  • GeometryN(gc,n)

19.5.3.2. 空间操作符

OpenGIS建议了很多可生成几何对象的其他函数。它们是为实施空间操作符而设计的。

MySQL中未实施这些函数。它们或许会在未来的版本中出现。

  • Buffer(g,d)

    返回几何对象,该对象代表所有距几何值g的距离小于或等于d的所有点。

  • ConvexHull(g)

    返回几何对象,该对象代表几何值g的凸包。

  • Difference(g1,g2)

    返回几何对象,该对象表示了几何值g1g2的点集合差异。

  • Intersection(g1,g2)

    返回几何对象,该对象表示了几何值g1g2的点集合交集。

  • SymDifference(g1,g2)

    返回几何对象,该对象表示了几何值g1g2的点集合对称差。

  • Union(g1,g2)

    返回几何对象,该对象表示了几何值g1g2的点集合联合。

19.5.4. 测试几何对象间空间关系的函数

这些节中所介绍的函数以2个几何对象作为输入参数,并返回它们之间的定量或定性关系。

19.5.5. 关于几何最小边界矩形(MBR)的关系

MySQL提供了一些可测试两个几何对象g1g2最小边界矩形之间关系的函数。它们包括:

  • MBRContains(g1,g2)

    返回10以指明g1的最小边界矩形是否包含g2的最小边界矩形。

    mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    mysql> SET @g2 = GeomFromText('Point(1 1)');
    mysql> SELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);
    ----------------------+----------------------+
    | MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |
    +----------------------+----------------------+
    |                    1 |                    0 |
    +----------------------+----------------------+
    
  • MBRDisjoint(g1,g2)

    返回10以指明两个几何变量g1g2的最小边界矩形是否不相交。

  • MBREqual(g1,g2)

    返回10以指明两个几何变量g1g2的最小边界矩形是否相同。

  • MBRIntersects(g1,g2)

    返回10以指明两个几何变量g1g2的最小边界矩形是否相交。

  • MBROverlaps(g1,g2)

    返回10以指明两个几何变量g1g2的最小边界矩形是否交迭。

  • MBRTouches(g1,g2)

    返回10以指明两个几何变量g1g2的最小边界矩形是否接触。

  • MBRWithin(g1,g2)

    返回10以指明g1的最小边界矩形是否位于g2的最小边界矩形内。

    mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    mysql> SET @g2 = GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))');
    mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);
    +--------------------+--------------------+
    | MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |
    +--------------------+--------------------+
    |                  1 |                  0 |
    +--------------------+--------------------+
    

19.5.6. 测试几何类之间空间关系的函数

OpenGIS规范定义了下述函数。目前在MySQL尚未按照规范实施它们。对于那些已实施的函数,它们返回的结果与对应的基于MBR的函数返回的相同。包括下面列出的函数,但Distance()Related()除外。

在未来的版本中,可能会实施这些函数,为空间分析提供全部支持,而不仅仅是基于MBR的支持。

这些函数作用在2个几何值g1g2上。

  • Contains(g1,g2)

    返回10以指明g1是否完全包含g2

  • Crosses(g1,g2)

    如果g1在空间上与g2相交,返回1。如果g1为PolygonMultiPolygon,返回NULL,或如果g2PointMultiPoint返回NULL。否则,返回0。

    术语“空间上交叉”指的是2个给定几何对象之间的空间关系,它具有下述属性:

    o        2个结合对象交叉。

    o        其交叉结果将导致其维数小于两个给定几何对象最大维数的几何对象。

    o        其交叉不等于两个几何对象中的任何1个。

  • Disjoint(g1,g2)

    返回10以指明g1是否与g2从空间上不相交。

  • Distance(g1,g2)

    以双精度数值形式返回2个几何对象中2点间的最短距离。

  • Equals(g1,g2)

    返回10以指明g1是否从空间上等同于g2

  • Intersects(g1,g2)

    返回10以指明g1是否从空间上与g2相交。

  • Overlaps(g1,g2)

    返回10以指明g1是否从空间上与g2交迭。如果2个几何对象交叉而且其交叉将导致具有相同维数但并不等同于任一几何对象的几何对象,将使用术语“空间交迭”。

  • Related(g1,g2,pattern_matrix)

    返回10以指明由pattern_matrix指定的空间关系是否在g1g2间存在。如果参量为NULL返回-1。模式矩形为字符串。如果实施了该函数,其规范将在此给出。

  • Touches(g1,g2)

    返回10以指明g1是否从空间上与g2接触。如果几何对象的内部不交叉,但1个几何对象的边界与另一个的边界或内部交叉,这两个几何对象是从空间上接触的。

  • Within(g1,g2)

    返回10以指明g1是否从空间上位于g2内。

19.6. 优化空间分析

19.6.1. 创建空间索引
19.6.2. 使用空间索引
可以使用索引对2个非空间数据库中的搜索操作进行优化。对于空间数据库,这同样成立。有了以前设计的大量多维索引功能的帮助,能够对空间搜索进行优化。最典型的情况如下:

·         搜索包含给定点的所有对象的Point查询。

·         搜索与给定地区交迭的所有对象的地区查询。

MySQL采用了具有2次分裂特性的R-Trees来为空间列编制索引。使用几何对象的MBR来创建空间索引。对于大多数几何对象,MBR是包围几何对象的最小矩形。对于水平或垂直linestringMBR退化为linestring的矩形。对于点,MBR是退化为点的矩形。

此外,还能在空间列上创建正常索引。需要为除POINT列之外的空间列上的任何索引(非空间)声明前缀。

19.6.1. 创建空间索引

MySQL能够使用与创建正规索引类似的语法创建空间索引,但使用了SPATIAL关键字进行了扩展。对于目前编制了索引的空间列,必须将其声明为NOT NULL。在下面的示例中,介绍了创建空间索引的方法。

·         对于CREATE TABLE

·                mysql> CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g));

·         对于ALTER TABLE

·                mysql> ALTER TABLE geom ADD SPATIAL INDEX(g);

·         对于CREATE INDEX

·                mysql> CREATE SPATIAL INDEX sp_index ON geom (g);

对于MyISAM表,SPATIAL INDEX负责创建R-tree索引。对于支持空间索引的其他存储引擎,SPATIAL INDEX能够创建B-tree索引。对于准确的值查找而不是范围扫描,作用在空间值上的B-tree索引很有用。

要想撤销空间索引,可使用ALTER TABLEDROP INDEX

·         对于ALTER TABLE

·                mysql> ALTER TABLE geom DROP INDEX g;

·         对于DROP INDEX

·                mysql> DROP INDEX sp_index ON geom;

示例:假定表geom包含32000以上的几何对象,它们保存在类型为GEOMETRY的列g中。该表还有用于保存对象ID值的AUTO_INCREMENT列。

mysql> DESCRIBE geom;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| fid   | int(11)  |      | PRI | NULL    | auto_increment |
| g     | geometry |      |     |         |                |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> SELECT COUNT(*) FROM geom;
+----------+
| count(*) |
+----------+
|    32376 |
+----------+
1 row in set (0.00 sec)

要想在列g上添加空间索引,可使用下述语句:

mysql> ALTER TABLE geom ADD SPATIAL INDEX(g);
Query OK, 32376 rows affected (4.05 sec)
Records: 32376  Duplicates: 0  Warnings: 0

19.6.2. 使用空间索引

优化程序将调查可用的空间索引是否能包含在使用某些函数的查询搜索中,如WHERE子句中的MBRContains()MBRWithin()函数。例如,假定我们打算找出位于给定矩形中的所有对象:

mysql> SELECT fid,AsText(g) FROM geom WHERE
mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g);
+-----+-----------------------------------------------------------------------------+
| fid | AsText(g)                                                                   |
+-----+-----------------------------------------------------------------------------+
|  21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30333.8 15828.8)     |
|  22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8,30334 15871.4)     |
|  23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4,30334 15914.2)     |
|  24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4,30273.4 15823)     |
|  25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882.4,30274.8 15866.2) |
|  26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4,30275 15918.2)     |
| 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946.8,30320.4 15938.4) |
|   1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136.4,30240 15127.2)   |
|   2 | LINESTRING(30220.2 15122.8,30217.2 15137.8,30207.6 15136,30210.4 15121)     |
|   3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,30169 15113)           |
|   4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30157 15111.6)       |
|   5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4,30194.2 15075.2)   |
|   6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,30244.6 15077)         |
|   7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8,30201.2 15049.4)   |
|  10 | LINESTRING(30179.6 15017.8,30181 15002.8,30190.8 15003.6,30189.6 15019)     |
|  11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2,30151.2 15009.8)   |
|  13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,30114.6 15067.8)       |
| 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30278 15134)         |
| 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30259 15083.4)       |
| 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4,30128.8 15001)     |
+-----+-----------------------------------------------------------------------------+
20 rows in set (0.00 sec)

我们使用EXPLAIN来检查该查询的执行方式(ID列已被删除,以便输出能更好地与页匹配)

mysql> EXPLAIN SELECT fid,AsText(g) FROM geom WHERE
mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g);
+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| SIMPLE      | geom  | range | g             | g    |      32 | NULL |   50 | Using where |
+-------------+-------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

让我们检查一下在没有空间索引的情况下会出现什么:

mysql> EXPLAIN SELECT fid,AsText(g) FROM g IGNORE INDEX (g) WHERE
mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g);
+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| SIMPLE      | geom  | ALL  | NULL          | NULL |    NULL | NULL | 32376 | Using where |
+-------------+-------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)

执行SELECT语句,忽略空间键:

mysql> SELECT fid,AsText(g) FROM geom IGNORE INDEX (g) WHERE
mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g);
+-----+-----------------------------------------------------------------------------+
| fid | AsText(g)                                                                   |
+-----+-----------------------------------------------------------------------------+
|   1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136.4,30240 15127.2)   |
|   2 | LINESTRING(30220.2 15122.8,30217.2 15137.8,30207.6 15136,30210.4 15121)     |
|   3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,30169 15113)           |
|   4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30157 15111.6)       |
|   5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4,30194.2 15075.2)   |
|   6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,30244.6 15077)         |
|   7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8,30201.2 15049.4)   |
|  10 | LINESTRING(30179.6 15017.8,30181 15002.8,30190.8 15003.6,30189.6 15019)     |
|  11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2,30151.2 15009.8)   |
|  13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,30114.6 15067.8)       |
|  21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30333.8 15828.8)     |
|  22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8,30334 15871.4)     |
|  23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4,30334 15914.2)     |
|  24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4,30273.4 15823)     |
|  25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882.4,30274.8 15866.2) |
|  26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4,30275 15918.2)     |
| 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30278 15134)         |
| 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30259 15083.4)       |
| 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4,30128.8 15001)     |
| 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946.8,30320.4 15938.4) |
+-----+-----------------------------------------------------------------------------+
20 rows in set (0.46 sec)

未使用索引时,该查询的执行时间将从0.00秒上升到0.46秒。

在未来的版本中,空间索引也可能会用于优化其他函数。请参见19.5.4节,“测试几何对象间空间关系的函数”。

19.7. MySQL的一致性和兼容性

19.7.1. 尚未实施的GIS特性

19.7.1. 尚未实施的GIS特性

  • 额外的元数据视图

    OpenGIS规范建议了数种额外的元数据视图。例如,包含几何列的描述的名为GEOMETRY_COLUMNS的系统视图,对于数据库中的每列有1行相关内容。

  • 作用在LineStringMultiLineString上的OpenGIS函数Length()目前应在MySQL中以GLength()的方式调用。

    问题在于存在1个用于计算字符串值长度的已有SQL函数Length(),而且在某些情况下无法判断函数是在文本场景下还是空间场景下调用的。我们需要以某种方式解决该问题,或确定另一个函数名。


这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。

上一篇:下一篇: