国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

directory search
目錄 前言 1. 一般信息 1.1. 關(guān)于本手冊(cè) 1.2. 本手冊(cè)采用的慣例 1.3. MySQL AB概述 1.4. MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)概述 1.4.1. MySQL的歷史 1.4.2. MySQL的的主要特性 1.4.3. MySQL穩(wěn)定性 1.4.4. MySQL表最大能達(dá)到多少 1.4.5. 2000年兼容性 1.5. MaxDB數(shù)據(jù)庫(kù)管理系統(tǒng)概述 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之間的協(xié)同性 1.5.7. 與MaxDB有關(guān)的鏈接 1.6. MySQL發(fā)展大事記 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL郵件列表 1.7.2. IRC(在線聊天系統(tǒng))上的MySQL社區(qū)支持 1.7.3. MySQL論壇上的MySQL社區(qū)支持 1.8. MySQL標(biāo)準(zhǔn)的兼容性 1.8.1. MySQL遵從的標(biāo)準(zhǔn)是什么 1.8.2. 選擇SQL模式 1.8.3. 在ANSI模式下運(yùn)行MySQL 1.8.4. MySQL對(duì)標(biāo)準(zhǔn)SQL的擴(kuò)展 1.8.5. MySQL與標(biāo)準(zhǔn)SQL的差別 1.8.6. MySQL處理約束的方式 2. 安裝MySQL 2.1. 一般安裝問(wèn)題 2.1.1. MySQL支持的操作系統(tǒng) 2.1.2. 選擇要安裝的MySQL分發(fā)版 2.1.3. 怎樣獲得MySQL 2.1.4. 通過(guò)MD5校驗(yàn)和或GnuPG驗(yàn)證軟件包的完整性 2.1.5. 安裝布局 2.2. 使用二進(jìn)制分發(fā)版的標(biāo)準(zhǔn)MySQL安裝 2.3. 在Windows上安裝MySQL 2.3.1. Windows系統(tǒng)要求 2.3.2. 選擇安裝軟件包 2.3.3. 用自動(dòng)安裝器安裝MySQL 2.3.4. 使用MySQL安裝向?qū)?/a> 2.3.5. 使用配置向?qū)?/a> 2.3.6. 通過(guò)非安裝Zip文件安裝MySQL 2.3.7. 提取安裝檔案文件 2.3.8. 創(chuàng)建選項(xiàng)文件 2.3.9. 選擇MySQL服務(wù)器類(lèi)型 2.3.10. 首次啟動(dòng)服務(wù)器 2.3.11. 從Windows命令行啟動(dòng)MySQL 2.3.12. 以Windows服務(wù)方式啟動(dòng)MySQL 2.3.13. 測(cè)試MySQL安裝 2.3.14. 在Windows環(huán)境下對(duì)MySQL安裝的故障診斷與排除 2.3.15. 在Windows下升級(jí)MySQL 2.3.16. Windows版MySQL同Unix版MySQL對(duì)比 2.4. 在Linux下安裝MySQL 2.5.在Mac OS X中安裝MySQL 2.6. 在NetWare中安裝MySQL 2.7. 在其它類(lèi)Unix系統(tǒng)中安裝MySQL 2.8. 使用源碼分發(fā)版安裝MySQL 2.8.1. 源碼安裝概述 2.8.2. 典型配置選項(xiàng) 2.8.3. 從開(kāi)發(fā)源碼樹(shù)安裝 2.8.4. 處理MySQL編譯問(wèn)題 2.8.5. MIT-pthreads注意事項(xiàng) 2.8.6. 在Windows下從源碼安裝MySQL 2.8.7. 在Windows下編譯MySQL客戶端 2.9. 安裝后的設(shè)置和測(cè)試 2.9.1. Windows下安裝后的過(guò)程 2.9.2. Unix下安裝后的過(guò)程 2.9.3. 使初始MySQL賬戶安全 2.10. 升級(jí)MySQL 2.10.1. 從5.0版升級(jí) 2.10.2. 升級(jí)授權(quán)表 2.10.3. 將MySQL數(shù)據(jù)庫(kù)拷貝到另一臺(tái)機(jī)器 2.11. 降級(jí)MySQL 2.12. 具體操作系統(tǒng)相關(guān)的注意事項(xiàng) 2.12.1. Linux注意事項(xiàng) 2.12.2. Mac OS X注意事項(xiàng) 2.12.3. Solaris注意事項(xiàng) 2.12.4. BSD注意事項(xiàng) 2.12.5. 其它Unix注意事項(xiàng) 2.12.6. OS/2注意事項(xiàng) 2.13. Perl安裝注意事項(xiàng) 2.13.1. 在Unix中安裝Perl 2.13.2. 在Windows下安裝ActiveState Perl 2.13.3. 使用Perl DBI/DBD接口的問(wèn)題 3. 教程 3.1. 連接與斷開(kāi)服務(wù)器 3.2. 輸入查詢 3.3. 創(chuàng)建并使用數(shù)據(jù)庫(kù) 3.3.1. 創(chuàng)建并選擇數(shù)據(jù)庫(kù) 3.3.2. 創(chuàng)建表 3.3.3. 將數(shù)據(jù)裝入表中 3.3.4. 從表檢索信息 3.4. 獲得數(shù)據(jù)庫(kù)和表的信息 NoName 3.6. 常用查詢的例子 3.6.1. 列的最大值 3.6.2. 擁有某個(gè)列的最大值的行 3.6.3. 列的最大值:按組 3.6.4. 擁有某個(gè)字段的組間最大值的行 3.6.5. 使用用戶變量 3.6.6. 使用外鍵 3.6.7. 根據(jù)兩個(gè)鍵搜索 3.6.8. 根據(jù)天計(jì)算訪問(wèn)量 3.6.9. 使用AUTO_INCREMENT 3.7. 孿生項(xiàng)目的查詢 3.7.1. 查找所有未分發(fā)的孿生項(xiàng) 3.7.2. 顯示孿生對(duì)狀態(tài)的表 3.8. 與Apache一起使用MySQL 4. MySQL程序概述 4.1. MySQL程序概述 4.2. 調(diào)用MySQL程序 4.3. 指定程序選項(xiàng) 4.3.1. 在命令行上使用選項(xiàng) 4.3.2. 使用選項(xiàng)文件 4.3.3. 用環(huán)境變量指定選項(xiàng) 4.3.4. 使用選項(xiàng)設(shè)置程序變量 5. 數(shù)據(jù)庫(kù)管理 5.1. MySQL服務(wù)器和服務(wù)器啟動(dòng)腳本 5.1.1. 服務(wù)器端腳本和實(shí)用工具概述 5.1.2. mysqld-max擴(kuò)展MySQL服務(wù)器 5.1.3. mysqld_safe:MySQL服務(wù)器啟動(dòng)腳本 5.1.4. mysql.server:MySQL服務(wù)器啟動(dòng)腳本 5.1.5. mysqld_multi:管理多個(gè)MySQL服務(wù)器的程序 5.2. mysqlmanager:MySQL實(shí)例管理器 5.2.1. 用MySQL實(shí)例管理器啟動(dòng)MySQL服務(wù)器 5.2.2. 連接到MySQL實(shí)例管理器并創(chuàng)建用戶賬戶 5.2.3. MySQL實(shí)例管理器命令行選項(xiàng) 5.2.4. MySQL實(shí)例管理器配置文件 5.2.5. MySQL實(shí)例管理器識(shí)別的命令 5.3. mysqld:MySQL服務(wù)器 5.3.1. mysqld命令行選項(xiàng) 5.3.2. SQL服務(wù)器模式 5.3.3. 服務(wù)器系統(tǒng)變量 5.3.4. 服務(wù)器狀態(tài)變量 5.4. mysql_fix_privilege_tables:升級(jí)MySQL系統(tǒng)表 5.5. MySQL服務(wù)器關(guān)機(jī)進(jìn)程 5.6. 一般安全問(wèn)題 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻擊者面前保持安全 5.6.3. Mysqld安全相關(guān)啟動(dòng)選項(xiàng) 5.6.4. LOAD DATA LOCAL安全問(wèn)題 5.7. MySQL訪問(wèn)權(quán)限系統(tǒng) 5.7.1. 權(quán)限系統(tǒng)的作用 5.7.2. 權(quán)限系統(tǒng)工作原理 5.7.3. MySQL提供的權(quán)限 5.7.4. 與MySQL服務(wù)器連接 5.7.5. 訪問(wèn)控制 5.7.6. 訪問(wèn)控制 5.7.7. 權(quán)限更改何時(shí)生效 5.7.8. 拒絕訪問(wèn)錯(cuò)誤的原因 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. 設(shè)置賬戶密碼 5.8.6. 使你的密碼安全 5.8.7. 使用安全連接 5.9. 備份與恢復(fù) 5.9.1. 數(shù)據(jù)庫(kù)備份 5.9.2. 示例用備份與恢復(fù)策略 5.9.3. 自動(dòng)恢復(fù) 5.9.4. 表維護(hù)和崩潰恢復(fù) 5.9.5. myisamchk:MyISAM表維護(hù)實(shí)用工具 5.9.6. 建立表維護(hù)計(jì)劃 5.9.7. 獲取關(guān)于表的信息 5.10. MySQL本地化和國(guó)際應(yīng)用 5.10.1. 數(shù)據(jù)和排序用字符集 5.10.2. 設(shè)置錯(cuò)誤消息語(yǔ)言 5.10.3. 添加新的字符集 5.10.4. 字符定義數(shù)組 5.10.5. 字符串比較支持 5.10.6. 多字節(jié)字符支持 5.10.7. 字符集問(wèn)題 5.10.8. MySQL服務(wù)器時(shí)區(qū)支持 5.11. MySQL日志文件 5.11.1. 錯(cuò)誤日志 5.11.2. 通用查詢?nèi)罩?/a> 5.11.3. 二進(jìn)制日志 5.11.4. 慢速查詢?nèi)罩?/a> 5.11.5. 日志文件維護(hù) 5.12. 在同一臺(tái)機(jī)器上運(yùn)行多個(gè)MySQL服務(wù)器 5.12.1. 在Windows下運(yùn)行多個(gè)服務(wù)器 5.12.2. 在Unix中運(yùn)行多個(gè)服務(wù)器 5.12.3. 在多服務(wù)器環(huán)境中使用客戶端程序 5.13. MySQL查詢高速緩沖 5.13.1. 查詢高速緩沖如何工作 5.13.2. 查詢高速緩沖SELECT選項(xiàng) 5.13.3. 查詢高速緩沖配置 5.13.4. 查詢高速緩沖狀態(tài)和維護(hù) 6. MySQL中的復(fù)制 6.1. 復(fù)制介紹 6.2. 復(fù)制實(shí)施概述 6.3. 復(fù)制實(shí)施細(xì)節(jié) 6.3.1. 復(fù)制主線程狀態(tài) 6.3.2. 復(fù)制從I/O線程狀態(tài) 6.3.3. 復(fù)制從SQL線程狀態(tài) 6.3.4. 復(fù)制傳遞和狀態(tài)文件 6.4. 如何設(shè)置復(fù)制 6.5. 不同MySQL版本之間的復(fù)制兼容性 6.6. 升級(jí)復(fù)制設(shè)置 6.6.1. 將復(fù)制升級(jí)到5.0版 6.7. 復(fù)制特性和已知問(wèn)題 6.8. 復(fù)制啟動(dòng)選項(xiàng) 6.9. 復(fù)制FAQ 6.10. 復(fù)制故障診斷與排除 6.11. 通報(bào)復(fù)制缺陷 6.12. 多服務(wù)器復(fù)制中的Auto-Increment 7. 優(yōu)化 7.1. 優(yōu)化概述 7.1.1. MySQL設(shè)計(jì)局限與折衷 7.1.2. 為可移植性設(shè)計(jì)應(yīng)用程序 7.1.3. 我們已將MySQL用在何處? 7.1.4. MySQL基準(zhǔn)套件 7.1.5. 使用自己的基準(zhǔn) 7.2. 優(yōu)化SELECT語(yǔ)句和其它查詢 7.2.1. EXPLAIN語(yǔ)法(獲取SELECT相關(guān)信息) 7.2.2. 估計(jì)查詢性能 7.2.3. SELECT查詢的速度 7.2.4. MySQL怎樣優(yōu)化WHERE子句 7.2.5. 范圍優(yōu)化 7.2.6. 索引合并優(yōu)化 7.2.7. MySQL如何優(yōu)化IS NULL 7.2.8. MySQL如何優(yōu)化DISTINCT 7.2.9. MySQL如何優(yōu)化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何優(yōu)化嵌套Join 7.2.11. MySQL如何簡(jiǎn)化外部聯(lián)合 7.2.12. MySQL如何優(yōu)化ORDER BY 7.2.13. MySQL如何優(yōu)化GROUP BY 7.2.14. MySQL如何優(yōu)化LIMIT 7.2.15. 如何避免表掃描 7.2.16. INSERT語(yǔ)句的速度 7.2.17. UPDATE語(yǔ)句的速度 7.2.18. DELETE語(yǔ)句的速度 7.2.19. 其它優(yōu)化技巧 7.3. 鎖定事宜 7.3.1. 鎖定方法 7.3.2. 表鎖定事宜 7.4. 優(yōu)化數(shù)據(jù)庫(kù)結(jié)構(gòu) 7.4.1. 設(shè)計(jì)選擇 7.4.2. 使你的數(shù)據(jù)盡可能小 7.4.3. 列索引 7.4.4. 多列索引 7.4.5. MySQL如何使用索引 7.4.6. MyISAM鍵高速緩沖 7.4.7. MyISAM索引統(tǒng)計(jì)集合 7.4.8. MySQL如何計(jì)算打開(kāi)的表 7.4.9. MySQL如何打開(kāi)和關(guān)閉表 7.4.10. 在同一個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建多個(gè)表的缺陷 7.5. 優(yōu)化MySQL服務(wù)器 7.5.1. 系統(tǒng)因素和啟動(dòng)參數(shù)的調(diào)節(jié) 7.5.2. 調(diào)節(jié)服務(wù)器參數(shù) 7.5.3. 控制查詢優(yōu)化器的性能 7.5.4. 編譯和鏈接怎樣影響MySQL的速度 7.5.5. MySQL如何使用內(nèi)存 7.5.6. MySQL如何使用DNS 7.6. 磁盤(pán)事宜 7.6.1. 使用符號(hào)鏈接 8. 客戶端和實(shí)用工具程序 8.1. 客戶端腳本和實(shí)用工具概述 8.2. myisampack:生成壓縮、只讀MyISAM表 8.3. mysql:MySQL命令行工具 8.3.1. 選項(xiàng) 8.3.2. mysql命令 8.3.3. 怎樣從文本文件執(zhí)行SQL語(yǔ)句 8.3.4. mysql技巧 8.4. mysqlaccess:用于檢查訪問(wèn)權(quán)限的客戶端 8.5. mysqladmin:用于管理MySQL服務(wù)器的客戶端 8.6. mysqlbinlog:用于處理二進(jìn)制日志文件的實(shí)用工具 8.7. mysqlcheck:表維護(hù)和維修程序 8.8. mysqldump:數(shù)據(jù)庫(kù)備份程序 8.9. mysqlhotcopy:數(shù)據(jù)庫(kù)備份程序 8.10. mysqlimport:數(shù)據(jù)導(dǎo)入程序 8.11. mysqlshow-顯示數(shù)據(jù)庫(kù)、表和列信息 8.12. myisamlog:顯示MyISAM日志文件內(nèi)容 8.13. perror:解釋錯(cuò)誤代碼 8.14. replace:字符串替換實(shí)用工具 8.15. mysql_zap:殺死符合某一模式的進(jìn)程 9. 語(yǔ)言結(jié)構(gòu) 9.1. 文字值 9.1.1. 字符串 9.1.2. 數(shù)值 9.1.3. 十六進(jìn)制值 9.1.4. 布爾值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 數(shù)據(jù)庫(kù)、表、索引、列和別名 9.2.1. 識(shí)別符限制條件 9.2.2. 識(shí)別符大小寫(xiě)敏感性 9.3. 用戶變量 9.4. 系統(tǒng)變量 9.4.1. 結(jié)構(gòu)式系統(tǒng)變量 9.5. 注釋語(yǔ)法 9.6. MySQL中保留字的處理 10. 字符集支持 10.1. 常規(guī)字符集和校對(duì) 10.2. MySQL中的字符集和校對(duì) 10.3. 確定默認(rèn)字符集和校對(duì) 10.3.1. 服務(wù)器字符集和校對(duì) 10.3.2. 數(shù)據(jù)庫(kù)字符集和校對(duì) 10.3.3. 表字符集和校對(duì) 10.3.4. 列字符集和校對(duì) 10.3.5. 字符集和校對(duì)分配示例 10.3.6. 連接字符集和校對(duì) 10.3.7. 字符串文字字符集和校對(duì) 10.3.8. 在SQL語(yǔ)句中使用COLLATE 10.3.9. COLLATE子句優(yōu)先 10.3.10. BINARY操作符 10.3.11. 校對(duì)確定較為復(fù)雜的一些特殊情況 10.3.12. 校對(duì)必須適合字符集 10.3.13. 校對(duì)效果的示例 10.4. 字符集支持影響到的操作 10.4.1. 結(jié)果字符串 10.4.2. CONVERT() 10.4.3. CAST() 10.4.4. SHOW語(yǔ)句 10.5. Unicode支持 10.6. 用于元數(shù)據(jù)的UTF8 10.7. 與其它DBMS的兼容性 10.8. 新字符集配置文件格式 10.9. 國(guó)家特有字符集 10.10. MySQL支持的字符集和校對(duì) 10.10.1. Unicode字符集 10.10.2. 西歐字符集 10.10.3. 中歐字符集 10.10.4. 南歐與中東字符集 10.10.5. 波羅的海字符集 10.10.6. 西里爾字符集 10.10.7. 亞洲字符集 11. 列類(lèi)型 11.1. 列類(lèi)型概述 11.1.1. 數(shù)值類(lèi)型概述 11.1.2. 日期和時(shí)間類(lèi)型概述 11.1.3. 字符串類(lèi)型概述 11.2. 數(shù)值類(lèi)型 11.3. 日期和時(shí)間類(lèi)型 11.3.1. DATETIME、DATE和TIMESTAMP類(lèi)型 11.3.2. TIME類(lèi)型 11.3.3. YEAR類(lèi)型 11.3.4. Y2K事宜和日期類(lèi)型 11.4. String類(lèi)型 11.4.1. CHAR和VARCHAR類(lèi)型 11.4.2. BINARY和VARBINARY類(lèi)型 11.4.3. BLOB和TEXT類(lèi)型 11.4.4. ENUM類(lèi)型 11.4.5. SET類(lèi)型 11.5. 列類(lèi)型存儲(chǔ)需求 11.6. 選擇正確的列類(lèi)型 11.7. 使用來(lái)自其他數(shù)據(jù)庫(kù)引擎的列類(lèi)型 12. 函數(shù)和操作符 12.1. 操作符 12.1.1. 操作符優(yōu)先級(jí) 12.1.2. 圓括號(hào) 12.1.3. 比較函數(shù)和操作符 12.1.4. 邏輯操作符 12.2. 控制流程函數(shù) 12.3. 字符串函數(shù) 12.3.1. 字符串比較函數(shù) 12.4. 數(shù)值函數(shù) 12.4.1. 算術(shù)操作符 12.4.2. 數(shù)學(xué)函數(shù) 12.5. 日期和時(shí)間函數(shù) 12.6. MySQL使用什么日歷? 12.7. 全文搜索功能 12.7.1. 布爾全文搜索 12.7.2. 全文搜索帶查詢擴(kuò)展 12.7.3. 全文停止字 12.7.4. 全文限定條件 12.7.5. 微調(diào)MySQL全文搜索 12.8. Cast函數(shù)和操作符 12.9. 其他函數(shù) 12.9.1. 位函數(shù) 12.9.2. 加密函數(shù) 12.9.3. 信息函數(shù) 12.9.4. 其他函數(shù) NoName 12.10.1. GROUP BY(聚合)函數(shù) 12.10.2. GROUP BY修改程序 12.10.3. 具有隱含字段的GROUP BY 13. SQL語(yǔ)句語(yǔ)法 13.1. 數(shù)據(jù)定義語(yǔ)句 13.1.1. ALTER DATABASE語(yǔ)法 13.1.2. ALTER TABLE語(yǔ)法 13.1.3. CREATE DATABASE語(yǔ)法 13.1.4. CREATE INDEX語(yǔ)法 13.1.5. CREATE TABLE語(yǔ)法 13.1.6. DROP DATABASE語(yǔ)法 13.1.7. DROP INDEX語(yǔ)法 13.1.8. DROP TABLE語(yǔ)法 13.1.9. RENAME TABLE語(yǔ)法 13.2. 數(shù)據(jù)操作語(yǔ)句 13.2.1. DELETE語(yǔ)法 13.2.2. DO語(yǔ)法 13.2.3. HANDLER語(yǔ)法 13.2.4. INSERT語(yǔ)法 13.2.5. LOAD DATA INFILE語(yǔ)法 13.2.6. REPLACE語(yǔ)法 13.2.7. SELECT語(yǔ)法 13.2.8. Subquery語(yǔ)法 13.2.9. TRUNCATE語(yǔ)法 13.2.10. UPDATE語(yǔ)法 13.3. MySQL實(shí)用工具語(yǔ)句 13.3.1. DESCRIBE語(yǔ)法(獲取有關(guān)列的信息) 13.3.2. USE語(yǔ)法 13.4. MySQL事務(wù)處理和鎖定語(yǔ)句 13.4.1. START TRANSACTION 13.4.2. 不能回滾的語(yǔ)句 13.4.3. 會(huì)造成隱式提交的語(yǔ)句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT語(yǔ)法 13.4.5. LOCK TABLES和UNLOCK TABLES語(yǔ)法 13.4.6. SET TRANSACTION語(yǔ)法 13.4.7. XA事務(wù) 13.5. 數(shù)據(jù)庫(kù)管理語(yǔ)句 13.5.1. 賬戶管理語(yǔ)句 13.5.2. 表維護(hù)語(yǔ)句 13.5.3. SET語(yǔ)法 13.5.4. SHOW語(yǔ)法 13.5.5. 其它管理語(yǔ)句 13.6. 復(fù)制語(yǔ)句 13.6.1. 用于控制主服務(wù)器的SQL語(yǔ)句 13.6.2. 用于控制從服務(wù)器的SQL語(yǔ)句 13.7. 用于預(yù)處理語(yǔ)句的SQL語(yǔ)法 14. 插件式存儲(chǔ)引擎體系結(jié)構(gòu) 14.1. 前言 14.2. 概述 14.3. 公共MySQL數(shù)據(jù)庫(kù)服務(wù)器層 14.4. 選擇存儲(chǔ)引擎 14.5. 將存儲(chǔ)引擎指定給表 14.6. 存儲(chǔ)引擎和事務(wù) 14.7. 插入存儲(chǔ)引擎 14.8. 拔出存儲(chǔ)引擎 14.9. 插件式存儲(chǔ)器的安全含義 15. 存儲(chǔ)引擎和表類(lèi)型 15.1. MyISAM存儲(chǔ)引擎 15.1.1. MyISAM啟動(dòng)選項(xiàng) 15.1.2. 鍵所需的空間 15.1.3. MyISAM表的存儲(chǔ)格式 15.1.4. MyISAM表方面的問(wèn)題 15.2. InnoDB存儲(chǔ)引擎 15.2.1. InnoDB概述 15.2.2. InnoDB聯(lián)系信息 15.2.3. InnoDB配置 15.2.4. InnoDB啟動(dòng)選項(xiàng) 15.2.5. 創(chuàng)建InnoDB表空間 15.2.6. 創(chuàng)建InnoDB表 15.2.7. 添加和刪除InnoDB數(shù)據(jù)和日志文件 15.2.8. InnoDB數(shù)據(jù)庫(kù)的備份和恢復(fù) 15.2.9. 將InnoDB數(shù)據(jù)庫(kù)移到另一臺(tái)機(jī)器上 15.2.10. InnoDB事務(wù)模型和鎖定 15.2.11. InnoDB性能調(diào)節(jié)提示 15.2.12. 多版本的實(shí)施 15.2.13. 表和索引結(jié)構(gòu) 15.2.14. 文件空間管理和磁盤(pán)I/O 15.2.15. InnoDB錯(cuò)誤處理 15.2.16. 對(duì)InnoDB表的限制 15.2.17. InnoDB故障診斷與排除 15.3. MERGE存儲(chǔ)引擎 15.3.1. MERGE表方面的問(wèn)題 15.4. MEMORY (HEAP)存儲(chǔ)引擎 15.5. BDB (BerkeleyDB)存儲(chǔ)引擎 15.5.1. BDB支持的操作系統(tǒng) 15.5.2. 安裝BDB 15.5.3. BDB啟動(dòng)選項(xiàng) 15.5.4. BDB表的特性 15.5.5. 修改BDB所需的事宜 15.5.6. 對(duì)BDB表的限制 15.5.7. 使用BDB表時(shí)可能出現(xiàn)的錯(cuò)誤 15.6. EXAMPLE存儲(chǔ)引擎 15.7. FEDERATED存儲(chǔ)引擎 15.7.1. 安裝FEDERATED存儲(chǔ)引擎 15.7.2. FEDERATED存儲(chǔ)引擎介紹 15.7.3. 如何使用FEDERATED表 15.7.4. FEDERATED存儲(chǔ)引擎的局限性 15.8. ARCHIVE存儲(chǔ)引擎 15.9. CSV存儲(chǔ)引擎 15.10. BLACKHOLE存儲(chǔ)引擎 16. 編寫(xiě)自定義存儲(chǔ)引擎 16.1. 前言 16.2. 概述 16.3. 創(chuàng)建存儲(chǔ)引擎源文件 NoName 16.5. 對(duì)處理程序進(jìn)行實(shí)例化處理 16.6. 定義表擴(kuò)展 16.7. 創(chuàng)建表 16.8. 打開(kāi)表 16.9. 實(shí)施基本的表掃描功能 16.9.1. 實(shí)施store_lock()函數(shù) 16.9.2. 實(shí)施external_lock()函數(shù) 16.9.3. 實(shí)施rnd_init()函數(shù) 16.9.4. 實(shí)施info()函數(shù) 16.9.5. 實(shí)施extra()函數(shù) 16.9.6. 實(shí)施rnd_next()函數(shù) 16.10. 關(guān)閉表 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. 多計(jì)算機(jī)的簡(jiǎn)單基礎(chǔ)知識(shí) 17.3.1. 硬件、軟件和聯(lián)網(wǎng) 17.3.2. 安裝 17.3.3. 配置 17.3.4. 首次啟動(dòng) 17.3.5. 加載示例數(shù)據(jù)并執(zhí)行查詢 17.3.6. 安全關(guān)閉和重啟 17.4. MySQL簇的配置 17.4.1. 從源碼創(chuàng)建MySQL簇 17.4.2. 安裝軟件 17.4.3. MySQL簇的快速測(cè)試設(shè)置 17.4.4. 配置文件 17.5. MySQL簇中的進(jìn)程管理 17.5.1. 用于MySQL簇的MySQL服務(wù)器進(jìn)程使用 17.5.2. ndbd,存儲(chǔ)引擎節(jié)點(diǎn)進(jìn)程 17.5.3. ndb_mgmd,“管理服務(wù)器”進(jìn)程 17.5.4. ndb_mgm,“管理客戶端”進(jìn)程 17.5.5. 用于MySQL簇進(jìn)程的命令選項(xiàng) 17.6. MySQL簇的管理 17.6.1. MySQL簇的啟動(dòng)階段 17.6.2. “管理客戶端”中的命令 17.6.3. MySQL簇中生成的事件報(bào)告 17.6.4. 單用戶模式 17.6.5. MySQL簇的聯(lián)機(jī)備份 17.7. 使用與MySQL簇的高速互連 17.7.1. 配置MySQL簇以使用SCI套接字 17.7.2. 理解簇互連的影響 17.8. MySQL簇的已知限制 17.9. MySQL簇發(fā)展的重要?dú)v程 17.9.1. MySQL 5.0中的MySQL簇變化 17.9.2. 關(guān)于MySQL簇的MySQL 5.1發(fā)展歷程 17.10. MySQL簇常見(jiàn)問(wèn)題解答 17.11. MySQL簇術(shù)語(yǔ)表 18. 分區(qū) 18.1. MySQL中的分區(qū)概述 18.2. 分區(qū)類(lèi)型 18.2.1. RANGE分區(qū) 18.2.2. LIST分區(qū) 18.2.3. HASH分區(qū) 18.2.4. KEY分區(qū) 18.2.5. 子分區(qū) 18.2.6. MySQL分區(qū)處理NULL值的方式 18.3. 分區(qū)管理 18.3.1. RANGE和LIST分區(qū)的管理 18.3.2. HASH和KEY分區(qū)的管理 18.3.3. 分區(qū)維護(hù) 18.3.4. 獲取關(guān)于分區(qū)的信息 19. MySQL中的空間擴(kuò)展 19.1. 前言 19.2. OpenGIS幾何模型 19.2.1. Geometry類(lèi)的層次 19.2.2. 類(lèi)Geometry 19.2.3. 類(lèi)Point 19.2.4. 類(lèi)Curve 19.2.5. 類(lèi)LineString 19.2.6. 類(lèi)Surface 19.2.7. 類(lèi)Polygon 19.2.8. 類(lèi)GeometryCollection 19.2.9. 類(lèi)MultiPoint 19.2.10. 類(lèi)MultiCurve 19.2.11. 類(lèi)MultiLineString 19.2.12. 類(lèi)MultiSurface 19.2.13. 類(lèi)MultiPolygon 19.3. 支持的空間數(shù)據(jù)格式 19.3.1. 著名的文本(WKT)格式 19.3.2. 著名的二進(jìn)制(WKB)格式 19.4. 創(chuàng)建具備空間功能的MySQL數(shù)據(jù)庫(kù) 19.4.1. MySQL空間數(shù)據(jù)類(lèi)型 19.4.2. 創(chuàng)建空間值 19.4.3. 創(chuàng)建空間列 19.4.4. 填充空間列 19.4.5. 獲取空間數(shù)據(jù) 19.5. 分析空間信息 19.5.1. Geometry格式轉(zhuǎn)換函數(shù) 19.5.2. Geometry函數(shù) 19.5.3. 從已有Geometry創(chuàng)建新Geometry的函數(shù) 19.5.4. 測(cè)試幾何對(duì)象間空間關(guān)系的函數(shù) 19.5.5. 關(guān)于幾何最小邊界矩形(MBR)的關(guān)系 19.5.6. 測(cè)試幾何類(lèi)之間空間關(guān)系的函數(shù) 19.6. 優(yōu)化空間分析 19.6.1. 創(chuàng)建空間索引 19.6.2. 使用空間索引 19.7. MySQL的一致性和兼容性 19.7.1. 尚未實(shí)施的GIS特性 20. 存儲(chǔ)程序和函數(shù) 20.1. 存儲(chǔ)程序和授權(quán)表 20.2. 存儲(chǔ)程序的語(yǔ)法 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語(yǔ)句 20.2.7. BEGIN ... END復(fù)合語(yǔ)句 20.2.8. DECLARE語(yǔ)句 20.2.9. 存儲(chǔ)程序中的變量 20.2.10. 條件和處理程序 20.2.11. 光標(biāo) 20.2.12. 流程控制構(gòu)造 20.3. 存儲(chǔ)程序、函數(shù)、觸發(fā)程序和復(fù)制:常見(jiàn)問(wèn)題 20.4. 存儲(chǔ)子程序和觸發(fā)程序的二進(jìn)制日志功能 21. 觸發(fā)程序 21.1. CREATE TRIGGER語(yǔ)法 21.2. DROP TRIGGER語(yǔ)法 21.3. 使用觸發(fā)程序 22. 視圖 22.1. ALTER VIEW語(yǔ)法 22.2. CREATE VIEW語(yǔ)法 22.3. DROP VIEW語(yǔ)法 22.4. SHOW CREATE VIEW語(yǔ)法 23. INFORMATION_SCHEMA信息數(shù)據(jù)庫(kù) 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. 精度數(shù)學(xué) 24.1. 數(shù)值的類(lèi)型 24.2. DECIMAL數(shù)據(jù)類(lèi)型更改 24.3. 表達(dá)式處理 24.4. 四舍五入 24.5. 精度數(shù)學(xué)示例 25. API和庫(kù) 25.1. libmysqld,嵌入式MySQL服務(wù)器庫(kù) 25.1.1. 嵌入式MySQL服務(wù)器庫(kù)概述 25.1.2. 使用libmysqld編譯程序 25.1.3. 使用嵌入式MySQL服務(wù)器時(shí)的限制 25.1.4. 與嵌入式服務(wù)器一起使用的選項(xiàng) 25.1.5. 嵌入式服務(wù)器中尚需完成的事項(xiàng)(TODO) 25.1.6. 嵌入式服務(wù)器示例 25.1.7. 嵌入式服務(wù)器的許可 25.2. MySQL C API 25.2.1. C API數(shù)據(jù)類(lèi)型 25.2.2. C API函數(shù)概述 25.2.3. C API函數(shù)描述 25.2.4. C API預(yù)處理語(yǔ)句 25.2.5. C API預(yù)處理語(yǔ)句的數(shù)據(jù)類(lèi)型 25.2.6. C API預(yù)處理語(yǔ)句函數(shù)概述 25.2.7. C API預(yù)處理語(yǔ)句函數(shù)描述 25.2.8. C API預(yù)處理語(yǔ)句方面的問(wèn)題 25.2.9. 多查詢執(zhí)行的C API處理 25.2.10. 日期和時(shí)間值的C API處理 25.2.11. C API線程函數(shù)介紹 25.2.12. C API嵌入式服務(wù)器函數(shù)介紹 25.2.13. 使用C API時(shí)的常見(jiàn)問(wèn)題 25.2.14. 創(chuàng)建客戶端程序 25.2.15. 如何生成線程式客戶端 25.3. MySQL PHP API 25.3.1. 使用MySQL和PHP的常見(jiàn)問(wèn)題 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程序開(kāi)發(fā)實(shí)用工具 25.9.1. msql2mysql:轉(zhuǎn)換mSQL程序以用于MySQL 25.9.2. mysql_config:獲取編譯客戶端的編譯選項(xiàng) 26. 連接器 26.1. MySQL Connector/ODBC 26.1.1. MyODBC介紹 26.1.2. 關(guān)于ODBC和MyODBC的一般信息 26.1.3. 如何安裝MyODBC 26.1.4. 在Windows平臺(tái)上從二進(jìn)制版本安裝MyODBC 26.1.5. I在Unix平臺(tái)上從二進(jìn)制版本安裝MyODBC 26.1.6. 在Windows平臺(tái)上從源碼版本安裝MyODBC 26.1.7. 在Unix平臺(tái)上從源碼版本安裝MyODBC 26.1.8. 從BitKeeper開(kāi)發(fā)源碼樹(shù)安裝MyODBC 26.1.9. MyODBC配置 26.1.10. 與MyODBC連接相關(guān)的事宜 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應(yīng)用步驟 26.1.16. MyODBC API引用 26.1.17. MyODBC數(shù)據(jù)類(lèi)型 26.1.18. MyODBC錯(cuò)誤代碼 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體系結(jié)構(gòu) 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方面的問(wèn)題 26.3.6. Changelog 26.4. MySQL Connector/MXJ 26.4.1. 前言 26.4.2. 支持平臺(tái): 26.4.3. Junit測(cè)試要求 26.4.4. 運(yùn)行Junit測(cè)試 26.4.5. 作為JDBC驅(qū)動(dòng)程序的一部分運(yùn)行 26.4.6. 在Java對(duì)象中運(yùn)行 26.4.7. MysqldResource API 26.4.8. 在JMX代理(custom)中運(yùn)行 26.4.9. 部署在標(biāo)準(zhǔn)的JMX代理環(huán)境下 (JBoss) 26.4.10. 安裝 27. 擴(kuò)展MySQL 27.1. MySQL內(nèi)部控件 27.1.1. MySQL線程 27.1.2. MySQL測(cè)試套件 27.2. 為MySQL添加新函數(shù) 27.2.1. 自定義函數(shù)接口的特性 27.2.2. CREATE FUNCTION/DROP FUNCTION語(yǔ)法 27.2.3. 添加新的自定義函數(shù) 27.2.4. 添加新的固有函數(shù) 27.3. 為MySQL添加新步驟 27.3.1. 步驟分析 27.3.2. 編寫(xiě)步驟 A. 問(wèn)題和常見(jiàn)錯(cuò)誤 A.1. 如何確定導(dǎo)致問(wèn)題的原因 A.2. 使用MySQL程序時(shí)的常見(jiàn)錯(cuò)誤 A.2.1. 拒絕訪問(wèn) A.2.2. 無(wú)法連接到[local] MySQL服務(wù)器 A.2.3. 客戶端不支持鑒定協(xié)議 A.2.4. 輸入密碼時(shí)出現(xiàn)密碼錯(cuò)誤 NoName A.2.6. 連接數(shù)過(guò)多 A.2.7. 內(nèi)存溢出 A.2.8. MySQL服務(wù)器不可用 A.2.9. 信息包過(guò)大 A.2.10. 通信錯(cuò)誤和失效連接 A.2.11. 表已滿 A.2.12. 無(wú)法創(chuàng)建文件/寫(xiě)入文件 A.2.13. 命令不同步 A.2.14. 忽略用戶 A.2.15. 表tbl_name不存在 A.2.16. 無(wú)法初始化字符集 A.2.17. 文件未找到 A.3. 與安裝有關(guān)的事宜 A.3.1. 與MySQL客戶端庫(kù)的鏈接問(wèn)題 A.3.2. 如何以普通用戶身份運(yùn)行MySQL A.3.3. 與文件許可有關(guān)的問(wèn)題 A.4. 與管理有關(guān)的事宜 A.4.1. 如何復(fù)位根用戶密碼 A.4.2. 如果MySQL依然崩潰,應(yīng)作些什么 A.4.3. MySQL處理磁盤(pán)滿的方式 A.4.4. MySQL將臨時(shí)文件儲(chǔ)存在哪里 A.4.5. 如何保護(hù)或更改MySQL套接字文件/tmp/mysql.sock A.4.6. 時(shí)區(qū)問(wèn)題 A.5. 與查詢有關(guān)的事宜 A.5.1. 搜索中的大小寫(xiě)敏感性 A.5.2. 使用DATE列方面的問(wèn)題 A.5.3. 與NULL值有關(guān)的問(wèn)題 A.5.4. 與列別名有關(guān)的問(wèn)題 A.5.5. 非事務(wù)表回滾失敗 A.5.6. 從相關(guān)表刪除行 A.5.7. 解決與不匹配行有關(guān)的問(wèn)題 A.5.8. 與浮點(diǎn)比較有關(guān)的問(wèn)題 A.6. 與優(yōu)化器有關(guān)的事宜 A.7. 與表定義有關(guān)的事宜 A.7.1. 與ALTER TABLE有關(guān)的問(wèn)題 A.7.2. 如何更改表中的列順序 A.7.3. TEMPORARY TABLE問(wèn)題 A.8. MySQL中的已知事宜 A.8.1. MySQL中的打開(kāi)事宜 B. 錯(cuò)誤代碼和消息 B.1. 服務(wù)器錯(cuò)誤代碼和消息 B.2. 客戶端錯(cuò)誤代碼和消息 C. 感謝 C.1. MySQL AB處的開(kāi)發(fā)人 C.2. MySQL貢獻(xiàn)人 C.3. 資料員和譯員 C.4. MySQL使用和包含的庫(kù) C.5. 支持MySQL的軟件包 C.6. 用于創(chuàng)建MySQL的工具 C.7. MySQL支持人員 D. MySQL變更史 D.1. 5.1.x版中的變更情況(開(kāi)發(fā)) D.1.1. 5.1.2版中的變更情況(尚未發(fā)布) D.1.2. 5.1.1版中的變更情況(尚未發(fā)布) D.2. MyODBC的變更情況 D.2.1. MyODBC 3.51.12的變更情況 D.2.2. MyODBC 3.51.11的變更情況 E. 移植到其他系統(tǒng) E.1. 調(diào)試MySQL服務(wù)器 E.1.1. 針對(duì)調(diào)試編譯MySQL E.1.2. 創(chuàng)建跟蹤文件 E.1.3. 在gdb環(huán)境下調(diào)試mysqld E.1.4. 使用堆棧跟蹤 E.1.5. 使用日志文件找出mysqld中的錯(cuò)誤原因 E.1.6. 如果出現(xiàn)表崩潰,請(qǐng)生成測(cè)試案例 E.2. 調(diào)試MySQL客戶端 E.3. DBUG軟件包 E.4. 關(guān)于RTS線程的注釋 E.5. 線程軟件包之間的差異 F. 環(huán)境變量 G. MySQL正則表達(dá)式 H. MySQL中的限制 H.1. 聯(lián)合的限制 I. 特性限制 I.1. 對(duì)存儲(chǔ)子程序和觸發(fā)程序的限制 I.2. 對(duì)服務(wù)器端光標(biāo)的限制 I.3. 對(duì)子查詢的限制 I.4. 對(duì)視圖的限制 I.5. 對(duì)XA事務(wù)的限制 J. GNU通用公共許可 K. MySQL FLOSS許可例外 索引
characters

第10章:字符集支持

目錄

10.1. 常規(guī)字符集和校對(duì)
10.2. MySQL中的字符集和校對(duì)
10.3. 確定默認(rèn)字符集和校對(duì)
10.3.1. 服務(wù)器字符集和校對(duì)
10.3.2. 數(shù)據(jù)庫(kù)字符集和校對(duì)
10.3.3. 表字符集和校對(duì)
10.3.4. 列字符集和校對(duì)
10.3.5. 字符集和校對(duì)分配示例
10.3.6. 連接字符集和校對(duì)
10.3.7. 字符串文字字符集和校對(duì)
10.3.8. 在SQL語(yǔ)句中使用COLLATE
10.3.9. COLLATE子句優(yōu)先
10.3.10. BINARY操作符
10.3.11. 校對(duì)確定較為復(fù)雜的一些特殊情況
10.3.12. 校對(duì)必須適合字符集
10.3.13. 校對(duì)效果的示例
10.4. 字符集支持影響到的操作
10.4.1. 結(jié)果字符串
10.4.2. CONVERT()
10.4.3. CAST()
10.4.4. SHOW語(yǔ)句
10.5. Unicode支持
10.6. 用于元數(shù)據(jù)的UTF8
10.7. 與其它DBMS的兼容性
10.8. 新字符集配置文件格式
10.9. 國(guó)家特有字符集
10.10. MySQL支持的字符集和校對(duì)
10.10.1. Unicode字符集
10.10.2. 西歐字符集
10.10.3. 中歐字符集
10.10.4. 南歐與中東字符集
10.10.5. 波羅的海字符集
10.10.6. 西里爾字符集
10.10.7. 亞洲字符集

本章討論以下主題:

·???????? 什么是字符集和校對(duì)規(guī)則?

·???????? 多級(jí)默認(rèn)系統(tǒng)

·???????? 字符集語(yǔ)法

·???????? 相關(guān)函數(shù)和運(yùn)算

·???????? Unicode支持

·???????? 每個(gè)字符集和校對(duì)規(guī)則的含義

MySQL5.1中的字符集支持包括在MyISAM、MEMORYInnoDB存儲(chǔ)引擎中。

10.1.?常規(guī)字符集和校對(duì)

字符集是一套符號(hào)和編碼。校對(duì)規(guī)則是在字符集內(nèi)用于比較字符的一套規(guī)則。讓我們使用一個(gè)假想字符集的例子來(lái)區(qū)別清楚。

假設(shè)我們有一個(gè)字母表使用了四個(gè)字母:‘A’、‘B’、‘a’、‘b’。我們?yōu)槊總€(gè)字母賦予一個(gè)數(shù)值:‘A=0,‘B= 1,‘a= 2,‘b= 3。字母‘A’是一個(gè)符號(hào),數(shù)字0是‘A’的編碼,這四個(gè)字母和它們的編碼組合在一起是一個(gè)字符集。

假設(shè)我們希望比較兩個(gè)字符串的值:‘A’和‘B’。比較的最簡(jiǎn)單的方法是查找編碼:‘A’為0,‘B’為1。因?yàn)?span>0 小于1,我們可以說(shuō)‘A’小于‘B’。我們做的僅僅是在我們的字符集上應(yīng)用了一個(gè) 校對(duì)規(guī)則。校對(duì)規(guī)則是一套規(guī)則(在這種情況下僅僅是一套規(guī)則):“對(duì)編碼進(jìn)行比較。”我們稱這種全部可能的規(guī)則中的最簡(jiǎn)單的 校對(duì)規(guī)則為一個(gè)binary(二元)校對(duì)規(guī)則。

但是,如果我們希望小寫(xiě)字母和大寫(xiě)字母是等價(jià)的,應(yīng)該怎樣?那么,我們將至少有兩個(gè)規(guī)則:(1)把小寫(xiě)字母‘a’和‘b’視為與‘A’和‘B’等價(jià);(2)然后比較編碼。我們稱這是一個(gè)大小寫(xiě)不敏感的 校對(duì)規(guī)則。比二元校對(duì)規(guī)則復(fù)雜一些。

在實(shí)際生活中,大多數(shù)字符集有許多字符:不僅僅是‘A’和‘B’,而是整個(gè)字母表,有時(shí)候有許多種字母表,或者一個(gè)東方的使用上千個(gè)字符的書(shū)寫(xiě)系統(tǒng),還有許多特殊符號(hào)和標(biāo)點(diǎn)符號(hào)。并且在實(shí)際生活中,大多數(shù) 校對(duì)規(guī)則有許多個(gè)規(guī)則:不僅僅是大小寫(xiě)不敏感,還包括重音符不敏感(“重音符” 是附屬于一個(gè)字母的符號(hào),象德語(yǔ)的‘?’符號(hào))和多字節(jié)映射(例如,作為規(guī)則‘?=OE’就是兩個(gè)德語(yǔ) 校對(duì)規(guī)則的一種)。

MySQL5.1能夠做這些事情:

·???????? 使用多種字符集來(lái)存儲(chǔ)字符串

·???????? 使用多種校對(duì)規(guī)則來(lái)比較字符串

·???????? 在同一臺(tái)服務(wù)器、同一個(gè)數(shù)據(jù)庫(kù)或甚至在同一個(gè)表中使用不同字符集或校對(duì)規(guī)則來(lái)混合字符串

·???????? 允許定義任何級(jí)別的字符集和校對(duì)規(guī)則

在這些方面,MySQL5.1不僅比MySQL4.1以前的版本靈活得多,而且比其它大多數(shù)數(shù)據(jù)庫(kù)管理系統(tǒng)超前許多。但是,為了有效地使用這些功能,你需要了解哪些字符集和 校對(duì)規(guī)則是可用的,怎樣改變默認(rèn)值,以及它們?cè)鯓佑绊懽址僮鞣妥址瘮?shù)的行為。

10.2.?MySQL中的字符集和校對(duì)

MySQL服務(wù)器能夠支持多種字符集??梢允褂?span>SHOW CHARACTER SET語(yǔ)句列出可用的字符集:

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 |
...

(完整列表參見(jiàn)10.10節(jié),“MySQL支持的字符集和校對(duì)”。)

任何一個(gè)給定的字符集至少有一個(gè)校對(duì)規(guī)則。它可能有幾個(gè)校對(duì)規(guī)則。

要想列出一個(gè)字符集的校對(duì)規(guī)則,使用SHOW COLLATION語(yǔ)句。例如,要想查看latin1(“西歐ISO-8859-1)字符集的 校對(duì)規(guī)則,使用下面的語(yǔ)句查找那些名字以latin1開(kāi)頭的 校對(duì)規(guī)則:

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校對(duì)規(guī)則有下面的含義:

校對(duì)規(guī)則

含義

latin1_german1_ci

德國(guó)DIN-1

latin1_swedish_ci

瑞典/芬蘭

latin1_danish_ci

丹麥/挪威

latin1_german2_ci

德國(guó) DIN-2

latin1_bin

符合latin1編碼的二進(jìn)制

latin1_general_ci

多種語(yǔ)言(西歐)

latin1_general_cs

多種語(yǔ)言(西歐ISO),大小寫(xiě)敏感

latin1_spanish_ci

現(xiàn)代西班牙

校對(duì)規(guī)則一般有這些特征:

·???????? 兩個(gè)不同的字符集不能有相同的校對(duì)規(guī)則。

·???????? 每個(gè)字符集有一個(gè)默認(rèn)校對(duì)規(guī)則。例如,latin1默認(rèn)校對(duì)規(guī)則是latin1_swedish_ci。

·???????? 存在校對(duì)規(guī)則命名約定:它們以其相關(guān)的字符集名開(kāi)始,通常包括一個(gè)語(yǔ)言名,并且以_ci(大小寫(xiě)不敏感)、_cs(大小寫(xiě)敏感)或_bin(二元)結(jié)束。

10.3.?確定默認(rèn)字符集和校對(duì)

10.3.1. 服務(wù)器字符集和校對(duì)
10.3.2. 數(shù)據(jù)庫(kù)字符集和校對(duì)
10.3.3. 表字符集和校對(duì)
10.3.4. 列字符集和校對(duì)
10.3.5. 字符集和校對(duì)分配示例
10.3.6. 連接字符集和校對(duì)
10.3.7. 字符串文字字符集和校對(duì)
10.3.8. 在SQL語(yǔ)句中使用COLLATE
10.3.9. COLLATE子句優(yōu)先
10.3.10. BINARY操作符
10.3.11. 校對(duì)確定較為復(fù)雜的一些特殊情況
10.3.12. 校對(duì)必須適合字符集
10.3.13. 校對(duì)效果的示例
字符集和校對(duì)規(guī)則有4個(gè)級(jí)別的默認(rèn)設(shè)置:服務(wù)器級(jí)、數(shù)據(jù)庫(kù)級(jí)、表級(jí)和連接級(jí)。以下描述可能顯得復(fù)雜,但是在實(shí)際應(yīng)用中可以發(fā)現(xiàn)使用多種級(jí)別會(huì)使結(jié)果自然而明顯。

10.3.1.?服務(wù)器字符集和校對(duì)

MySQL服務(wù)器有一個(gè)服務(wù)器字符集和一個(gè)服務(wù)器校對(duì)規(guī)則,它們均不能設(shè)置為空。

MySQL按照如下方法確定服務(wù)器字符集和服務(wù)器校對(duì)規(guī)則:

·???????? 當(dāng)服務(wù)器啟動(dòng)時(shí)根據(jù)有效的選項(xiàng)設(shè)置

·???????? 根據(jù)運(yùn)行時(shí)的設(shè)定值

在服務(wù)器級(jí)別,確定方法很簡(jiǎn)單。當(dāng)啟動(dòng)mysqld時(shí),根據(jù)使用的初始選項(xiàng)設(shè)置來(lái)確定服務(wù)器字符集和 校對(duì)規(guī)則??梢允褂?/span>--default-character-set設(shè)置字符集,并且可以在字符集后面為 校對(duì)規(guī)則添加--default-collation。如果沒(méi)有指定一個(gè)字符集,那就與--default-character-set=latin1相同。如果你僅指定了一個(gè)字符集(例如,latin1),但是沒(méi)有指定一個(gè) 校對(duì)規(guī)則,那就與--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因?yàn)?/span>latin1_swedish_cilatin1默認(rèn)校對(duì)規(guī)則。因此,以下三個(gè)命令有相同的效果:

shell> mysqld

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

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

?????????? --default-collation=latin1_swedish_ci

更改設(shè)定值的一個(gè)方法是通過(guò)重新編譯。如果希望在從源程序構(gòu)建時(shí)更改默認(rèn)服務(wù)器字符集和校對(duì)規(guī)則,使用:--with-charset--with-collation作為configure的參量。例如:

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

或者:

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

?????????? --with-collation=latin1_german1_ci

mysqldconfigure都驗(yàn)證字符集/校對(duì)規(guī)則組合是否有效。如果無(wú)效,每個(gè)程序都顯示一個(gè)錯(cuò)誤信息,然后終止。

當(dāng)前的服務(wù)器字符集和校對(duì)規(guī)則可以用作character_set_servercollation_server系統(tǒng)變量的值。在運(yùn)行時(shí)能夠改變這些變量的值。

10.3.2.?數(shù)據(jù)庫(kù)字符集和校對(duì)

每一個(gè)數(shù)據(jù)庫(kù)有一個(gè)數(shù)據(jù)庫(kù)字符集和一個(gè)數(shù)據(jù)庫(kù)校對(duì)規(guī)則,它不能夠?yàn)榭铡?span>CREATE DATABASE和ALTER DATABASE語(yǔ)句有一個(gè)可選的子句來(lái)指定數(shù)據(jù)庫(kù)字符集和校對(duì)規(guī)則:
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這樣選擇數(shù)據(jù)庫(kù)字符集和數(shù)據(jù)庫(kù)校對(duì)規(guī)則:

·???????? 如果指定了CHARACTER SET XCOLLATE Y,那么采用字符集X和校對(duì)規(guī)則Y。

·???????? 如果指定了CHARACTER SET X而沒(méi)有指定COLLATE Y,那么采用CHARACTER SET XCHARACTER SET X的默認(rèn)校對(duì)規(guī)則。

·???????? 否則,采用服務(wù)器字符集和服務(wù)器校對(duì)規(guī)則。

MySQLCREATE DATABASE ... DEFAULT CHARACTER SET ...語(yǔ)法與標(biāo)準(zhǔn)SQLCREATE SCHEMA ... CHARACTER SET ...語(yǔ)法類(lèi)似。因此,可以在同一個(gè)MySQL服務(wù)器上創(chuàng)建使用不同字符集和 校對(duì)規(guī)則的數(shù)據(jù)庫(kù)。

如果在CREATE TABLE語(yǔ)句中沒(méi)有指定表字符集和校對(duì)規(guī)則,則使用數(shù)據(jù)庫(kù)字符集和校對(duì)規(guī)則作為默認(rèn)值。它們沒(méi)有其它目的。

默認(rèn)數(shù)據(jù)庫(kù)的字符集和校對(duì)規(guī)則可以用作character_set_databasecollation_database系統(tǒng)變量。無(wú)論何時(shí)默認(rèn)數(shù)據(jù)庫(kù)更改了,服務(wù)器都設(shè)置這兩個(gè)變量的值。如果沒(méi)有 默認(rèn)數(shù)據(jù)庫(kù),這兩個(gè)變量與相應(yīng)的服務(wù)器級(jí)別的變量(character_set_servercollation_server)具有相同的值。

10.3.3.?表字符集和校對(duì)

每一個(gè)表有一個(gè)表字符集和一個(gè)校對(duì)規(guī)則,它不能為空。為指定表字符集和校對(duì)規(guī)則,CREATE TABLE ALTER TABLE語(yǔ)句有一個(gè)可選的子句:
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按照下面的方式選擇表字符集和 校對(duì)規(guī)則:

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

·???????? 如果指定了CHARACTER SET X而沒(méi)有指定COLLATE Y,那么采用CHARACTER SET XCHARACTER SET X的默認(rèn)校對(duì)規(guī)則。

·???????? 否則,采用服務(wù)器字符集和服務(wù)器校對(duì)規(guī)則。

如果在列定義中沒(méi)有指定列字符集和校對(duì)規(guī)則,則默認(rèn)使用表字符集和校對(duì)規(guī)則。表字符集和校對(duì)規(guī)則是MySQL的擴(kuò)展;在標(biāo)準(zhǔn)SQL中沒(méi)有。

10.3.4.?列字符集和校對(duì)

每一個(gè)“字符”列(即,CHARVARCHARTEXT類(lèi)型的列)有一個(gè)列字符集和一個(gè)列 校對(duì)規(guī)則,它不能為空。列定義語(yǔ)法有一個(gè)可選子句來(lái)指定列字符集和校對(duì)規(guī)則:
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按照下面的方式選擇列字符集和校對(duì)規(guī)則:

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

·???????? 如果指定了CHARACTER SET X而沒(méi)有指定COLLATE Y,那么采用CHARACTER SET XCHARACTER SET X的默認(rèn)校對(duì)規(guī)則。

·???????? 否則,采用表字符集和服務(wù)器校對(duì)規(guī)則。

CHARACTER SETCOLLATE子句是標(biāo)準(zhǔn)的SQL。

10.3.5.?字符集和校對(duì)分配示例

以下例子顯示了MySQL怎樣確定默認(rèn)字符集和校對(duì)規(guī)則。

示例1:表和列定義

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

在這里我們有一個(gè)列使用latin1字符集和latin1_german1_ci校對(duì)規(guī)則。是顯式的定義,因此簡(jiǎn)單明了。需要注意的是,在一個(gè)latin2表中存儲(chǔ)一個(gè)latin1列不會(huì)存在問(wèn)題。

示例2:表和列定義

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

這次我們有一個(gè)列使用latin1字符集和一個(gè)默認(rèn)校對(duì)規(guī)則。盡管它顯得自然,默認(rèn)校對(duì)規(guī)則卻不是表級(jí)。相反,因?yàn)?span>latin1的默認(rèn)校對(duì)規(guī)則總是latin1_swedish_ci,列c1有一個(gè)校對(duì)規(guī)則latin1_swedish_ci(而不是latin1_danish_ci)。

示例3:表和列定義

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

我們有一個(gè)列使用一個(gè)默認(rèn)字符集和一個(gè)默認(rèn)校對(duì)規(guī)則。在這種情況下,MySQL查找表級(jí)別來(lái)確定列字符集和 校對(duì)規(guī)則。因此,列c1的字符集是latin1,它的 校對(duì)規(guī)則是latin1_danish_ci

示例4:數(shù)據(jù)庫(kù)、表和列定義

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

我們創(chuàng)建了一個(gè)沒(méi)有指定字符集和校對(duì)規(guī)則的列。我們也沒(méi)有指定表級(jí)字符集和校對(duì)規(guī)則。在這種情況下,MySQL查找數(shù)據(jù)庫(kù)級(jí)的相關(guān)設(shè)置。(數(shù)據(jù)庫(kù)的設(shè)置變?yōu)楸淼脑O(shè)置,其后變?yōu)榱械脑O(shè)置。)因此,列c1的字符集為是latin2它的 校對(duì)規(guī)則是latin2_czech_ci。

10.3.6.?連接字符集和校對(duì)

一些字符集和校對(duì)規(guī)則系統(tǒng)變量與客戶端和服務(wù)器的交互有關(guān)。在前面的章節(jié)中已經(jīng)提到過(guò)部分內(nèi)容:

·???????? 服務(wù)器字符集和校對(duì)規(guī)則可以用作character_set_servercollation_server變量的值。

·???????? 默認(rèn)數(shù)據(jù)庫(kù)的字符集和校對(duì)規(guī)則可以用作character_set_databasecollation_database變量的值。

在客戶端和服務(wù)器的連接處理中也涉及了字符集和校對(duì)規(guī)則變量。每一個(gè)客戶端有一個(gè)連接相關(guān)的字符集和校對(duì)規(guī)則變量。

考慮什么是一個(gè)“連接”:它是連接服務(wù)器時(shí)所作的事情。客戶端發(fā)送SQL語(yǔ)句,例如查詢,通過(guò)連接發(fā)送到服務(wù)器。服務(wù)器通過(guò)連接發(fā)送響應(yīng)給客戶端,例如結(jié)果集。對(duì)于客戶端連接,這樣會(huì)導(dǎo)致一些關(guān)于連接的字符集和 校對(duì)規(guī)則的問(wèn)題,這些問(wèn)題均能夠通過(guò)系統(tǒng)變量來(lái)解決:

·???????? 當(dāng)查詢離開(kāi)客戶端后,在查詢中使用哪種字符集?

服務(wù)器使用character_set_client變量作為客戶端發(fā)送的查詢中使用的字符集。

·???????? 服務(wù)器接收到查詢后應(yīng)該轉(zhuǎn)換為哪種字符集?

轉(zhuǎn)換時(shí),服務(wù)器使用character_set_connectioncollation_connection系統(tǒng)變量。它將客戶端發(fā)送的查詢從character_set_client系統(tǒng)變量轉(zhuǎn)換到character_set_connection(除非字符串文字具有象_latin1_utf8的引介詞)。collation_connection對(duì)比較文字字符串是重要的。對(duì)于列值的字符串比較,它不重要,因?yàn)榱芯哂懈叩? 校對(duì)規(guī)則優(yōu)先級(jí)。

·???????? 服務(wù)器發(fā)送結(jié)果集或返回錯(cuò)誤信息到客戶端之前應(yīng)該轉(zhuǎn)換為哪種字符集?

character_set_results變量指示服務(wù)器返回查詢結(jié)果到客戶端使用的字符集。包括結(jié)果數(shù)據(jù),例如列值和結(jié)果元數(shù)據(jù)(如列名)。

你能夠調(diào)整這些變量的設(shè)置,或可以依賴默認(rèn)值(這樣,你可以跳過(guò)本章)。

有兩個(gè)語(yǔ)句影響連接字符集:

SET NAMES 'charset_name'
SET CHARACTER SET charset_name

SET NAMES顯示客戶端發(fā)送的SQL語(yǔ)句中使用什么字符集。因此,SET NAMES 'cp1251'語(yǔ)句告訴服務(wù)器“將來(lái)從這個(gè)客戶端傳來(lái)的信息采用字符集cp1251。它還為服務(wù)器發(fā)送回客戶端的結(jié)果指定了字符集。(例如,如果你使用一個(gè)SELECT語(yǔ)句它表示列值使用了什么字符集。)

SET NAMES 'x'語(yǔ)句與這三個(gè)語(yǔ)句等價(jià):

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

x設(shè)置為character_set_connection也就設(shè)置了collation_connectionx的默認(rèn)校對(duì)規(guī)則。

SET CHARACTER SET語(yǔ)句是類(lèi)似的,但是為 默認(rèn)數(shù)據(jù)庫(kù)設(shè)置連接字符集和校對(duì)規(guī)則。SET CHARACTER SET x語(yǔ)句與這三個(gè)語(yǔ)句等價(jià):

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

當(dāng)一個(gè)客戶端連接時(shí),它向服務(wù)器發(fā)送希望使用的字符集名稱。服務(wù)器為那個(gè)字符集設(shè)置character_set_client、character_set_resultscharacter_set_connection變量。(實(shí)際上,服務(wù)器為使用該字符集執(zhí)行一個(gè)SET NAMES操作。)

對(duì)于mysql客戶端,如果你希望使用與默認(rèn)字符集不同的字符集,不需要每次啟動(dòng)時(shí)執(zhí)行SET NAMES語(yǔ)句。可以在mysql語(yǔ)句行中或者選項(xiàng)文件中添加一個(gè)--default-character-set選項(xiàng)設(shè)置。例如,你每次運(yùn)行mysql時(shí),以下的選項(xiàng)文件設(shè)置把三個(gè)字符集變量修改為koi8r

[mysql]

default-character-set=koi8r

例如:假設(shè)column1定義為CHAR(5) CHARACTER SET latin2。如果沒(méi)有設(shè)定SET NAMESSET CHARACTER SET,那么對(duì)于SELECT column1 FROM t,當(dāng)連接后,服務(wù)器使用客戶端指定的字符集返回列column1的所有值。另一方面,如果你設(shè)定SET NAMES 'latin1'SET CHARACTER SET latin1,那么發(fā)送結(jié)果之前,服務(wù)器轉(zhuǎn)換latin2值到latin1。轉(zhuǎn)換可能會(huì)丟失那些不屬于兩種字符集的字符。

如果不希望服務(wù)器執(zhí)行任何轉(zhuǎn)換,設(shè)置character_set_resultsNULL

mysql> SET character_set_results = NULL;

10.3.7.?字符串文字字符集和校對(duì)

每一字符串字符文字有一個(gè)字符集和一個(gè)校對(duì)規(guī)則,它不能為空。

一個(gè)字符串文字可能有一個(gè)可選的字符集引介詞和COLLATE子句:

[_charset_name]'string' [COLLATE collation_name]

例如:

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

對(duì)于簡(jiǎn)單的語(yǔ)句SELECT 'string',字符串使用由character_set_connectioncollation_connection系統(tǒng)變量定義的字符集和 校對(duì)規(guī)則。

_charset_name表達(dá)式正式稱做一個(gè)引介詞。它告訴解析程序,“后面將要出現(xiàn)的字符串使用字符集X。”因?yàn)橐郧叭藗儗?duì)此感到困惑,我們強(qiáng)調(diào)引介詞不導(dǎo)致任何轉(zhuǎn)換; 它僅是一個(gè)符號(hào),不改變字符串的值。引介詞在標(biāo)準(zhǔn)十六進(jìn)制字母和數(shù)字十六進(jìn)制符號(hào)(x'literal'0xnnnn)中是合法的,以及?(當(dāng)在一個(gè)編程語(yǔ)言接口中使用預(yù)處理的語(yǔ)句時(shí)進(jìn)行參數(shù)替換)。

例如:

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

MySQL這樣確定一個(gè)文字字符集和校對(duì)規(guī)則:

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

·???????? 如果指定了CHARACTER SET X而沒(méi)有指定COLLATE Y,那么使用CHARACTER SET XCHARACTER SET X的默認(rèn)校對(duì)規(guī)則。

·???????? 否則,使用通過(guò)character_set_connection collation_connection系統(tǒng)變量給出的字符集和 校對(duì)規(guī)則。

例如:

·???????? 使用latin1字符集和latin1_german1_ci校對(duì)規(guī)則的字符串:

·??????????????? SELECT _latin1'Müller' COLLATE latin1_german1_ci;

·???????? 使用latin1字符集和其默認(rèn)校對(duì)規(guī)則的字符串(即,latin1_swedish_ci):

·??????????????? SELECT _latin1'Müller';

·???????? 使用連接默認(rèn)字符集和校對(duì)規(guī)則的字符串:

·??????????????? SELECT 'Müller';

字符集引介詞和COLLATE子句是根據(jù)標(biāo)準(zhǔn)SQL規(guī)范實(shí)現(xiàn)的。

10.3.8.?在SQL語(yǔ)句中使用COLLATE

  • 使用COLLATE子句,能夠?yàn)橐粋€(gè)比較覆蓋任何默認(rèn)校對(duì)規(guī)則。COLLATE可以用于多種SQL語(yǔ)句中。下面是一些例子:

    ·???????? 使用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;

    ·???????? 使用聚合函數(shù):

    ·??????????????? 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子句優(yōu)先

COLLATE子句有較高的優(yōu)先級(jí)(高于||),因此下面兩個(gè)表達(dá)式是等價(jià)的:

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

10.3.10.?BINARY操作符

BINARY操作符是COLLATE子句的一個(gè)速記符。BINARY 'x'等價(jià)與'x' COLLATE y,這里y是字符集'x'二元 校對(duì)規(guī)則的名字。每一個(gè)字符集有一個(gè)二元校對(duì)規(guī)則。例如,latin1字符集的二元 校對(duì)規(guī)則是latin1_bin,因此,如果列a是字符集latin1,以下兩個(gè)語(yǔ)句有相同效果:
SELECT * FROM t1 ORDER BY BINARY a;
SELECT * FROM t1 ORDER BY a COLLATE latin1_bin;

10.3.11.?校對(duì)確定較為復(fù)雜的一些特殊情況

在絕大多數(shù)查詢中,MySQL使用哪種校對(duì)規(guī)則進(jìn)行比較是很顯然的。例如,在下列情況中,校對(duì)規(guī)則明顯的是“x的列校對(duì)規(guī)則”:

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

但是,當(dāng)涉及多個(gè)操作數(shù)時(shí),可能不明確。例如:

SELECT x FROM T WHERE x = 'Y';

這個(gè)查詢應(yīng)該使用列x的 校對(duì)規(guī)則,還是字符串文字'Y'的 校對(duì)規(guī)則?

標(biāo)準(zhǔn)化SQL使用“可壓縮性”規(guī)則解決這種問(wèn)題。基本上,這個(gè)意思是:既然x'Y'都有 校對(duì)規(guī)則,哪個(gè)校對(duì)規(guī)則優(yōu)先?這可能比較難解決,但是以下規(guī)則適合大多數(shù)情況:

·???????? 一個(gè)外在的COLLATE子句可壓縮性是0(根本不能壓縮。)

·???????? 使用不同校對(duì)規(guī)則的兩個(gè)字符串連接的可壓縮性是1

·???????? 列校對(duì)規(guī)則的可壓縮性是2。

·???????? 系統(tǒng)常數(shù)”(如USER()VERSION()函數(shù)返回的字符串)可壓縮性是3

·???????? 文字規(guī)則的可壓縮性是4。

·???????? NULL或從NULL派生的表達(dá)式的可壓縮性是 5

上述可壓縮性值是MySQL5.1當(dāng)前所用的。

這樣上述規(guī)則可以模糊解決:

·???????? 使用最低的可壓縮性值的校對(duì)規(guī)則。

·???????? 如果兩側(cè)有相同的可壓縮性,那么如果校對(duì)規(guī)則不同則發(fā)生錯(cuò)誤。

例如:

column1 = 'A'

使用column1的校對(duì)規(guī)則

column1 = 'A' COLLATE x

使用'A'的校對(duì)規(guī)則

column1 COLLATE x = 'A' COLLATE y

錯(cuò)誤

使用COERCIBILITY()函數(shù)確定一個(gè)字符串表達(dá)式的可壓縮性:

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

見(jiàn)12.9.3節(jié),“信息函數(shù)”。

沒(méi)有系統(tǒng)常數(shù)或可忽略的壓縮性。函數(shù)如USER()的可壓縮性是2而不是3,文字的可壓縮性是3而不是4

10.3.12.?校對(duì)必須適合字符集

請(qǐng)注意每個(gè)字符集有一個(gè)或多個(gè)校對(duì)規(guī)則,并且每個(gè)校對(duì)規(guī)則只能屬于一個(gè)字符集。因此,以下語(yǔ)句會(huì)產(chǎn)生一個(gè)錯(cuò)誤信息,因?yàn)樾?duì)規(guī)則latin2_bin對(duì)于字符集latin1非法:

mysql> SELECT _latin1 'x' COLLATE latin2_bin;

ERROR 1251: COLLATION 'latin2_bin' is not valid

for CHARACTER SET 'latin1'

10.3.13.?校對(duì)效果的示例

假設(shè)表T中的列X有這些latin1列值:

Muffler

Müller

MX Systems

MySQL

假設(shè)使用下面的語(yǔ)句獲取列值:

SELECT X FROM T ORDER BY X COLLATE collation_name;

使用不同校對(duì)規(guī)則的列值結(jié)果排序見(jiàn)下表:

latin1_swedish_ci

latin1_german1_ci

latin1_german2_ci

Muffler

Muffler

Müller

MX系統(tǒng)

Müller

Muffler

Müller

MX系統(tǒng)

MX系統(tǒng)

MySQL

MySQL

MySQL

本表顯示了我們?cè)?span>ORDER BY字句中使用不同所校對(duì)規(guī)則的效果的示例。在本例中導(dǎo)致不同排序的字符是上面帶有兩個(gè)圓點(diǎn)的Uü),它在德語(yǔ)中發(fā)音為"U-umlaut"

·???????? 第一列顯示的是使用瑞典/芬蘭校對(duì)規(guī)則的SELECT語(yǔ)句的結(jié)果,它被稱作U-umlaut使用Y排序。

·???????? 第二列顯示的是使用德語(yǔ)DIN-1校對(duì)規(guī)則的SELECT語(yǔ)句的結(jié)果,它被稱作U-umlaut使用U排序。

·???????? 第三列顯示的是使用德語(yǔ)DIN-2校對(duì)規(guī)則的SELECT語(yǔ)句的結(jié)果,它被稱作U-umlaut使用UE排序。

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

10.4.1. 結(jié)果字符串
10.4.2. CONVERT()
10.4.3. CAST()
10.4.4. SHOW語(yǔ)句
本節(jié)討論在MySQL5.1中考慮到字符集信息的操作。

10.4.1.?結(jié)果字符串

MySQL中有許多操作符和函數(shù)可以返回字符串。本節(jié)回答這個(gè)問(wèn)題:返回的字符串使用什么字符集和 校對(duì)規(guī)則?

對(duì)于簡(jiǎn)單的函數(shù),即接收字符串輸入然后返回一個(gè)字符串結(jié)果作為輸出的函數(shù),輸出的字符集和校對(duì)規(guī)則與原始輸入的相同。例如,UPPERX返回一個(gè)字符串,其字符和 校對(duì)規(guī)則與X相同。類(lèi)似的函數(shù)還有INSTR()、LCASE()、LOWER()、LTRIM()、MID()REPEAT()、REPLACE()REVERSE()、RIGHT()、RPAD()、RTRIM()、SOUNDEX()、SUBSTRING()、TRIM()、UCASE()UPPER()。(還需要注意:REPLACE()函數(shù)不同于其它函數(shù),它總是忽略輸入字符串的 校對(duì)規(guī)則,并且進(jìn)行大小寫(xiě)不敏感的比較。)

對(duì)于合并多個(gè)字符串輸入并且返回單個(gè)字符串輸出的運(yùn)算,應(yīng)用標(biāo)準(zhǔn)SQL“聚合規(guī)則”:

·???????? 如果存在顯式的校對(duì)規(guī)則X,那么使用X

·???????? 如果存在顯式的校對(duì)規(guī)則XY,那么產(chǎn)生一個(gè)錯(cuò)誤。

·???????? 否則,如果全部校對(duì)規(guī)則是X,那么使用X。

·???????? 其它情況,結(jié)果沒(méi)有校對(duì)規(guī)則。

例如,使用CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END。結(jié)果校對(duì)規(guī)則是X。對(duì)于CASE、UNION、||、CONCAT()、ELT()、GREATEST()IF()LEAST()情況相同。

對(duì)于轉(zhuǎn)換為字符數(shù)據(jù)的運(yùn)算,從運(yùn)算得到的結(jié)果字符串的字符集和校對(duì)規(guī)則由character_set_connectioncollation_connection系統(tǒng)變量定義。這適用于CAST()、CHAR()、CONV()、FORMAT()HEX()SPACE()函數(shù)。

10.4.2.?CONVERT()

CONVERT()提供一個(gè)在不同字符集之間轉(zhuǎn)換數(shù)據(jù)的方法。語(yǔ)法是:
CONVERT(expr USING transcoding_name)

MySQL中,轉(zhuǎn)換代碼名與相應(yīng)的字符集名相同。

例子:

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

CONVERT(... USING ...)根據(jù)標(biāo)準(zhǔn)SQL規(guī)范實(shí)施。

在傳統(tǒng)SQL模式中,如果你轉(zhuǎn)換一個(gè)“0”日期字符串到日期類(lèi)型,CONVERT()函數(shù)返回NULL。在MySQL5.1中還產(chǎn)生一條警告。

10.4.3.?CAST()

你也可以使用CAST()函數(shù)將一個(gè)字符串轉(zhuǎn)換到一個(gè)不同的字符集。語(yǔ)法是:

CAST(character_string AS character_data_type CHARACTER SET charset_name)

例如:

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

如果使用CAST()時(shí)沒(méi)有指定CHARACTER SET,結(jié)果字符集和校對(duì)規(guī)則通過(guò)character_set_connection collation_connection系統(tǒng)變量定義。如果用CAST()并帶有CHARACTER SET X選項(xiàng),那么結(jié)果字符集和校對(duì)規(guī)則是X和其 默認(rèn)的校對(duì)規(guī)則。

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

例如:

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

在傳統(tǒng)SQL模式中,如果你轉(zhuǎn)換一個(gè)“0”日期字符串到日期類(lèi)型,CAST()函數(shù)返回NULL。在MySQL5.1中還產(chǎn)生一條警告。

10.4.4.?SHOW語(yǔ)句

一些SHOW語(yǔ)句提供額外的字符集信息。這些語(yǔ)句包括SHOW CHARACTER SETSHOW COLLATION、SHOW CREATE DATABASESHOW CREATE TABLESHOW COLUMNS。

SHOW CHARACTER SET命令顯示全部可用的字符集。它帶有一個(gè)可選的LIKE子句來(lái)指示匹配哪些字符集名。例如:

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 |

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

見(jiàn)13.5.4.1節(jié),“SHOW CHARACTER SET語(yǔ)法”。

SHOW COLLATION語(yǔ)句的輸出包括全部可用的字符集。它帶有一個(gè)可選的LIKE子句來(lái)指示匹配哪些 校對(duì)規(guī)則名。例如:

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 |
+-------------------+---------+----+---------+----------+---------+

見(jiàn)13.5.4.2節(jié),“SHOW COLLATION語(yǔ)法”。

SHOW CREATE DATABASE語(yǔ)句顯示創(chuàng)建給定數(shù)據(jù)庫(kù)的CREATE DATABASE語(yǔ)句。結(jié)果包括全部數(shù)據(jù)庫(kù)選項(xiàng)。支持DEFAULT CHARACTER SETCOLLATE。全部數(shù)據(jù)庫(kù)選項(xiàng)存儲(chǔ)在命名為db.Opt的文本文件中,該文件能夠在數(shù)據(jù)庫(kù)目錄中找到。

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

見(jiàn)13.5.4.4節(jié),“SHOW CREATE DATABASE語(yǔ)法”

SHOW CREATE TABLESHOW CREATE DATABASE相似,但是顯示創(chuàng)建給定數(shù)據(jù)庫(kù)的CREATE TABLE語(yǔ)句。列定義顯示任何字符集規(guī)格,并且表選項(xiàng)包括字符集信息。

見(jiàn)13.5.4.5節(jié),“SHOW CREATE TABLE語(yǔ)法”

當(dāng)以SHOW FULL COLUMNS調(diào)用時(shí),SHOW COLUMNS語(yǔ)句顯示表中列的校對(duì)規(guī)則。具有CHAR、VARCHARTEXT數(shù)據(jù)類(lèi)型的列有非NULL的 校對(duì)規(guī)則。數(shù)值列和其它非字符類(lèi)型的列有NULL校對(duì)規(guī)則。例如:

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:

字符集不是顯示的部分。(字符集名隱含在校對(duì)規(guī)則名中。)

見(jiàn)13.5.4.3節(jié),“SHOW COLUMNS語(yǔ)法”。

10.5.?Unicode支持

MySQL 5.1支持兩種字符集以保存Unicode數(shù)據(jù):

·???????? ucs2,UCS-2 Unicode字符集。

·???????? utf8,Unicode字符集的UTF8編碼。

UCS-2(二進(jìn)制Unicode表示法)中,每一個(gè)字符用一個(gè)雙字節(jié)的Unicode編碼來(lái)表示的,第一個(gè)字節(jié)表示重要的意義。例如:"LATIN CAPITAL LETTER A"Unicode編碼是0x0041,它按順序存儲(chǔ)為兩個(gè)字節(jié):0x00 0x41。"CYRILLIC SMALL LETTER YERU"Unicode 0x044B)順序存儲(chǔ)為兩個(gè)字節(jié):0x04 0x4B。對(duì)于Unicode字符和它們的編碼,請(qǐng)參見(jiàn)Unicode 主頁(yè)

當(dāng)前,UCS-2還不能夠用作為客戶端字符集,這意味著SET NAMES 'ucs2'不起作用。

UTF8字符集(轉(zhuǎn)換Unicode表示)是存儲(chǔ)Unicode數(shù)據(jù)的一種可選方法。它根據(jù) RFC 3629執(zhí)行。UTF8字符集的思想是不同Unicode字符采用變長(zhǎng)字節(jié)序列編碼:

·???????? 基本拉丁字母、數(shù)字和標(biāo)點(diǎn)符號(hào)使用一個(gè)字節(jié)。

·???????? 大多數(shù)的歐洲和中東手寫(xiě)字母適合兩個(gè)字節(jié)序列:擴(kuò)展的拉丁字母(包括發(fā)音符號(hào)、長(zhǎng)音符號(hào)、重音符號(hào)、低音符號(hào)和其它音符)、西里爾字母、希臘語(yǔ)、亞美尼亞語(yǔ)、希伯來(lái)語(yǔ)、阿拉伯語(yǔ)、敘利亞語(yǔ)和其它語(yǔ)言。

·???????? 韓語(yǔ)、中文和日本象形文字使用三個(gè)字節(jié)序列。

RFC 3629說(shuō)明了采用一到四個(gè)字節(jié)的編碼序列。當(dāng)前,MySQLUTF8不支持四個(gè)字節(jié)。(UTF8編碼的舊標(biāo)準(zhǔn)是由RFC 2279給出,它描述了從一到六個(gè)字節(jié)的UTF8編碼序列。RFC 3629補(bǔ)充了作廢的RFC 2279;因此,不再使用5個(gè)字節(jié)和6個(gè)字節(jié)的編碼序列。)

提示:使用UTF8時(shí)為了節(jié)省空間,使用VARCHAR而不要用CHAR。否則,MySQL必須為一個(gè)CHAR(10) CHARACTER SET utf8列預(yù)備30個(gè)字節(jié),因?yàn)檫@是可能的最大長(zhǎng)度。

10.6.?用于元數(shù)據(jù)的UTF8

元數(shù)據(jù)是“關(guān)于數(shù)據(jù)的數(shù)據(jù)”。描述數(shù)據(jù)庫(kù)的任何數(shù)據(jù)—作為數(shù)據(jù)庫(kù)內(nèi)容的對(duì)立面—是元數(shù)據(jù)。因此,列名、數(shù)據(jù)庫(kù)名、用戶名、版本名以及從SHOW語(yǔ)句得到的結(jié)果中的大部分字符串是元數(shù)據(jù)。還包括INFORMATION_SCHEMA數(shù)據(jù)庫(kù)中的表中的內(nèi)容,因?yàn)槎x的那些表存儲(chǔ)關(guān)于數(shù)據(jù)庫(kù)對(duì)象的信息。

元數(shù)據(jù)表述必須滿足這些需求:

·???????? 全部元數(shù)據(jù)必須在同一字符集內(nèi)。否則,對(duì)INFORM一個(gè)TION_SCHEMA數(shù)據(jù)庫(kù)中的表執(zhí)行的SHOW命令和SELECT查詢不能正常工作,因?yàn)檫@些運(yùn)算結(jié)果中的同一列的不同行將會(huì)使用不同的字符集。

·???????? 元數(shù)據(jù)必須包括所有語(yǔ)言的所有字符。否則,用戶將不能夠使用它們自己的語(yǔ)言來(lái)命名列和表。

為了滿足這兩個(gè)需求,MySQL使用Unicode字符集存儲(chǔ)元數(shù)據(jù),即UTF8。如果你從不使用重音字符,這不會(huì)導(dǎo)致任何破壞。但如果你使用重音字符,應(yīng)該注意的是元數(shù)據(jù)是用UTF8存儲(chǔ)。

這意味著,USER()、CURRENT_USER()DATABASE()VERSION()函數(shù)的返回值被 默認(rèn)設(shè)置為UTF8字符集,這與同義函數(shù)如SESSION_USER() SYSTEM_USER()的結(jié)果相同。

服務(wù)器將character_set_system系統(tǒng)變量設(shè)置為元數(shù)據(jù)字符集的名:

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

存儲(chǔ)元數(shù)據(jù)使用Unicode并不意味著列頭和DESCRIBE函數(shù)的結(jié)果默認(rèn)在character_set_system字符集中。當(dāng)你使用SELECT column1 FROM t語(yǔ)句時(shí),名字為column1的列從服務(wù)器返回客戶端并使用由SET NAMES語(yǔ)句確定的字符集。更明確地說(shuō),使用的字符集是由character_set_results系統(tǒng)變量的值確定的。如果這個(gè)系統(tǒng)變量設(shè)置為NULL,不執(zhí)行字符轉(zhuǎn)換,服務(wù)器使用最初的字符集(字符集由character_set_system系統(tǒng)變量設(shè)置)返回元數(shù)據(jù)。

如果你希望服務(wù)器不使用UTF8字符集返回元數(shù)據(jù)結(jié)果,那么使用SET NAMES語(yǔ)句強(qiáng)制服務(wù)器執(zhí)行字符集轉(zhuǎn)換(見(jiàn)10.3.6節(jié),“連接字符集和校對(duì)”),或者在客戶端執(zhí)行轉(zhuǎn)換。在客戶端執(zhí)行轉(zhuǎn)換效率較高,但這種選項(xiàng)并不能使用于全部客戶端。

如果你正在一個(gè)語(yǔ)句中使用(例如)USER()函數(shù)進(jìn)行比較或賦值,不要擔(dān)心。MySQL為你執(zhí)行一些原子轉(zhuǎn)換。

SELECT * FROM Table1 WHERE USER() = latin1_column;

這是可以的,因?yàn)樵诒容^之前latin1_column列的內(nèi)容會(huì)自動(dòng)轉(zhuǎn)換到UTF8。

INSERT INTO Table1 (latin1_column) SELECT USER();

這是可以的,因?yàn)橘x值之前USER()函數(shù)返回的內(nèi)容自動(dòng)轉(zhuǎn)換為latin1。至今,自動(dòng)轉(zhuǎn)換沒(méi)有全部實(shí)施,但是以后的版本中應(yīng)該工作正常。

盡管自動(dòng)轉(zhuǎn)換不屬于SQL標(biāo)準(zhǔn),SQL標(biāo)準(zhǔn)化文檔中說(shuō)每一個(gè)字符集是(根據(jù)支持的字符)Unicode的“子集”。因此,一個(gè)知名的原則是,“適用超集的字符集能夠應(yīng)用于其子集”,我們相信Unicode的 校對(duì)規(guī)則能夠應(yīng)用于非Unicode字符串的比較。

注釋:在MySQL5.1中,errmsg.txt文件全部使用UTF8??蛻舳俗址霓D(zhuǎn)換是自動(dòng)進(jìn)行的,如同元數(shù)據(jù)。

10.7.?與其它DBMS的兼容性

對(duì)于MaxDB兼容性,下面兩個(gè)語(yǔ)句是相同的:

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

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

字符集配置存儲(chǔ)在XML文件中,一個(gè)字符集對(duì)應(yīng)一個(gè)文件。

10.9.?國(guó)家特有字符集

ANSI SQL定義了NCHAR或者NATIONAL CHAR作為一個(gè)方法來(lái)指示CHAR類(lèi)型的列應(yīng)該使用某些預(yù)定義的字符集。MySQL5.1使用utf8作為預(yù)定義的字符集。例如,這些列類(lèi)型聲明是等價(jià)的:
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'來(lái)創(chuàng)建一個(gè)使用國(guó)家特有字符集的字符串。這兩個(gè)語(yǔ)句是等價(jià)的:

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

關(guān)于MySQL4.1以前的版本到5.1版本字符集升級(jí)的信息,請(qǐng)參見(jiàn)MySQL4.1參考手冊(cè)

10.10.?MySQL支持的字符集和校對(duì)

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多種 校對(duì)規(guī)則。字符集和它們的默認(rèn)校對(duì)規(guī)則可以通過(guò)SHOW CHARACTER SET語(yǔ)句顯示:

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種語(yǔ)言的文本。

·???????? ucs2 (UCS-2 Unicode)校對(duì)規(guī)則:

  • 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)校對(duì)規(guī)則:

    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校對(duì)規(guī)則是根據(jù)Unicode校對(duì)規(guī)則算法(UCA)執(zhí)行的, 校對(duì)規(guī)則描述見(jiàn) http://www.unicode.org/reports/tr10/。此校對(duì)規(guī)則使用UCA 4.0.0版本砝碼鍵:http://www.unicode.org/Public/UC一個(gè)/4.0.0/一個(gè)llkeys-4.0.0.txt。(以下討論使用utf8_unicode_ci,但同樣適合ucs2_unicode_ci。)

當(dāng)前,utf8_unicode_ci校對(duì)規(guī)則僅部分支持Unicode校對(duì)規(guī)則算法。一些字符還是不能支持。并且,不能完全支持組合的記號(hào)。這主要影響越南和俄羅斯的一些少數(shù)民族語(yǔ)言,如:Udmurt 、Tatar、BashkirMari。

utf8_unicode_ci的最主要的特色是支持?jǐn)U展,即當(dāng)把一個(gè)字母看作與其它字母組合相等時(shí)。例如,在德語(yǔ)和一些其它語(yǔ)言中‘?’等于‘ss’。

utf8_general_ci是一個(gè)遺留的 校對(duì)規(guī)則,不支持?jǐn)U展。它僅能夠在字符之間進(jìn)行逐個(gè)比較。這意味著utf8_general_ci校對(duì)規(guī)則進(jìn)行的比較速度很快,但是與使用utf8_unicode_ci的 校對(duì)規(guī)則相比,比較正確性較差)。

例如,使用utf8_general_ciutf8_unicode_ci兩種 校對(duì)規(guī)則下面的比較相等:

? = A
? = O
ü = U

兩種校對(duì)規(guī)則之間的區(qū)別是,對(duì)于utf8_general_ci下面的等式成立:

? = s

但是,對(duì)于utf8_unicode_ci下面等式成立:

? = ss

對(duì)于一種語(yǔ)言僅當(dāng)使用utf8_unicode_ci排序做的不好時(shí),才執(zhí)行與具體語(yǔ)言相關(guān)的utf8字符集 校對(duì)規(guī)則。例如,對(duì)于德語(yǔ)和法語(yǔ),utf8_unicode_ci工作的很好,因此不再需要為這兩種語(yǔ)言創(chuàng)建特殊的utf8校對(duì)規(guī)則。

utf8_general_ci也適用與德語(yǔ)和法語(yǔ),除了‘?’等于‘s’,而不是‘ss’之外。如果你的應(yīng)用能夠接受這些,那么應(yīng)該使用utf8_general_ci因?yàn)樗俣瓤?。否則,使用utf8_unicode_ci,因?yàn)樗容^準(zhǔn)確。

utf8_swedish_ci,與其它語(yǔ)言相關(guān)的utf8的校對(duì)規(guī)則相似,來(lái)源于utf8_unicode_ci,使用額外的語(yǔ)言規(guī)則。例如,在瑞典語(yǔ)中,以下的關(guān)系式成立,它在德語(yǔ)和法語(yǔ)中不成立:

ü = Y < ?

utf8_spanish_ciutf8_spanish2_ci校對(duì)規(guī)則分別適用于現(xiàn)代和古典西班牙語(yǔ)。在兩種 校對(duì)規(guī)則中,?’(n-發(fā)音符)是‘n’和‘o’之間的間隔字母。另外,對(duì)于古典西班牙語(yǔ),‘ch’是‘c’和d之間的間隔字母,并且‘ll’是‘l’和‘m’之間的間隔字母。

10.10.2.?西歐字符集

西歐字符集覆蓋大多數(shù)西歐語(yǔ)言,如法語(yǔ)、西班牙語(yǔ)、加泰羅尼亞語(yǔ)、巴斯克人語(yǔ)、葡萄牙語(yǔ)、意大利語(yǔ)、阿而巴尼亞語(yǔ)、荷蘭語(yǔ)、德語(yǔ)、丹麥語(yǔ)、瑞典語(yǔ)、挪威語(yǔ)、芬蘭語(yǔ)、法羅人語(yǔ)、冰島語(yǔ)、愛(ài)爾蘭語(yǔ)、蘇格蘭語(yǔ)和英語(yǔ)。

·???????? asciiUS ASCII)校對(duì)規(guī)則:

o??????? ascii_bin

o??????? ascii_general_ci( 默認(rèn))

·???????? cp850DOS西歐) 校對(duì)規(guī)則:

o??????? cp850_bin

o??????? cp850_general_ci( 默認(rèn))

·???????? dec8DEC 西歐)校對(duì)規(guī)則:

o??????? dec8_bin

o??????? dec8_swedish_ci( 默認(rèn))

·???????? hp8HP 西歐)校對(duì)規(guī)則:

o??????? hp8_bin

o??????? hp8_english_ci( 默認(rèn))

·???????? latin1cp1252 西歐)校對(duì)規(guī)則:

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( 默認(rèn))

latin1是 默認(rèn)字符集。latin1_swedish_ci是 默認(rèn)的校對(duì)規(guī)則,它用于大多數(shù)MySQL客戶。雖然經(jīng)常說(shuō)它以瑞典/芬蘭 校對(duì)規(guī)則為基礎(chǔ),但瑞典和芬蘭人不同意這種說(shuō)法。

latin1_german1_cilatin1_german2_ci校對(duì)規(guī)則基于DIN-1DIN-2標(biāo)準(zhǔn),這里DIN代表Deutsches Institut für Normung(德語(yǔ)等價(jià)于ANSI)。DIN-1被叫做“字典校對(duì)規(guī)則”,DIN-2被叫做“電話簿校對(duì)規(guī)則”。

o??????? latin1_german1_ci(字典)規(guī)則:

o???????????????????? ? = a
o???????????????????? ? = O
o???????????????????? ü = U
o???????????????????? ? = s

o??????? latin1_german2_ci電話簿)規(guī)則:

o???????????????????? ? = aE
o???????????????????? ? = OE
o???????????????????? ü = UE
o???????????????????? ? = ss

latin1_spanish_ci校對(duì)規(guī)則中,‘?’(n-tilde)是‘n’和‘o’之間的間隔字母。

·???????? macromaMac西歐) 校對(duì)規(guī)則:

o??????? macroman_bin

o??????? macroman_general_ci( 默認(rèn))

·???????? swe77位瑞典語(yǔ)) 校對(duì)規(guī)則:

o??????? swe7_bin

o??????? swe7_swedish_ci( 默認(rèn))

10.10.3.?中歐字符集

我們還提供一些用于捷克共和國(guó)、斯洛伐克、匈牙利、羅馬尼亞、斯羅紋尼亞、克羅地亞和波蘭的字符集支持。

·???????? cp1250Windows中歐) 校對(duì)規(guī)則:

o??????? cp1250_bin

o??????? cp1250_croatian_ci

o??????? cp1250_czech_cs

o??????? cp1250_general_ci( 默認(rèn))

·???????? cp852DOS 中歐)校對(duì)規(guī)則:

o??????? cp852_bin

o??????? cp852_general_ci( 默認(rèn))

·???????? keybcs2DOS Kamenicky Czech-Slovak)校對(duì)規(guī)則:

o??????? keybcs2_bin

o??????? keybcs2_general_ci( 默認(rèn))

·???????? latin2ISO 8859-2 中歐)校對(duì)規(guī)則:

o??????? latin2_bin

o??????? latin2_croatian_ci

o??????? latin2_czech_cs

o??????? latin2_general_ci( 默認(rèn))

o??????? latin2_hungarian_ci

·???????? macceMac 中歐)校對(duì)規(guī)則:

o??????? macce_bin

o??????? macce_general_ci( 默認(rèn))

10.10.4.?南歐與中東字符集

MySQL支持的南歐和中東字符集包括亞美尼亞語(yǔ)、阿拉伯語(yǔ)、喬治亞語(yǔ)、希臘語(yǔ)、希伯萊語(yǔ)和土耳其語(yǔ):

·???????? armscii8ARMSCII-8 亞美尼亞語(yǔ))校對(duì)規(guī)則:

o??????? armscii8_bin

o??????? armscii8_general_ci( 默認(rèn))

·???????? cp1256(阿拉伯語(yǔ)Windows) 校對(duì)規(guī)則:

o??????? cp1256_bin

o??????? cp1256_general_ci( 默認(rèn))

·???????? geostd8GEOSTD8喬治亞語(yǔ)) 校對(duì)規(guī)則:

o??????? geostd8_bin

o??????? geostd8_general_ci( 默認(rèn))

·???????? greekISO 8859-7希臘語(yǔ))校對(duì)規(guī)則:

o??????? greek_bin

o??????? greek_general_ci( 默認(rèn))

·???????? hebrewISO 8859-8希伯萊語(yǔ))校對(duì)規(guī)則:

o??????? hebrew_bin

o??????? hebrew_general_ci( 默認(rèn))

·???????? latin5ISO 8859-9 土耳其語(yǔ))校對(duì)規(guī)則:

o??????? latin5_bin

o??????? latin5_turkish_ci( 默認(rèn))

10.10.5.?波羅的海字符集

波羅的海字符集覆蓋愛(ài)沙尼亞語(yǔ)、拉脫維亞語(yǔ)和立陶宛語(yǔ)言。當(dāng)前支持的兩種波羅的海字符集:

·???????? cp1257Windows波羅的海) 校對(duì)規(guī)則:

o??????? cp1257_bin

o??????? cp1257_general_ci( 默認(rèn))

o??????? cp1257_lithuanian_ci

·???????? latin7ISO 8859-13波羅的海)校對(duì)規(guī)則:

o??????? latin7_bin

o??????? latin7_estonian_cs

o??????? latin7_general_ci( 默認(rèn))

o??????? latin7_general_cs

10.10.6.?西里爾字符集

使用西里爾字符集和校對(duì)規(guī)則的有Belarusian、保加利亞、俄語(yǔ)和烏克蘭語(yǔ)言。

·???????? cp1251Windows 西里爾)校對(duì)規(guī)則:

o??????? cp1251_bin

o??????? cp1251_bulgarian_ci

o??????? cp1251_general_ci( 默認(rèn))

o??????? cp1251_general_cs

o??????? cp1251_ukrainian_ci

·???????? cp866DOS 俄語(yǔ))校對(duì)規(guī)則:

o??????? cp866_bin

o??????? cp866_general_ci( 默認(rèn))

·???????? koi8rKOI8-R Relcom 俄語(yǔ))校對(duì)規(guī)則:

o??????? koi8r_bin

o??????? koi8r_general_ci( 默認(rèn))

·???????? koi8uKOI8-U 烏克蘭語(yǔ))校對(duì)規(guī)則:

o??????? koi8u_bin

o??????? koi8u_general_ci( 默認(rèn))

10.10.7.?亞洲字符集

10.10.7.1. cp932字符集

我們支持的亞洲字符集包括中文、日語(yǔ)、韓語(yǔ)和泰國(guó)語(yǔ)。這些可能比較復(fù)雜。例如,中文字符集必須考慮到上千種不同的字符。

·???????? big5Big5傳統(tǒng)中文) 校對(duì)規(guī)則:

o??????? big5_bin

o??????? big5_chinese_ci( 默認(rèn))

·???????? cp932SJIS Windows日語(yǔ))校對(duì)規(guī)則:

o??????? cp932_bin

o??????? cp932_japanese_ci( 默認(rèn))

·???????? eucjpmsUJIS Windows日語(yǔ))校對(duì)規(guī)則:

o??????? eucjpms_bin

o??????? eucjpms_japanese_ci( 默認(rèn))

·???????? euckrEUC-KR 韓語(yǔ))校對(duì)規(guī)則:

o??????? euckr_bin

o??????? euckr_korean_ci( 默認(rèn))

·???????? gb2312GB2312 簡(jiǎn)體中文)校對(duì)規(guī)則:

o??????? gb2312_bin

o??????? gb2312_chinese_ci( 默認(rèn))

·???????? gbkGBK簡(jiǎn)體中文) 校對(duì)規(guī)則:

o??????? gbk_bin

o??????? gbk_chinese_ci( 默認(rèn))

·???????? sjisShift-JIS 日語(yǔ))校對(duì)規(guī)則:

o??????? sjis_bin

o??????? sjis_japanese_ci( 默認(rèn))

·???????? tis620TIS620 泰國(guó)語(yǔ))校對(duì)規(guī)則:

o??????? tis620_bin

o??????? tis620_thai_ci( 默認(rèn))

·???????? ujisEUC-JP 日語(yǔ))校對(duì)規(guī)則:

o??????? ujis_bin

o??????? ujis_japanese_ci( 默認(rèn))

10.10.7.1.?cp932字符集

為什么需要cp932

MySQL中,sjis字符集對(duì)應(yīng)于由IANA定義的Shift_JIS字符集,它支持JIS X0201JIS X0208字符。(見(jiàn) http://www.iana.org/assignments/character-sets 。)

但是,“SHIFT JIS”作為描述性術(shù)語(yǔ)的含義變得非常含糊不清,并且它常常包括由不同供應(yīng)商定義的Shift_JIS擴(kuò)展部分。

例如,使用在日本Windows環(huán)境中使用的“SHIFT JIS”是Microsoft對(duì)Shift_JISMicrosoft擴(kuò)展,它的準(zhǔn)確名字是Microsoft Windows Codepage: 932cp932。除由Shift_JIS支持的字符之外,cp932支持?jǐn)U展字符,如NEC選擇的IBM擴(kuò)展字符和IBM擴(kuò)展字符。

許多日本用戶在使用這些擴(kuò)展字符過(guò)程中碰到過(guò)一些問(wèn)題。這些問(wèn)題是由于以下情況引起的:

·???????? MySQL自動(dòng)轉(zhuǎn)換字符集。

·???????? 字符集通過(guò)Unicode轉(zhuǎn)換(ucs2)。

·???????? sjis字符集不支持這些擴(kuò)展字符轉(zhuǎn)換。

·???????? 從號(hào)稱“SHIFT JIS”到Unicode的轉(zhuǎn)換,存在一些轉(zhuǎn)換規(guī)則,并且一些字符轉(zhuǎn)換到Unicode依賴不同的轉(zhuǎn)換規(guī)則。MySQL僅支持這些轉(zhuǎn)換規(guī)則中的一種(在后面描述)。

MySQLcp932字符集可以解決這些轉(zhuǎn)換問(wèn)題。

因?yàn)?span>MySQL支持字符集轉(zhuǎn)換,將IANA Shift_JIS cp932分離為兩種不同字符集是重要的,因?yàn)樗鼈兲峁┎煌霓D(zhuǎn)換規(guī)則。

cp932sjis有什么不同?

cp932字符集與sjis存在以下不同點(diǎn):

·???????? cp932支持NEC特殊字符、NEC選擇的IBM擴(kuò)展字符和IBM選擇的字符。

·???????? 一些cp932字符有兩個(gè)不同的編碼點(diǎn),這兩種編碼點(diǎn)轉(zhuǎn)換為相同Unicode編碼點(diǎn)。因此,當(dāng)從Unicode轉(zhuǎn)換回到cp932時(shí),必須選擇一個(gè)編碼點(diǎn)。對(duì)于這種“相互轉(zhuǎn)換,使用由Microsoft推薦的轉(zhuǎn)換規(guī)則。(見(jiàn) http//support.microsoft.com/kb/170559/EN-US/。)

轉(zhuǎn)換規(guī)則如下:

o??????? 如果字符在JIS X 0208 NEC特殊字符中同時(shí)存在,使用JIS X 0208 的編碼點(diǎn)。

o??????? 如果字符在NEC特殊字符和IBM選擇的字符中同時(shí)存在,使用NEC特殊字符的編碼點(diǎn)。

o??????? 如果字符在IBM選擇的字符和NEC選擇的IBM擴(kuò)展字符中同時(shí)存在,使用IBM擴(kuò)展字符的編碼點(diǎn)。

關(guān)于cp932字符的Unicode 值的列表顯示信息見(jiàn)http://www.microsoft.com/globaldev/reference/dbcs/932.htm。對(duì)于cp932表中的帶有下面有四位數(shù)字出現(xiàn)的字符的實(shí)體,數(shù)字代表相應(yīng)的Unicodeucs2)編碼。對(duì)于表中有兩個(gè)帶下劃線的數(shù)字出現(xiàn)的實(shí)體,擇有一個(gè)以那兩個(gè)數(shù)字開(kāi)頭的cp932字符值的范圍。點(diǎn)擊一個(gè)這種表的實(shí)體,將帶你到一個(gè)頁(yè),該頁(yè)顯示每個(gè)以那些數(shù)字開(kāi)頭的cp932字符的Unicode值。

以下連接很重要。它們與下列字符集的編碼相對(duì)應(yīng):

o??????? NEC特殊字符:

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

o??????? NEC選擇的IBM擴(kuò)展字符:

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結(jié)合支持用戶自定義字符的轉(zhuǎn)換,并且解決sjis/ujis轉(zhuǎn)換問(wèn)題。詳細(xì)信息,請(qǐng)參見(jiàn)http://www.opengroup.or.jp/jvc/cde/sjis-euc-e.html。

·???????? 對(duì)于一些字符,與ucs2之間的轉(zhuǎn)換與sjiscp932之間的轉(zhuǎn)換是不同的。下表舉例說(shuō)明了這些不同。

轉(zhuǎn)換到ucs2

sjis/cp932

sjis ucs2轉(zhuǎn)換

cp932 ucs2轉(zhuǎn)換

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轉(zhuǎn)換:

ucs2

ucs2 sjis轉(zhuǎn)換

ucs2 cp932轉(zhuǎn)換

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參考手冊(cè)的翻譯版本,關(guān)于MySQL參考手冊(cè),請(qǐng)?jiān)L問(wèn)dev.mysql.com。 原始參考手冊(cè)為英文版,與英文版參考手冊(cè)相比,本翻譯版可能不是最新的。

Previous article: Next article: