目录搜索
目录前言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许可例外索引
文字

第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. 亚洲字符集

本章讨论以下主题:

·         什么是字符集和校对规则?

·         多级默认系统

·         字符集语法

·         相关函数和运算

·         Unicode支持

·         每个字符集和校对规则的含义

MySQL5.1中的字符集支持包括在MyISAMMEMORYInnoDB存储引擎中。

10.1. 常规字符集和校对

字符集是一套符号和编码。校对规则是在字符集内用于比较字符的一套规则。让我们使用一个假想字符集的例子来区别清楚。

假设我们有一个字母表使用了四个字母:‘A’、‘B’、‘a’、‘b’。我们为每个字母赋予一个数值:‘A=0,‘B= 1,‘a= 2,‘b= 3。字母‘A’是一个符号,数字0是‘A’的编码,这四个字母和它们的编码组合在一起是一个字符集

假设我们希望比较两个字符串的值:‘A’和‘B’。比较的最简单的方法是查找编码:‘A’为0,‘B’为1。因为0 小于1,我们可以说‘A’小于‘B’。我们做的仅仅是在我们的字符集上应用了一个 校对规则。校对规则是一套规则(在这种情况下仅仅是一套规则):“对编码进行比较。”我们称这种全部可能的规则中的最简单的 校对规则为一个binary(二元)校对规则。

但是,如果我们希望小写字母和大写字母是等价的,应该怎样?那么,我们将至少有两个规则:(1)把小写字母‘a’和‘b’视为与‘A’和‘B’等价;(2)然后比较编码。我们称这是一个大小写不敏感的 校对规则。比二元校对规则复杂一些。

在实际生活中,大多数字符集有许多字符:不仅仅是‘A’和‘B’,而是整个字母表,有时候有许多种字母表,或者一个东方的使用上千个字符的书写系统,还有许多特殊符号和标点符号。并且在实际生活中,大多数 校对规则有许多个规则:不仅仅是大小写不敏感,还包括重音符不敏感(“重音符” 是附属于一个字母的符号,象德语的‘Ö’符号)和多字节映射(例如,作为规则‘Ö=OE’就是两个德语 校对规则的一种)。

MySQL5.1能够做这些事情:

·         使用多种字符集来存储字符串

·         使用多种校对规则来比较字符串

·         在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串

·         允许定义任何级别的字符集和校对规则

在这些方面,MySQL5.1不仅比MySQL4.1以前的版本灵活得多,而且比其它大多数数据库管理系统超前许多。但是,为了有效地使用这些功能,你需要了解哪些字符集和 校对规则是可用的,怎样改变默认值,以及它们怎样影响字符操作符和字符串函数的行为。

10.2. MySQL中的字符集和校对

MySQL服务器能够支持多种字符集。可以使用SHOW CHARACTER SET语句列出可用的字符集:

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | cp1252     West European    | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
| cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
...

(完整列表参见10.10节,“MySQL支持的字符集和校对”。)

任何一个给定的字符集至少有一个校对规则。它可能有几个校对规则。

要想列出一个字符集的校对规则,使用SHOW COLLATION语句。例如,要想查看latin1(“西欧ISO-8859-1)字符集的 校对规则,使用下面的语句查找那些名字以latin1开头的 校对规则:

mysql> SHOW COLLATION LIKE 'latin1%';
+---------------------+---------+----+---------+----------+---------+
| Collation           | Charset | Id | Default | Compiled | Sortlen |
+---------------------+---------+----+---------+----------+---------+
| latin1_german1_ci   | latin1  |  5 |         |          |       0 |
| latin1_swedish_ci   | latin1  |  8 | Yes     | Yes      |       1 |
| latin1_danish_ci    | latin1  | 15 |         |          |       0 |
| latin1_german2_ci   | latin1  | 31 |         | Yes      |       2 |
| latin1_bin          | latin1  | 47 |         | Yes      |       1 |
| latin1_general_ci   | latin1  | 48 |         |          |       0 |
| latin1_general_cs   | latin1  | 49 |         |          |       0 |
| latin1_spanish_ci   | latin1  | 94 |         |          |       0 |
+---------------------+---------+----+---------+----------+---------+

latin1校对规则有下面的含义:

校对规则

含义

latin1_german1_ci

德国DIN-1

latin1_swedish_ci

瑞典/芬兰

latin1_danish_ci

丹麦/挪威

latin1_german2_ci

德国 DIN-2

latin1_bin

符合latin1编码的二进制

latin1_general_ci

多种语言(西欧)

latin1_general_cs

多种语言(西欧ISO),大小写敏感

latin1_spanish_ci

现代西班牙

校对规则一般有这些特征:

·         两个不同的字符集不能有相同的校对规则。

·         每个字符集有一个默认校对规则。例如,latin1默认校对规则是latin1_swedish_ci

·         存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束。

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. 校对效果的示例
字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。以下描述可能显得复杂,但是在实际应用中可以发现使用多种级别会使结果自然而明显。

10.3.1. 服务器字符集和校对

MySQL服务器有一个服务器字符集和一个服务器校对规则,它们均不能设置为空。

MySQL按照如下方法确定服务器字符集和服务器校对规则:

·         当服务器启动时根据有效的选项设置

·         根据运行时的设定值

在服务器级别,确定方法很简单。当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同因为latin1_swedish_cilatin1默认校对规则。因此,以下三个命令有相同的效果:

shell> mysqld

shell> mysqld --default-character-set=latin1

shell> mysqld --default-character-set=latin1 \

           --default-collation=latin1_swedish_ci

更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset--with-collation作为configure的参量。例如:

shell> ./configure --with-charset=latin1

或者:

shell> ./configure --with-charset=latin1 \

           --with-collation=latin1_german1_ci

mysqldconfigure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。

当前的服务器字符集和校对规则可以用作character_set_servercollation_server系统变量的值。在运行时能够改变这些变量的值。

10.3.2. 数据库字符集和校对

每一个数据库有一个数据库字符集和一个数据库校对规则,它不能够为空。CREATE DATABASEALTER DATABASE语句有一个可选的子句来指定数据库字符集和校对规则:
CREATE DATABASE db_name
    [[DEFAULT] CHARACTER SET charset_name]
    [[DEFAULT] COLLATE collation_name]
 
ALTER DATABASE db_name
    [[DEFAULT] CHARACTER SET charset_name]
    [[DEFAULT] COLLATE collation_name]

例如:

CREATE DATABASE db_name
    DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;

MySQL这样选择数据库字符集和数据库校对规则:

·         如果指定了CHARACTER SET XCOLLATE Y,那么采用字符集X和校对规则Y

·         如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET XCHARACTER SET X的默认校对规则。

·         否则,采用服务器字符集和服务器校对规则。

MySQLCREATE DATABASE ... DEFAULT CHARACTER SET ...语法与标准SQLCREATE SCHEMA ... CHARACTER SET ...语法类似。因此,可以在同一个MySQL服务器上创建使用不同字符集和 校对规则的数据库。

如果在CREATE TABLE语句中没有指定表字符集和校对规则,则使用数据库字符集和校对规则作为默认值。它们没有其它目的。

默认数据库的字符集和校对规则可以用作character_set_databasecollation_database系统变量。无论何时默认数据库更改了,服务器都设置这两个变量的值。如果没有 默认数据库,这两个变量与相应的服务器级别的变量(character_set_servercollation_server)具有相同的值。

10.3.3. 表字符集和校对

每一个表有一个表字符集和一个校对规则,它不能为空。为指定表字符集和校对规则,CREATE TABLE ALTER TABLE语句有一个可选的子句:
CREATE TABLE tbl_name (column_list)
    [DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
 
ALTER TABLE tbl_name
    [DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]

例如:

CREATE TABLE t1 ( ... )

DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

MySQL按照下面的方式选择表字符集和 校对规则:

·         如果指定了CHARACTER SET XCOLLATE Y,那么采用CHARACTER SET XCOLLATE Y

·         如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET XCHARACTER SET X的默认校对规则。

·         否则,采用服务器字符集和服务器校对规则。

如果在列定义中没有指定列字符集和校对规则,则默认使用表字符集和校对规则。表字符集和校对规则是MySQL的扩展;在标准SQL中没有。

10.3.4. 列字符集和校对

每一个“字符”列(即,CHARVARCHARTEXT类型的列)有一个列字符集和一个列 校对规则,它不能为空。列定义语法有一个可选子句来指定列字符集和校对规则:
col_name {CHAR | VARCHAR | TEXT} (col_length)
    [CHARACTER SET charset_name [COLLATE collation_name]]

例如:

CREATE TABLE Table1

(

    column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci

);

MySQL按照下面的方式选择列字符集和校对规则:

·         如果指定了CHARACTER SET XCOLLATE Y,那么采用CHARACTER SET XCOLLATE Y

·         如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET XCHARACTER SET X的默认校对规则。

·         否则,采用表字符集和服务器校对规则。

CHARACTER SETCOLLATE子句是标准的SQL

10.3.5. 字符集和校对分配示例

以下例子显示了MySQL怎样确定默认字符集和校对规则。

示例1:表和列定义

CREATE TABLE t1
(
    c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci
) DEFAULT CHARACTER SET latin2 COLLATE latin2_bin;

在这里我们有一个列使用latin1字符集和latin1_german1_ci校对规则。是显式的定义,因此简单明了。需要注意的是,在一个latin2表中存储一个latin1列不会存在问题。

示例2:表和列定义

CREATE TABLE t1
(
    c1 CHAR(10) CHARACTER SET latin1
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

这次我们有一个列使用latin1字符集和一个默认校对规则。尽管它显得自然,默认校对规则却不是表级。相反,因为latin1的默认校对规则总是latin1_swedish_ci,列c1有一个校对规则latin1_swedish_ci(而不是latin1_danish_ci)。

示例3:表和列定义

CREATE TABLE t1
(
    c1 CHAR(10)
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

我们有一个列使用一个默认字符集和一个默认校对规则。在这种情况下,MySQL查找表级别来确定列字符集和 校对规则。因此,列c1的字符集是latin1,它的 校对规则是latin1_danish_ci

示例4:数据库、表和列定义

CREATE DATABASE d1
    DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci;
USE d1;
CREATE TABLE t1
(
    c1 CHAR(10)
);

我们创建了一个没有指定字符集和校对规则的列。我们也没有指定表级字符集和校对规则。在这种情况下,MySQL查找数据库级的相关设置。(数据库的设置变为表的设置,其后变为列的设置。)因此,列c1的字符集为是latin2它的 校对规则是latin2_czech_ci

10.3.6. 连接字符集和校对

一些字符集和校对规则系统变量与客户端和服务器的交互有关。在前面的章节中已经提到过部分内容:

·         服务器字符集和校对规则可以用作character_set_servercollation_server变量的值。

·         默认数据库的字符集和校对规则可以用作character_set_databasecollation_database变量的值。

在客户端和服务器的连接处理中也涉及了字符集和校对规则变量。每一个客户端有一个连接相关的字符集和校对规则变量。

考虑什么是一个“连接”:它是连接服务器时所作的事情。客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送响应给客户端,例如结果集。对于客户端连接,这样会导致一些关于连接的字符集和 校对规则的问题,这些问题均能够通过系统变量来解决:

·         当查询离开客户端后,在查询中使用哪种字符集?

服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。

·         服务器接收到查询后应该转换为哪种字符集?

转换时,服务器使用character_set_connectioncollation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级。

·         服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?

character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。

你能够调整这些变量的设置,或可以依赖默认值(这样,你可以跳过本章)。

有两个语句影响连接字符集:

SET NAMES 'charset_name'
SET CHARACTER SET charset_name

SET NAMES显示客户端发送的SQL语句中使用什么字符集。因此,SET NAMES 'cp1251'语句告诉服务器“将来从这个客户端传来的信息采用字符集cp1251。它还为服务器发送回客户端的结果指定了字符集。(例如,如果你使用一个SELECT语句它表示列值使用了什么字符集。)

SET NAMES 'x'语句与这三个语句等价:

mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET character_set_connection = x;

x设置为character_set_connection也就设置了collation_connectionx的默认校对规则。

SET CHARACTER SET语句是类似的,但是为 默认数据库设置连接字符集和校对规则。SET CHARACTER SET x语句与这三个语句等价:

mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET collation_connection = @@collation_database;

当一个客户端连接时,它向服务器发送希望使用的字符集名称。服务器为那个字符集设置character_set_clientcharacter_set_resultscharacter_set_connection变量。(实际上,服务器为使用该字符集执行一个SET NAMES操作。)

对于mysql客户端,如果你希望使用与默认字符集不同的字符集,不需要每次启动时执行SET NAMES语句。可以在mysql语句行中或者选项文件中添加一个--default-character-set选项设置。例如,你每次运行mysql时,以下的选项文件设置把三个字符集变量修改为koi8r

[mysql]

default-character-set=koi8r

例如:假设column1定义为CHAR(5) CHARACTER SET latin2。如果没有设定SET NAMESSET CHARACTER SET,那么对于SELECT column1 FROM t,当连接后,服务器使用客户端指定的字符集返回列column1的所有值。另一方面,如果你设定SET NAMES 'latin1'SET CHARACTER SET latin1,那么发送结果之前,服务器转换latin2值到latin1。转换可能会丢失那些不属于两种字符集的字符。

如果不希望服务器执行任何转换,设置character_set_resultsNULL

mysql> SET character_set_results = NULL;

10.3.7. 字符串文字字符集和校对

每一字符串字符文字有一个字符集和一个校对规则,它不能为空。

一个字符串文字可能有一个可选的字符集引介词和COLLATE子句:

[_charset_name]'string' [COLLATE collation_name]

例如:

SELECT 'string';
SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_ci;

对于简单的语句SELECT 'string',字符串使用由character_set_connectioncollation_connection系统变量定义的字符集和 校对规则。

_charset_name表达式正式称做一个引介词。它告诉解析程序,“后面将要出现的字符串使用字符集X”因为以前人们对此感到困惑,我们强调引介词不导致任何转换; 它仅是一个符号,不改变字符串的值。引介词在标准十六进制字母和数字十六进制符号(x'literal'0xnnnn)中是合法的,以及(当在一个编程语言接口中使用预处理的语句时进行参数替换)。

例如:

SELECT _latin1 x'AABBCC';
SELECT _latin1 0xAABBCC;
SELECT _latin1 ?;

MySQL这样确定一个文字字符集和校对规则:

·         如果指定了CHARACTER SET XCOLLATE Y,那么使用CHARACTER SET XCOLLATE Y

·         如果指定了CHARACTER SET X而没有指定COLLATE Y,那么使用CHARACTER SET XCHARACTER SET X的默认校对规则。

·         否则,使用通过character_set_connection collation_connection系统变量给出的字符集和 校对规则。

例如:

·         使用latin1字符集和latin1_german1_ci校对规则的字符串:

·                SELECT _latin1'Müller' COLLATE latin1_german1_ci;

·         使用latin1字符集和其默认校对规则的字符串(即,latin1_swedish_ci):

·                SELECT _latin1'Müller';

·         使用连接默认字符集和校对规则的字符串:

·                SELECT 'Müller';

字符集引介词和COLLATE子句是根据标准SQL规范实现的。

10.3.8. 在SQL语句中使用COLLATE

  • 使用COLLATE子句,能够为一个比较覆盖任何默认校对规则。COLLATE可以用于多种SQL语句中。下面是一些例子:

    ·         使用ORDER BY

    ·                SELECT k
    ·                FROM t1
    ·                ORDER BY k COLLATE latin1_german2_ci;

    ·         使用AS

    ·                SELECT k COLLATE latin1_german2_ci AS k1
    ·                FROM t1
    ·                ORDER BY k1;

    ·         使用GROUP BY

    ·                SELECT k
    ·                FROM t1
    ·                GROUP BY k COLLATE latin1_german2_ci;

    ·         使用聚合函数:

    ·                SELECT MAX(k COLLATE latin1_german2_ci)
    ·                FROM t1;

    ·         使用DISTINCT

    ·                SELECT DISTINCT k COLLATE latin1_german2_ci
    ·                FROM t1;

    ·         使用WHERE

    ·                     SELECT *
    ·                     FROM t1
    ·                     WHERE _latin1 'Müller' COLLATE latin1_german2_ci = k;
    ·                     SELECT *
    ·                     FROM t1
    ·                     WHERE k LIKE _latin1 'Müller' COLLATE latin1_german2_ci;

    ·         使用HAVING

    ·                SELECT k
    ·                FROM t1
    ·                GROUP BY k
    ·                HAVING k = _latin1 'Müller' COLLATE latin1_german2_ci;

10.3.9. COLLATE子句优先

COLLATE子句有较高的优先级(高于||),因此下面两个表达式是等价的:

x || y COLLATE z
x || (y COLLATE z)

10.3.10. BINARY操作符

BINARY操作符是COLLATE子句的一个速记符。BINARY 'x'等价与'x' COLLATE y,这里y是字符集'x'二元 校对规则的名字。每一个字符集有一个二元校对规则。例如,latin1字符集的二元 校对规则是latin1_bin,因此,如果列a是字符集latin1,以下两个语句有相同效果:
SELECT * FROM t1 ORDER BY BINARY a;
SELECT * FROM t1 ORDER BY a COLLATE latin1_bin;

10.3.11. 校对确定较为复杂的一些特殊情况

在绝大多数查询中,MySQL使用哪种校对规则进行比较是很显然的。例如,在下列情况中,校对规则明显的是“x的列校对规则”:

SELECT x FROM T ORDER BY x;
SELECT x FROM T WHERE x = x;
SELECT DISTINCT x FROM T;

但是,当涉及多个操作数时,可能不明确。例如:

SELECT x FROM T WHERE x = 'Y';

这个查询应该使用列x的 校对规则,还是字符串文字'Y'的 校对规则?

标准化SQL使用“可压缩性”规则解决这种问题。基本上,这个意思是:既然x'Y'都有 校对规则,哪个校对规则优先?这可能比较难解决,但是以下规则适合大多数情况:

·         一个外在的COLLATE子句可压缩性是0(根本不能压缩。)

·         使用不同校对规则的两个字符串连接的可压缩性是1

·         列校对规则的可压缩性是2

·         系统常数”(如USER()VERSION()函数返回的字符串)可压缩性是3

·         文字规则的可压缩性是4

·         NULL或从NULL派生的表达式的可压缩性是 5

上述可压缩性值是MySQL5.1当前所用的。

这样上述规则可以模糊解决:

·         使用最低的可压缩性值的校对规则。

·         如果两侧有相同的可压缩性,那么如果校对规则不同则发生错误。

例如:

column1 = 'A'

使用column1的校对规则

column1 = 'A' COLLATE x

使用'A'的校对规则

column1 COLLATE x = 'A' COLLATE y

错误

使用COERCIBILITY()函数确定一个字符串表达式的可压缩性:

mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
        -> 0
mysql> SELECT COERCIBILITY(VERSION());
        -> 3
mysql> SELECT COERCIBILITY('A');
        -> 4

见12.9.3节,“信息函数”。

没有系统常数或可忽略的压缩性。函数如USER()的可压缩性是2而不是3,文字的可压缩性是3而不是4

10.3.12. 校对必须适合字符集

请注意每个字符集有一个或多个校对规则,并且每个校对规则只能属于一个字符集。因此,以下语句会产生一个错误信息,因为校对规则latin2_bin对于字符集latin1非法:

mysql> SELECT _latin1 'x' COLLATE latin2_bin;

ERROR 1251: COLLATION 'latin2_bin' is not valid

for CHARACTER SET 'latin1'

10.3.13. 校对效果的示例

假设表T中的列X有这些latin1列值:

Muffler

Müller

MX Systems

MySQL

假设使用下面的语句获取列值:

SELECT X FROM T ORDER BY X COLLATE collation_name;

使用不同校对规则的列值结果排序见下表:

latin1_swedish_ci

latin1_german1_ci

latin1_german2_ci

Muffler

Muffler

Müller

MX系统

Müller

Muffler

Müller

MX系统

MX系统

MySQL

MySQL

MySQL

本表显示了我们在ORDER BY字句中使用不同所校对规则的效果的示例。在本例中导致不同排序的字符是上面带有两个圆点的Uü),它在德语中发音为"U-umlaut"

·         第一列显示的是使用瑞典/芬兰校对规则的SELECT语句的结果,它被称作U-umlaut使用Y排序。

·         第二列显示的是使用德语DIN-1校对规则的SELECT语句的结果,它被称作U-umlaut使用U排序。

·         第三列显示的是使用德语DIN-2校对规则的SELECT语句的结果,它被称作U-umlaut使用UE排序。

10.4. 字符集支持影响到的操作

10.4.1. 结果字符串
10.4.2. CONVERT()
10.4.3. CAST()
10.4.4. SHOW语句
本节讨论在MySQL5.1中考虑到字符集信息的操作。

10.4.1. 结果字符串

MySQL中有许多操作符和函数可以返回字符串。本节回答这个问题:返回的字符串使用什么字符集和 校对规则?

对于简单的函数,即接收字符串输入然后返回一个字符串结果作为输出的函数,输出的字符集和校对规则与原始输入的相同。例如,UPPERX返回一个字符串,其字符和 校对规则与X相同。类似的函数还有INSTR()LCASE()LOWER()LTRIM()MID()REPEAT()REPLACE()REVERSE()RIGHT()RPAD()RTRIM()SOUNDEX()SUBSTRING()TRIM()UCASE()UPPER()。(还需要注意:REPLACE()函数不同于其它函数,它总是忽略输入字符串的 校对规则,并且进行大小写不敏感的比较。)

对于合并多个字符串输入并且返回单个字符串输出的运算,应用标准SQL“聚合规则”:

·         如果存在显式的校对规则X,那么使用X

·         如果存在显式的校对规则XY,那么产生一个错误。

·         否则,如果全部校对规则是X,那么使用X

·         其它情况,结果没有校对规则。

例如,使用CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END。结果校对规则是X。对于CASEUNION||CONCAT()ELT()GREATEST()IF()LEAST()情况相同。

对于转换为字符数据的运算,从运算得到的结果字符串的字符集和校对规则由character_set_connectioncollation_connection系统变量定义。这适用于CAST()CHAR()CONV()FORMAT()HEX()SPACE()函数。

10.4.2. CONVERT()

CONVERT()提供一个在不同字符集之间转换数据的方法。语法是:
CONVERT(expr USING transcoding_name)

MySQL中,转换代码名与相应的字符集名相同。

例子:

SELECT CONVERT(_latin1'Müller' USING utf8);
INSERT INTO utf8table (utf8column)
    SELECT CONVERT(latin1field USING utf8) FROM latin1table;

CONVERT(... USING ...)根据标准SQL规范实施。

在传统SQL模式中,如果你转换一个“0”日期字符串到日期类型,CONVERT()函数返回NULL。在MySQL5.1中还产生一条警告。

10.4.3. CAST()

你也可以使用CAST()函数将一个字符串转换到一个不同的字符集。语法是:

CAST(character_string AS character_data_type CHARACTER SET charset_name)

例如:

SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);

如果使用CAST()时没有指定CHARACTER SET,结果字符集和校对规则通过character_set_connection collation_connection系统变量定义。如果用CAST()并带有CHARACTER SET X选项,那么结果字符集和校对规则是X和其 默认的校对规则。

你可能不能在CAST()中使用COLLATE子句,但是你可以在外部使用它。也就是说,不是CAST(... COLLATE ...),而是CAST(...) COLLATE ...

例如:

SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

在传统SQL模式中,如果你转换一个“0”日期字符串到日期类型,CAST()函数返回NULL。在MySQL5.1中还产生一条警告。

10.4.4. SHOW语句

一些SHOW语句提供额外的字符集信息。这些语句包括SHOW CHARACTER SETSHOW COLLATIONSHOW CREATE DATABASESHOW CREATE TABLESHOW COLUMNS

SHOW CHARACTER SET命令显示全部可用的字符集。它带有一个可选的LIKE子句来指示匹配哪些字符集名。例如:

mysql> SHOW CHARACTER SET LIKE 'latin%';

+---------+-----------------------------+-------------------+--------+

| Charset | Description                 | Default collation | Maxlen |

+---------+-----------------------------+-------------------+--------+

| latin1  | cp1252 West European        | latin1_swedish_ci |      1 |

| latin2  | ISO 8859-2 Central European | latin2_general_ci |      1 |

| latin5  | ISO 8859-9 Turkish          | latin5_turkish_ci |      1 |

| latin7  | ISO 8859-13 Baltic          | latin7_general_ci |      1 |

+---------+-----------------------------+-------------------+--------+

见13.5.4.1节,“SHOW CHARACTER SET语法”。

SHOW COLLATION语句的输出包括全部可用的字符集。它带有一个可选的LIKE子句来指示匹配哪些 校对规则名。例如:

mysql> SHOW COLLATION LIKE 'latin1%';
+-------------------+---------+----+---------+----------+---------+
| Collation         | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1  |  5 |         |          |       0 |
| latin1_swedish_ci | latin1  |  8 | Yes     | Yes      |       0 |
| latin1_danish_ci  | latin1  | 15 |         |          |       0 |
| latin1_german2_ci | latin1  | 31 |         | Yes      |       2 |
| latin1_bin        | latin1  | 47 |         | Yes      |       0 |
| latin1_general_ci | latin1  | 48 |         |          |       0 |
| latin1_general_cs | latin1  | 49 |         |          |       0 |
| latin1_spanish_ci | latin1  | 94 |         |          |       0 |
+-------------------+---------+----+---------+----------+---------+

见13.5.4.2节,“SHOW COLLATION语法”。

SHOW CREATE DATABASE语句显示创建给定数据库的CREATE DATABASE语句。结果包括全部数据库选项。支持DEFAULT CHARACTER SETCOLLATE。全部数据库选项存储在命名为db.Opt的文本文件中,该文件能够在数据库目录中找到。

mysql> SHOW CREATE DATABASE test;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| test     | CREATE DATABASE `test`  |
+----------+-----------------------------------------------------------------+

见13.5.4.4节,“SHOW CREATE DATABASE语法”

SHOW CREATE TABLESHOW CREATE DATABASE相似,但是显示创建给定数据库的CREATE TABLE语句。列定义显示任何字符集规格,并且表选项包括字符集信息。

见13.5.4.5节,“SHOW CREATE TABLE语法”

当以SHOW FULL COLUMNS调用时,SHOW COLUMNS语句显示表中列的校对规则。具有CHARVARCHARTEXT数据类型的列有非NULL的 校对规则。数值列和其它非字符类型的列有NULL校对规则。例如:

mysql> SHOW FULL COLUMNS FROM person\G

*************************** 1. row ***************************

     Field: id

      Type: smallint(5) unsigned

 Collation: NULL

      Null: NO

       Key: PRI

   Default: NULL

     Extra: auto_increment

Privileges: select,insert,update,references

   Comment:

*************************** 2. row ***************************

     Field: name

      Type: char(60)

 Collation: latin1_swedish_ci

      Null: NO

       Key:

   Default:

     Extra:

Privileges: select,insert,update,references

   Comment:

字符集不是显示的部分。(字符集名隐含在校对规则名中。)

见13.5.4.3节,“SHOW COLUMNS语法”。

10.5. Unicode支持

MySQL 5.1支持两种字符集以保存Unicode数据:

·         ucs2UCS-2 Unicode字符集。

·         utf8Unicode字符集的UTF8编码。

UCS-2(二进制Unicode表示法)中,每一个字符用一个双字节的Unicode编码来表示的,第一个字节表示重要的意义。例如:"LATIN CAPITAL LETTER A"Unicode编码是0x0041,它按顺序存储为两个字节:0x00 0x41"CYRILLIC SMALL LETTER YERU"Unicode 0x044B)顺序存储为两个字节:0x04 0x4B。对于Unicode字符和它们的编码,请参见Unicode 主页

当前,UCS-2还不能够用作为客户端字符集,这意味着SET NAMES 'ucs2'不起作用。

UTF8字符集(转换Unicode表示)是存储Unicode数据的一种可选方法。它根据 RFC 3629执行。UTF8字符集的思想是不同Unicode字符采用变长字节序列编码:

·         基本拉丁字母、数字和标点符号使用一个字节。

·         大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言。

·         韩语、中文和日本象形文字使用三个字节序列。

RFC 3629说明了采用一到四个字节的编码序列。当前,MySQLUTF8不支持四个字节。(UTF8编码的旧标准是由RFC 2279给出,它描述了从一到六个字节的UTF8编码序列。RFC 3629补充了作废的RFC 2279;因此,不再使用5个字节和6个字节的编码序列。)

提示:使用UTF8时为了节省空间,使用VARCHAR而不要用CHAR。否则,MySQL必须为一个CHAR(10) CHARACTER SET utf8列预备30个字节,因为这是可能的最大长度。

10.6. 用于元数据的UTF8

元数据是“关于数据的数据”。描述数据库的任何数据—作为数据库内容的对立面—是元数据。因此,列名、数据库名、用户名、版本名以及从SHOW语句得到的结果中的大部分字符串是元数据。还包括INFORMATION_SCHEMA数据库中的表中的内容,因为定义的那些表存储关于数据库对象的信息。

元数据表述必须满足这些需求:

·         全部元数据必须在同一字符集内。否则,对INFORM一个TION_SCHEMA数据库中的表执行的SHOW命令和SELECT查询不能正常工作,因为这些运算结果中的同一列的不同行将会使用不同的字符集。

·         元数据必须包括所有语言的所有字符。否则,用户将不能够使用它们自己的语言来命名列和表。

为了满足这两个需求,MySQL使用Unicode字符集存储元数据,即UTF8。如果你从不使用重音字符,这不会导致任何破坏。但如果你使用重音字符,应该注意的是元数据是用UTF8存储。

这意味着,USER()CURRENT_USER()DATABASE()VERSION()函数的返回值被 默认设置为UTF8字符集,这与同义函数如SESSION_USER() SYSTEM_USER()的结果相同。

服务器将character_set_system系统变量设置为元数据字符集的名:

mysql> SHOW VARIABLES LIKE 'character_set_system';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| character_set_system | utf8  |
+----------------------+-------+

存储元数据使用Unicode并不意味着列头和DESCRIBE函数的结果默认在character_set_system字符集中。当你使用SELECT column1 FROM t语句时,名字为column1的列从服务器返回客户端并使用由SET NAMES语句确定的字符集。更明确地说,使用的字符集是由character_set_results系统变量的值确定的。如果这个系统变量设置为NULL,不执行字符转换,服务器使用最初的字符集(字符集由character_set_system系统变量设置)返回元数据。

如果你希望服务器不使用UTF8字符集返回元数据结果,那么使用SET NAMES语句强制服务器执行字符集转换(见10.3.6节,“连接字符集和校对”),或者在客户端执行转换。在客户端执行转换效率较高,但这种选项并不能使用于全部客户端。

如果你正在一个语句中使用(例如)USER()函数进行比较或赋值,不要担心。MySQL为你执行一些原子转换。

SELECT * FROM Table1 WHERE USER() = latin1_column;

这是可以的,因为在比较之前latin1_column列的内容会自动转换到UTF8

INSERT INTO Table1 (latin1_column) SELECT USER();

这是可以的,因为赋值之前USER()函数返回的内容自动转换为latin1。至今,自动转换没有全部实施,但是以后的版本中应该工作正常。

尽管自动转换不属于SQL标准,SQL标准化文档中说每一个字符集是(根据支持的字符)Unicode的“子集”。因此,一个知名的原则是,“适用超集的字符集能够应用于其子集”,我们相信Unicode的 校对规则能够应用于非Unicode字符串的比较。

注释:在MySQL5.1中,errmsg.txt文件全部使用UTF8。客户端字符集的转换是自动进行的,如同元数据。

10.7. 与其它DBMS的兼容性

对于MaxDB兼容性,下面两个语句是相同的:

CREATE TABLE t1 (f1 CHAR(n) UNICODE);
CREATE TABLE t1 (f1 CHAR(n) CHARACTER SET ucs2);

10.8. 新字符集配置文件格式

字符集配置存储在XML文件中,一个字符集对应一个文件。

10.9. 国家特有字符集

ANSI SQL定义了NCHAR或者NATIONAL CHAR作为一个方法来指示CHAR类型的列应该使用某些预定义的字符集。MySQL5.1使用utf8作为预定义的字符集。例如,这些列类型声明是等价的:
CHAR(10) CHARACTER SET utf8
NATIONAL CHARACTER(10)
NCHAR(10)

下面同样:

VARCHAR(10) CHARACTER SET utf8
NATIONAL VARCHAR(10)
NCHAR VARCHAR(10)
NATIONAL CHARACTER VARYING(10)
NATIONAL CHAR VARYING(10)

你能够使用N'literal'来创建一个使用国家特有字符集的字符串。这两个语句是等价的:

SELECT N'some text';
SELECT _utf8'some text';

关于MySQL4.1以前的版本到5.1版本字符集升级的信息,请参见MySQL4.1参考手册

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. 亚洲字符集

MySQL支持30多种字符集的70多种 校对规则。字符集和它们的默认校对规则可以通过SHOW CHARACTER SET语句显示:

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+
| Charset  | Description                 | Default collation   |
+----------+-----------------------------+---------------------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |
| dec8     | DEC West European           | dec8_swedish_ci     |
| cp850    | DOS West European           | cp850_general_ci    |
| hp8      | HP West European            | hp8_english_ci      |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |
| latin1   | cp1252 West European        | latin1_swedish_ci   |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |
| ascii    | US ASCII                    | ascii_general_ci    |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |
| cp1250   | Windows Central European    | cp1250_general_ci   |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |
| cp866    | DOS Russian                 | cp866_general_ci    |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |
| macce    | Mac Central European        | macce_general_ci    |
| macroman | Mac West European           | macroman_general_ci |
| cp852    | DOS Central European        | cp852_general_ci    |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |
| cp1256   | Windows Arabic              | cp1256_general_ci   |
| cp1257   | Windows Baltic              | cp1257_general_ci   |
| binary   | Binary pseudo charset       | binary              |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |
+----------+-----------------------------+---------------------+

10.10.1. Unicode字符集

MySQL有两种Unicode字符集。你能够使用这些字符集保存大约650种语言的文本。

·         ucs2 (UCS-2 Unicode)校对规则:

  • mysql> SHOW COLLATION LIKE 'ucs2%';
    +--------------------+---------+-----+---------+----------+---------+
    | Collation          | Charset | Id  | Default | Compiled | Sortlen |
    +--------------------+---------+-----+---------+----------+---------+
    | ucs2_general_ci    | ucs2    |  35 | Yes     | Yes      |       1 |
    | ucs2_bin           | ucs2    |  90 |         | Yes      |       1 |
    | ucs2_unicode_ci    | ucs2    | 128 |         | Yes      |       8 |
    | ucs2_icelandic_ci  | ucs2    | 129 |         | Yes      |       8 |
    | ucs2_latvian_ci    | ucs2    | 130 |         | Yes      |       8 |
    | ucs2_romanian_ci   | ucs2    | 131 |         | Yes      |       8 |
    | ucs2_slovenian_ci  | ucs2    | 132 |         | Yes      |       8 |
    | ucs2_polish_ci     | ucs2    | 133 |         | Yes      |       8 |
    | ucs2_estonian_ci   | ucs2    | 134 |         | Yes      |       8 |
    | ucs2_spanish_ci    | ucs2    | 135 |         | Yes      |       8 |
    | ucs2_swedish_ci    | ucs2    | 136 |         | Yes      |       8 |
    | ucs2_turkish_ci    | ucs2    | 137 |         | Yes      |       8 |
    | ucs2_czech_ci      | ucs2    | 138 |         | Yes      |       8 |
    | ucs2_danish_ci     | ucs2    | 139 |         | Yes      |       8 |
    | ucs2_lithuanian_ci | ucs2    | 140 |         | Yes      |       8 |
    | ucs2_slovak_ci     | ucs2    | 141 |         | Yes      |       8 |
    | ucs2_spanish2_ci   | ucs2    | 142 |         | Yes      |       8 |
    | ucs2_roman_ci      | ucs2    | 143 |         | Yes      |       8 |
    | ucs2_persian_ci    | ucs2    | 144 |         | Yes      |       8 |
    | ucs2_esperanto_ci  | ucs2    | 145 |         | Yes      |       8 |
    +--------------------+---------+-----+---------+----------+---------+
    
  • utf8 (UTF-8 Unicode)校对规则:

    mysql> SHOW COLLATION LIKE 'utf8%';
    +--------------------+---------+-----+---------+----------+---------+
    | Collation          | Charset | Id  | Default | Compiled | Sortlen |
    +--------------------+---------+-----+---------+----------+---------+
    | utf8_general_ci    | utf8    |  33 | Yes     | Yes      |       1 |
    | utf8_bin           | utf8    |  83 |         | Yes      |       1 |
    | utf8_unicode_ci    | utf8    | 192 |         | Yes      |       8 |
    | utf8_icelandic_ci  | utf8    | 193 |         | Yes      |       8 |
    | utf8_latvian_ci    | utf8    | 194 |         | Yes      |       8 |
    | utf8_romanian_ci   | utf8    | 195 |         | Yes      |       8 |
    | utf8_slovenian_ci  | utf8    | 196 |         | Yes      |       8 |
    | utf8_polish_ci     | utf8    | 197 |         | Yes      |       8 |
    | utf8_estonian_ci   | utf8    | 198 |         | Yes      |       8 |
    | utf8_spanish_ci    | utf8    | 199 |         | Yes      |       8 |
    | utf8_swedish_ci    | utf8    | 200 |         | Yes      |       8 |
    | utf8_turkish_ci    | utf8    | 201 |         | Yes      |       8 |
    | utf8_czech_ci      | utf8    | 202 |         | Yes      |       8 |
    | utf8_danish_ci     | utf8    | 203 |         | Yes      |       8 |
    | utf8_lithuanian_ci | utf8    | 204 |         | Yes      |       8 |
    | utf8_slovak_ci     | utf8    | 205 |         | Yes      |       8 |
    | utf8_spanish2_ci   | utf8    | 206 |         | Yes      |       8 |
    | utf8_roman_ci      | utf8    | 207 |         | Yes      |       8 |
    | utf8_persian_ci    | utf8    | 208 |         | Yes      |       8 |
    | utf8_esperanto_ci  | utf8    | 209 |         | Yes      |       8 |
    +--------------------+---------+-----+---------+----------+---------+
    

utf8_unicode_ci校对规则是根据Unicode校对规则算法(UCA)执行的, 校对规则描述见 http://www.unicode.org/reports/tr10/。此校对规则使用UCA 4.0.0版本砝码键:http://www.unicode.org/Public/UC一个/4.0.0/一个llkeys-4.0.0.txt。(以下讨论使用utf8_unicode_ci,但同样适合ucs2_unicode_ci。)

当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt TatarBashkirMari

utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß’等于‘ss’。

utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的 校对规则相比,比较正确性较差)。

例如,使用utf8_general_ciutf8_unicode_ci两种 校对规则下面的比较相等:

Ä = A
Ö = O
Ü = U

两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:

ß = s

但是,对于utf8_unicode_ci下面等式成立:

ß = ss

对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。

utf8_general_ci也适用与德语和法语,除了‘ß’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。

utf8_swedish_ci,与其它语言相关的utf8的校对规则相似,来源于utf8_unicode_ci使用额外的语言规则。例如,在瑞典语中,以下的关系式成立,它在德语和法语中不成立:

Ü = Y < Ö

utf8_spanish_ciutf8_spanish2_ci校对规则分别适用于现代和古典西班牙语。在两种 校对规则中,ñ’(n-发音符)是‘n’和‘o’之间的间隔字母。另外,对于古典西班牙语,‘ch’是‘c’和d之间的间隔字母,并且‘ll’是‘l’和‘m’之间的间隔字母。

10.10.2. 西欧字符集

西欧字符集覆盖大多数西欧语言,如法语、西班牙语、加泰罗尼亚语、巴斯克人语、葡萄牙语、意大利语、阿而巴尼亚语、荷兰语、德语、丹麦语、瑞典语、挪威语、芬兰语、法罗人语、冰岛语、爱尔兰语、苏格兰语和英语。

·         asciiUS ASCII)校对规则:

o        ascii_bin

o        ascii_general_ci( 默认)

·         cp850DOS西欧) 校对规则:

o        cp850_bin

o        cp850_general_ci( 默认)

·         dec8DEC 西欧)校对规则:

o        dec8_bin

o        dec8_swedish_ci( 默认)

·         hp8HP 西欧)校对规则:

o        hp8_bin

o        hp8_english_ci( 默认)

·         latin1cp1252 西欧)校对规则:

o        latin1_bin

o        latin1_danish_ci

o        latin1_general_ci

o        latin1_general_cs

o        latin1_german1_ci

o        latin1_german2_ci

o        latin1_spanish_ci

o        latin1_swedish_ci( 默认)

latin1是 默认字符集。latin1_swedish_ci是 默认的校对规则,它用于大多数MySQL客户。虽然经常说它以瑞典/芬兰 校对规则为基础,但瑞典和芬兰人不同意这种说法。

latin1_german1_cilatin1_german2_ci校对规则基于DIN-1DIN-2标准,这里DIN代表Deutsches Institut für Normung(德语等价于ANSI)。DIN-1被叫做“字典校对规则”,DIN-2被叫做“电话簿校对规则”。

o        latin1_german1_ci(字典)规则:

o                     Ä = a
o                     Ö = O
o                     Ü = U
o                     ß = s

o        latin1_german2_ci电话簿)规则:

o                     Ä = aE
o                     Ö = OE
o                     Ü = UE
o                     ß = ss

latin1_spanish_ci校对规则中,‘ñ’(n-tilde)是‘n’和‘o’之间的间隔字母。

·         macromaMac西欧) 校对规则:

o        macroman_bin

o        macroman_general_ci( 默认)

·         swe77位瑞典语) 校对规则:

o        swe7_bin

o        swe7_swedish_ci( 默认)

10.10.3. 中欧字符集

我们还提供一些用于捷克共和国、斯洛伐克、匈牙利、罗马尼亚、斯罗纹尼亚、克罗地亚和波兰的字符集支持。

·         cp1250Windows中欧) 校对规则:

o        cp1250_bin

o        cp1250_croatian_ci

o        cp1250_czech_cs

o        cp1250_general_ci( 默认)

·         cp852DOS 中欧)校对规则:

o        cp852_bin

o        cp852_general_ci( 默认)

·         keybcs2DOS Kamenicky Czech-Slovak)校对规则:

o        keybcs2_bin

o        keybcs2_general_ci( 默认)

·         latin2ISO 8859-2 中欧)校对规则:

o        latin2_bin

o        latin2_croatian_ci

o        latin2_czech_cs

o        latin2_general_ci( 默认)

o        latin2_hungarian_ci

·         macceMac 中欧)校对规则:

o        macce_bin

o        macce_general_ci( 默认)

10.10.4. 南欧与中东字符集

MySQL支持的南欧和中东字符集包括亚美尼亚语、阿拉伯语、乔治亚语、希腊语、希伯莱语和土耳其语:

·         armscii8ARMSCII-8 亚美尼亚语)校对规则:

o        armscii8_bin

o        armscii8_general_ci( 默认)

·         cp1256(阿拉伯语Windows) 校对规则:

o        cp1256_bin

o        cp1256_general_ci( 默认)

·         geostd8GEOSTD8乔治亚语) 校对规则:

o        geostd8_bin

o        geostd8_general_ci( 默认)

·         greekISO 8859-7希腊语)校对规则:

o        greek_bin

o        greek_general_ci( 默认)

·         hebrewISO 8859-8希伯莱语)校对规则:

o        hebrew_bin

o        hebrew_general_ci( 默认)

·         latin5ISO 8859-9 土耳其语)校对规则:

o        latin5_bin

o        latin5_turkish_ci( 默认)

10.10.5. 波罗的海字符集

波罗的海字符集覆盖爱沙尼亚语、拉脱维亚语和立陶宛语言。当前支持的两种波罗的海字符集:

·         cp1257Windows波罗的海) 校对规则:

o        cp1257_bin

o        cp1257_general_ci( 默认)

o        cp1257_lithuanian_ci

·         latin7ISO 8859-13波罗的海)校对规则:

o        latin7_bin

o        latin7_estonian_cs

o        latin7_general_ci( 默认)

o        latin7_general_cs

10.10.6. 西里尔字符集

使用西里尔字符集和校对规则的有Belarusian、保加利亚、俄语和乌克兰语言。

·         cp1251Windows 西里尔)校对规则:

o        cp1251_bin

o        cp1251_bulgarian_ci

o        cp1251_general_ci( 默认)

o        cp1251_general_cs

o        cp1251_ukrainian_ci

·         cp866DOS 俄语)校对规则:

o        cp866_bin

o        cp866_general_ci( 默认)

·         koi8rKOI8-R Relcom 俄语)校对规则:

o        koi8r_bin

o        koi8r_general_ci( 默认)

·         koi8uKOI8-U 乌克兰语)校对规则:

o        koi8u_bin

o        koi8u_general_ci( 默认)

10.10.7. 亚洲字符集

10.10.7.1. cp932字符集

我们支持的亚洲字符集包括中文、日语、韩语和泰国语。这些可能比较复杂。例如,中文字符集必须考虑到上千种不同的字符。

·         big5Big5传统中文) 校对规则:

o        big5_bin

o        big5_chinese_ci( 默认)

·         cp932SJIS Windows日语)校对规则:

o        cp932_bin

o        cp932_japanese_ci( 默认)

·         eucjpmsUJIS Windows日语)校对规则:

o        eucjpms_bin

o        eucjpms_japanese_ci( 默认)

·         euckrEUC-KR 韩语)校对规则:

o        euckr_bin

o        euckr_korean_ci( 默认)

·         gb2312GB2312 简体中文)校对规则:

o        gb2312_bin

o        gb2312_chinese_ci( 默认)

·         gbkGBK简体中文) 校对规则:

o        gbk_bin

o        gbk_chinese_ci( 默认)

·         sjisShift-JIS 日语)校对规则:

o        sjis_bin

o        sjis_japanese_ci( 默认)

·         tis620TIS620 泰国语)校对规则:

o        tis620_bin

o        tis620_thai_ci( 默认)

·         ujisEUC-JP 日语)校对规则:

o        ujis_bin

o        ujis_japanese_ci( 默认)

10.10.7.1. cp932字符集

为什么需要cp932

MySQL中,sjis字符集对应于由IANA定义的Shift_JIS字符集,它支持JIS X0201JIS X0208字符。(见 http://www.iana.org/assignments/character-sets 。)

但是,“SHIFT JIS”作为描述性术语的含义变得非常含糊不清,并且它常常包括由不同供应商定义的Shift_JIS扩展部分。

例如,使用在日本Windows环境中使用的“SHIFT JIS”是MicrosoftShift_JISMicrosoft扩展,它的准确名字是Microsoft Windows Codepage: 932cp932除由Shift_JIS支持的字符之外,cp932支持扩展字符,如NEC选择的IBM扩展字符和IBM扩展字符。

许多日本用户在使用这些扩展字符过程中碰到过一些问题。这些问题是由于以下情况引起的:

·         MySQL自动转换字符集。

·         字符集通过Unicode转换(ucs2)。

·         sjis字符集不支持这些扩展字符转换。

·         从号称“SHIFT JIS”到Unicode的转换,存在一些转换规则,并且一些字符转换到Unicode依赖不同的转换规则。MySQL仅支持这些转换规则中的一种(在后面描述)。

MySQLcp932字符集可以解决这些转换问题。

因为MySQL支持字符集转换,将IANA Shift_JIS cp932分离为两种不同字符集是重要的,因为它们提供不同的转换规则。

cp932sjis有什么不同?

cp932字符集与sjis存在以下不同点:

·         cp932支持NEC特殊字符、NEC选择的IBM扩展字符和IBM选择的字符。

·         一些cp932字符有两个不同的编码点,这两种编码点转换为相同Unicode编码点。因此,当从Unicode转换回到cp932时,必须选择一个编码点。对于这种“相互转换使用由Microsoft推荐的转换规则。(见 http//support.microsoft.com/kb/170559/EN-US/。)

转换规则如下:

o        如果字符在JIS X 0208 NEC特殊字符中同时存在,使用JIS X 0208 的编码点。

o        如果字符在NEC特殊字符和IBM选择的字符中同时存在,使用NEC特殊字符的编码点。

o        如果字符在IBM选择的字符和NEC选择的IBM扩展字符中同时存在,使用IBM扩展字符的编码点。

关于cp932字符的Unicode 值的列表显示信息见http://www.microsoft.com/globaldev/reference/dbcs/932.htm。对于cp932表中的带有下面有四位数字出现的字符的实体,数字代表相应的Unicodeucs2)编码。对于表中有两个带下划线的数字出现的实体,择有一个以那两个数字开头的cp932字符值的范围。点击一个这种表的实体,将带你到一个页,该页显示每个以那些数字开头的cp932字符的Unicode值。

以下连接很重要。它们与下列字符集的编码相对应:

o        NEC特殊字符:

http://www.microsoft.com/globaldev/reference/dbcs/932/932_87.htm

o        NEC选择的IBM扩展字符:

o                     http://www.microsoft.com/globaldev/reference/dbcs/932/932_ED.htm
o                     http://www.microsoft.com/globaldev/reference/dbcs/932/932_EE.htm

o        IBM选择的字符:

o                     http://www.microsoft.com/globaldev/reference/dbcs/932/932_FA.htm
o                     http://www.microsoft.com/globaldev/reference/dbcs/932/932_FB.htm
o                     http://www.microsoft.com/globaldev/reference/dbcs/932/932_FC.htm

·         cp932eucjpms结合支持用户自定义字符的转换,并且解决sjis/ujis转换问题。详细信息,请参见http://www.opengroup.or.jp/jvc/cde/sjis-euc-e.html

·         对于一些字符,与ucs2之间的转换与sjiscp932之间的转换是不同的。下表举例说明了这些不同。

转换到ucs2

sjis/cp932

sjis ucs2转换

cp932 ucs2转换

5C

005C

005C

7E

007E

007E

815C

2015

2015

815F

005C

FF3C

8160

301C

FF5E

8161

2016

2225

817C

2212

FF0D

8191

00a2

FFE0

8192

00a3

FFE1

81Ca

00aC

FFE2

ucs2转换:

ucs2

ucs2 sjis转换

ucs2 cp932转换

005C

815F

5C

007E

7E

7E

00a2

8191

3F

00a3

8192

3F

00aC

81Ca

3F

2015

815C

815C

2016

8161

3F

2212

817C

3F

2225

3F

8161

301C

8160

3F

FF0D

3F

817C

FF3C

3F

815F

FF5E

3F

8160

FFE0

3F

8191

FFE1

3F

8192

FFE2

3F

81Ca


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

上一篇:下一篇: