目录 搜索
目录 前言 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模式下运行MySQL 1.8.4. MySQL对标准SQL的扩展 1.8.5. MySQL与标准SQL的差别 1.8.6. MySQL处理约束的方式 2. 安装MySQL 2.1. 一般安装问题 2.1.1. MySQL支持的操作系统 2.1.2. 选择要安装的MySQL分发版 2.1.3. 怎样获得MySQL 2.1.4. 通过MD5校验和或GnuPG验证软件包的完整性 2.1.5. 安装布局 2.2. 使用二进制分发版的标准MySQL安装 2.3. 在Windows上安装MySQL 2.3.1. Windows系统要求 2.3.2. 选择安装软件包 2.3.3. 用自动安装器安装MySQL 2.3.4. 使用MySQL安装向导 2.3.5. 使用配置向导 2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7. 在其它类Unix系统中安装MySQL 2.8. 使用源码分发版安装MySQL 2.8.1. 源码安装概述 2.8.2. 典型配置选项 2.8.3. 从开发源码树安装 2.8.4. 处理MySQL编译问题 2.8.5. MIT-pthreads注意事项 2.8.6. 在Windows下从源码安装MySQL 2.8.7. 在Windows下编译MySQL客户端 2.9. 安装后的设置和测试 2.9.1. Windows下安装后的过程 2.9.2. Unix下安装后的过程 2.9.3. 使初始MySQL账户安全 2.10. 升级MySQL 2.10.1. 从5.0版升级 2.10.2. 升级授权表 2.10.3. 将MySQL数据库拷贝到另一台机器 2.11. 降级MySQL 2.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中安装Perl 2.13.2. 在Windows下安装ActiveState Perl 2.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. 获得数据库和表的信息 NoName 3.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_INCREMENT 3.7. 孪生项目的查询 3.7.1. 查找所有未分发的孪生项 3.7.2. 显示孪生对状态的表 3.8. 与Apache一起使用MySQL 4. 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. 复制FAQ 6.10. 复制故障诊断与排除 6.11. 通报复制缺陷 6.12. 多服务器复制中的Auto-Increment 7. 优化 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 NULL 7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.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如何使用DNS 7.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语句中使用COLLATE 10.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. 用于元数据的UTF8 10.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. 其他函数 NoName 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. 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 TRANSACTION 13.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/O 15.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. 安装BDB 15.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. 创建存储引擎源文件 NoName 16.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. 关闭表 NoName NoName NoName 16.14. API引用 16.14.1. bas_ext 16.14.2. close 16.14.3. create 16.14.4. delete_row 16.14.5. delete_table 16.14.6. external_lock 16.14.7. extra 16.14.8. info 16.14.9. open 16.14.10. rnd_init 16.14.11. rnd_next 16.14.12. store_lock 16.14.13. update_row 16.14.14. write_row 17. 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. 类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特性 20. 存储程序和函数 20.1. 存储程序和授权表 20.2. 存储程序的语法 20.2.1. CREATE PROCEDURE和CREATE FUNCTION 20.2.2. ALTER PROCEDURE和ALTER FUNCTION 20.2.3. DROP PROCEDURE和DROP FUNCTION 20.2.4.SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION 20.2.5.SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS 20.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表 NoName 24. 精度数学 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 API 25.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 API 25.3.1. 使用MySQL和PHP的常见问题 25.4. MySQL Perl API 25.5. MySQL C++ API 25.5.1. Borland C++ 25.6. MySQL Python API 25.7. MySQL Tcl API 25.8. MySQL Eiffel Wrapper 25.9. MySQL程序开发实用工具 25.9.1. msql2mysql:转换mSQL程序以用于MySQL 25.9.2. mysql_config:获取编译客户端的编译选项 26. 连接器 26.1. MySQL Connector/ODBC 26.1.1. MyODBC介绍 26.1.2. 关于ODBC和MyODBC的一般信息 26.1.3. 如何安装MyODBC 26.1.4. 在Windows平台上从二进制版本安装MyODBC 26.1.5. I在Unix平台上从二进制版本安装MyODBC 26.1.6. 在Windows平台上从源码版本安装MyODBC 26.1.7. 在Unix平台上从源码版本安装MyODBC 26.1.8. 从BitKeeper开发源码树安装MyODBC 26.1.9. MyODBC配置 26.1.10. 与MyODBC连接相关的事宜 26.1.11. MyODBC和Microsoft Access 26.1.12. MyODBC和Microsoft VBA及ASP 26.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和RDO 26.1.20. MyODBC与Microsoft.NET 26.1.21. 感谢 26.2. MySQL Connector/NET 26.2.1. 前言 26.2.2. 下载并安装MySQL Connector/NET 26.2.3. Connector/NET体系结构 26.2.4. 使用MySQL Connector/NET 26.2.5. MySQL Connector/NET变更史 26.3. MySQL Connector/J 26.3.1. 基本的JDBC概念 26.3.2. 安装 Connector/J 26.3.3. JDBC引用 26.3.4. 与J2EE和其他Java框架一起使用 Connector/J 26.3.5. 诊断 Connector/J方面的问题 26.3.6. Changelog 26.4. MySQL Connector/MXJ 26.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 API 26.4.8. 在JMX代理(custom)中运行 26.4.9. 部署在标准的JMX代理环境下 (JBoss) 26.4.10. 安装 27. 扩展MySQL 27.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. 输入密码时出现密码错误 NoName A.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. 如何以普通用户身份运行MySQL A.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.sock A.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. 针对调试编译MySQL E.1.2. 创建跟踪文件 E.1.3. 在gdb环境下调试mysqld E.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。原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。

上一篇: 下一篇: