亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

ディレクトリ 検索
目錄 前言 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. 一般安裝問題 2.1.1. MySQL支持的操作系統(tǒng) 2.1.2. 選擇要安裝的MySQL分發(fā)版 2.1.3. 怎樣獲得MySQL 2.1.4. 通過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. 通過非安裝Zip文件安裝MySQL 2.3.7. 提取安裝檔案文件 2.3.8. 創(chuàng)建選項(xiàng)文件 2.3.9. 選擇MySQL服務(wù)器類型 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. 在其它類Unix系統(tǒng)中安裝MySQL 2.8. 使用源碼分發(fā)版安裝MySQL 2.8.1. 源碼安裝概述 2.8.2. 典型配置選項(xiàng) 2.8.3. 從開發(fā)源碼樹安裝 2.8.4. 處理MySQL編譯問題 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下安裝后的過程 2.9.2. Unix下安裝后的過程 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接口的問題 3. 教程 3.1. 連接與斷開服務(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ì)算訪問量 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. 一般安全問題 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻擊者面前保持安全 5.6.3. Mysqld安全相關(guān)啟動(dòng)選項(xiàng) 5.6.4. LOAD DATA LOCAL安全問題 5.7. MySQL訪問權(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. 訪問控制 5.7.6. 訪問控制 5.7.7. 權(quán)限更改何時(shí)生效 5.7.8. 拒絕訪問錯(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. 字符集問題 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ù)制特性和已知問題 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ì)算打開的表 7.4.9. MySQL如何打開和關(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. 磁盤事宜 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:用于檢查訪問權(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í)別符大小寫敏感性 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. 列類型 11.1. 列類型概述 11.1.1. 數(shù)值類型概述 11.1.2. 日期和時(shí)間類型概述 11.1.3. 字符串類型概述 11.2. 數(shù)值類型 11.3. 日期和時(shí)間類型 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. 列類型存儲(chǔ)需求 11.6. 選擇正確的列類型 11.7. 使用來(lái)自其他數(shù)據(jù)庫(kù)引擎的列類型 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ǔ)引擎和表類型 15.1. MyISAM存儲(chǔ)引擎 15.1.1. MyISAM啟動(dòng)選項(xiàng) 15.1.2. 鍵所需的空間 15.1.3. MyISAM表的存儲(chǔ)格式 15.1.4. MyISAM表方面的問題 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. 文件空間管理和磁盤I/O 15.2.15. InnoDB錯(cuò)誤處理 15.2.16. 對(duì)InnoDB表的限制 15.2.17. InnoDB故障診斷與排除 15.3. MERGE存儲(chǔ)引擎 15.3.1. MERGE表方面的問題 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. 編寫自定義存儲(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. 打開表 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簇常見問題解答 17.11. MySQL簇術(shù)語(yǔ)表 18. 分區(qū) 18.1. MySQL中的分區(qū)概述 18.2. 分區(qū)類型 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類的層次 19.2.2. 類Geometry 19.2.3. 類Point 19.2.4. 類Curve 19.2.5. 類LineString 19.2.6. 類Surface 19.2.7. 類Polygon 19.2.8. 類GeometryCollection 19.2.9. 類MultiPoint 19.2.10. 類MultiCurve 19.2.11. 類MultiLineString 19.2.12. 類MultiSurface 19.2.13. 類MultiPolygon 19.3. 支持的空間數(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ù)類型 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è)試幾何類之間空間關(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ù)制:常見問題 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ù)值的類型 24.2. DECIMAL數(shù)據(jù)類型更改 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ù)類型 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ù)類型 25.2.6. C API預(yù)處理語(yǔ)句函數(shù)概述 25.2.7. C API預(yù)處理語(yǔ)句函數(shù)描述 25.2.8. C API預(yù)處理語(yǔ)句方面的問題 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í)的常見問題 25.2.14. 創(chuàng)建客戶端程序 25.2.15. 如何生成線程式客戶端 25.3. MySQL PHP API 25.3.1. 使用MySQL和PHP的常見問題 25.4. MySQL Perl API 25.5. MySQL C++ API 25.5.1. Borland C++ 25.6. MySQL Python API 25.7. MySQL Tcl API 25.8. MySQL Eiffel Wrapper 25.9. MySQL程序開發(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開發(fā)源碼樹安裝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ù)類型 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方面的問題 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. 編寫步驟 A. 問題和常見錯(cuò)誤 A.1. 如何確定導(dǎo)致問題的原因 A.2. 使用MySQL程序時(shí)的常見錯(cuò)誤 A.2.1. 拒絕訪問 A.2.2. 無(wú)法連接到[local] MySQL服務(wù)器 A.2.3. 客戶端不支持鑒定協(xié)議 A.2.4. 輸入密碼時(shí)出現(xiàn)密碼錯(cuò)誤 NoName A.2.6. 連接數(shù)過多 A.2.7. 內(nèi)存溢出 A.2.8. MySQL服務(wù)器不可用 A.2.9. 信息包過大 A.2.10. 通信錯(cuò)誤和失效連接 A.2.11. 表已滿 A.2.12. 無(wú)法創(chuàng)建文件/寫入文件 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ù)的鏈接問題 A.3.2. 如何以普通用戶身份運(yùn)行MySQL A.3.3. 與文件許可有關(guān)的問題 A.4. 與管理有關(guān)的事宜 A.4.1. 如何復(fù)位根用戶密碼 A.4.2. 如果MySQL依然崩潰,應(yīng)作些什么 A.4.3. MySQL處理磁盤滿的方式 A.4.4. MySQL將臨時(shí)文件儲(chǔ)存在哪里 A.4.5. 如何保護(hù)或更改MySQL套接字文件/tmp/mysql.sock A.4.6. 時(shí)區(qū)問題 A.5. 與查詢有關(guān)的事宜 A.5.1. 搜索中的大小寫敏感性 A.5.2. 使用DATE列方面的問題 A.5.3. 與NULL值有關(guān)的問題 A.5.4. 與列別名有關(guān)的問題 A.5.5. 非事務(wù)表回滾失敗 A.5.6. 從相關(guān)表刪除行 A.5.7. 解決與不匹配行有關(guān)的問題 A.5.8. 與浮點(diǎn)比較有關(guān)的問題 A.6. 與優(yōu)化器有關(guān)的事宜 A.7. 與表定義有關(guān)的事宜 A.7.1. 與ALTER TABLE有關(guān)的問題 A.7.2. 如何更改表中的列順序 A.7.3. TEMPORARY TABLE問題 A.8. MySQL中的已知事宜 A.8.1. MySQL中的打開事宜 B. 錯(cuò)誤代碼和消息 B.1. 服務(wù)器錯(cuò)誤代碼和消息 B.2. 客戶端錯(cuò)誤代碼和消息 C. 感謝 C.1. MySQL AB處的開發(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版中的變更情況(開發(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許可例外 索引
テキスト

第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. 編寫步驟

27.1.?MySQL內(nèi)部控件

27.1.1. MySQL線程
27.1.2. MySQL測(cè)試套件

??? 本章包含許多在你處理MySQL代碼時(shí)需要了解的你事情。如果你想投入到MySQL的開發(fā)中,或想要接觸到最新的中間版本的代碼,或者就是想了解開發(fā)的進(jìn)度,請(qǐng)參閱2.8.3節(jié),“從開發(fā)源代碼樹安裝”的說(shuō)明。如果你對(duì)MySQL的內(nèi)部插件感興趣,你也可以訂閱我們的內(nèi)部插件郵件列表。這個(gè)列表的流量相對(duì)低一些。欲知如何訂閱的詳情,請(qǐng)參閱1.7.1.1節(jié),“MySQL郵件列表”。在MySQL AB 的所有開發(fā)人員都在內(nèi)部插件列表里, 此外,我們幫助那些正在處理MySQL代碼的人。請(qǐng)隨意使用這個(gè)郵件列表來(lái)問代碼有關(guān)的問題,也可用它來(lái)發(fā)送你想奉獻(xiàn)給MySQL項(xiàng)目的 補(bǔ)丁!

27.1.1.?MySQL線程

??? MySQL服務(wù)器創(chuàng)建如下線程:

  • TCP/IP 連接線程處理所有連接請(qǐng)求,并為每一個(gè)連接創(chuàng)建一個(gè)新的專用線程來(lái)處理認(rèn)證和SQL查詢處理。

  • Windows NT 平臺(tái)上有一個(gè)名為管道處理程序(pipe handler)的線程,它和名為管道連接請(qǐng)求(pipe connect requests)的TCP/IP連接線程做同樣的工作。

  • 信號(hào)線程處理所有的信號(hào),這個(gè)線程通常也處理報(bào)警和調(diào)用process_alarm() 函數(shù)來(lái)強(qiáng)制使得空閑時(shí)間太長(zhǎng)的連接超時(shí)。

  • mysqld是與DUSE_ALARM_THREAD線程一起編譯的,這個(gè)專用線程是處理 創(chuàng)建的警報(bào)的。這個(gè)線程用在一些sigwait()函數(shù)有問題的系統(tǒng)上,或者用在你想在應(yīng)用程序中使用thr_alarm()代碼而不帶專用信號(hào)處理線程之時(shí)。

  • 若想使用flush_time=val選項(xiàng),會(huì)創(chuàng)建一個(gè)專用線程以給定的時(shí)間間隔刷新所有表格。

  • 每個(gè)連接都有它自己的線程。

  • 每個(gè)被使用INSERT DELAYED 的不同表格都會(huì)有自己的線程。

  • 若使用了master-host, 則會(huì)創(chuàng)建一個(gè)從屬的復(fù)制線程從主線程讀取并實(shí)施更新。

mysqladmin processlist 僅顯示連接,INSERT DELAYED, 及復(fù)制線程

27.1.2.?MySQL測(cè)試套件

27.1.2.1. 運(yùn)行MySQL測(cè)試套件
27.1.2.2. 擴(kuò)展MySQL測(cè)試套件
27.1.2.3. MySQL測(cè)試套件報(bào)告缺陷

???? 包含在Unix源碼和二進(jìn)制分發(fā)版中的測(cè)試系統(tǒng)可以讓用戶和開發(fā)人員對(duì)MySQL代碼施行回歸測(cè)試。這些測(cè)試可以在Unix上進(jìn)行,目前它們還不能在原生的Windows環(huán)境下進(jìn)行。

????? 當(dāng)前的測(cè)試案例套件不能在MySQL中測(cè)試所有東西,但是它能發(fā)現(xiàn)SQL處理代碼,OS/library文件中大多數(shù)明顯的缺陷,并且在測(cè)試復(fù)件方面也是非常徹底的。我們的終極目標(biāo)是對(duì)100%的代碼進(jìn)行測(cè)試。我們歡迎大家給我們的測(cè)試套件添加內(nèi)容。你可能會(huì)特別想貢獻(xiàn)出那些檢查你系統(tǒng)里功能性危機(jī)的測(cè)試,因?yàn)檫@將確保未來(lái)所有發(fā)行版的MySQL會(huì)與你的應(yīng)用程序一起更好地運(yùn)行。

27.1.2.1.?運(yùn)行MySQL測(cè)試套件

??? 測(cè)試系統(tǒng)包括一個(gè)測(cè)試語(yǔ)言解釋器(mysqltest),一個(gè)運(yùn)行所有測(cè)試的外殼腳本(mysql-test-run),用專用語(yǔ)言編寫的測(cè)試案例,以及它們的預(yù)期結(jié)果。在系統(tǒng)上編譯好之后,在源代碼的root下鍵入make test 或mysql-test/mysql-test-run。如果安裝了一個(gè)二進(jìn)制分發(fā)版, cd 到安裝root (如 /usr/local/mysql), 然后鍵入 scripts/mysql-test-run。所有測(cè)試應(yīng)該都通過,假使有沒通過的,若是一個(gè)MySQL里的缺陷,你可以試著找找是因?yàn)槭裁矗⑶覉?bào)告這個(gè)問題。請(qǐng)參閱27.1.2.3節(jié),“在MySQL測(cè)試套件里報(bào)告缺陷”。

如果你想要運(yùn)行測(cè)試套件的機(jī)器上已經(jīng)運(yùn)行了一個(gè) mysqld ,只要它不占用9306 和 9307端口,就不用停掉它。如果占用了其中的一個(gè),以可以編輯mysql-test-run把主端口和(或)從端口號(hào)改為其它可用的。.

可使用下面指令運(yùn)行單個(gè)測(cè)試案例 mysql-test/mysql-test-run test_name.

若一個(gè)測(cè)試未通過,你可以用--force選項(xiàng)來(lái)檢查運(yùn)行著的mysql-test-run看是否是別的測(cè)試未通過。

27.1.2.2.?擴(kuò)展MySQL測(cè)試套件

你可以用mysqltest 語(yǔ)言編寫你自己的測(cè)試案例。不幸地是,我們還沒有寫完相關(guān)方面完整地文檔。但是,你可以查看我們現(xiàn)有的測(cè)試案例,并將它們作為范例。下面幾點(diǎn)將有助于你入手:

  • 測(cè)試位于 mysql-test/t*.MYI,檢查所有的MyISAM表,并重啟mysqld。這樣,就能確保從干凈的狀態(tài)運(yùn)行服務(wù)器。請(qǐng)參見第5章:數(shù)據(jù)庫(kù)管理。

    使用“--log”選項(xiàng)啟動(dòng)mysqld,并根據(jù)寫入日志的信息確定是否某些特殊的查詢殺死了服務(wù)器。約95%的缺陷與特定的查詢有關(guān)。正常情況下,這是服務(wù)器重啟前日志文件中最夠數(shù)個(gè)查詢中的1個(gè)。請(qǐng)參見5.11.2節(jié),“通用查詢?nèi)罩尽薄H绻軌蛴锰厥獠樵冎貜?fù)殺死MySQL,即使在發(fā)出查詢前檢查了所有表的情況下也同樣,那么你就應(yīng)能確定缺陷,并應(yīng)提交關(guān)于該缺陷的缺陷報(bào)告。請(qǐng)參見1.7.1.3節(jié),“如何通報(bào)缺陷和問題”。

    嘗試提供一個(gè)測(cè)試范例,我們應(yīng)能利用該范例重復(fù)問題。請(qǐng)參見E.1.6節(jié),“如果出現(xiàn)表崩潰,請(qǐng)生成測(cè)試案例”。

    請(qǐng)?jiān)?span>mysql-test目錄下并根據(jù)MySQL基準(zhǔn)進(jìn)行測(cè)試。請(qǐng)參見27.1.2節(jié),“MySQL測(cè)試套件”。它們能相當(dāng)良好地測(cè)試MySQL。你也可以為基準(zhǔn)測(cè)試增加代碼,以模擬你的應(yīng)用程序?;鶞?zhǔn)測(cè)試可在源碼分發(fā)版的sql-bench目錄下找到,對(duì)于二進(jìn)制分發(fā)版,可在MySQL安裝目錄下的sql-bench目錄下找到。

    嘗試使用fork_big.pl腳本(它位于源碼分發(fā)版的測(cè)試目錄下)。

    如果你將MySQL配置為調(diào)試模式,如果某事出錯(cuò),可更為容易地搜集關(guān)于可能錯(cuò)誤的信息。如果將MySQL配置為調(diào)試模式,可生成1個(gè)安全的內(nèi)存分配程序,可使用它發(fā)現(xiàn)某些錯(cuò)誤。此外,它還提供了很多輸出,這類輸出與出現(xiàn)的問題相關(guān)。在configure上使用“--with-debug”或“--with-debug=full”選項(xiàng)重新配置MySQL,然后再編譯它。請(qǐng)參見E.1節(jié),“調(diào)試MySQL服務(wù)器”。

    確保為你的操作系統(tǒng)應(yīng)用了最新的補(bǔ)丁。

    對(duì)mysqld使用“--skip-external-locking”選項(xiàng)。在某些系統(tǒng)上,lockd鎖定管理器不能正確工作,--skip-external-locking”選項(xiàng)通知mysqld不使用外部鎖定。(這意味著,你不能在相同的數(shù)據(jù)目錄上運(yùn)行2個(gè)mysqld服務(wù)器,如果使用myisamchk,必須謹(jǐn)慎。然而,嘗試將該選項(xiàng)用作測(cè)試也是有益的)。

    當(dāng)mysqld看上去正在運(yùn)行但并未響應(yīng)時(shí),是否運(yùn)行了mysqladmin -u root processlist?某些時(shí)候,即使你認(rèn)為mysqld處于閑置狀態(tài)時(shí),實(shí)際情況并非如此。問題可能是因?yàn)樗羞B接均已使用,或存在某些內(nèi)部鎖定問題。即使在該情況下,mysqladmin -u root processlist通常能夠進(jìn)行連接,并能提供關(guān)于當(dāng)前連接數(shù)以及其狀態(tài)的有用信息。

    在運(yùn)行其他查詢的同時(shí),在單獨(dú)的窗口中運(yùn)行命令mysqladmin -i 5 statusmysqladmin -i 5 -r status,以生成統(tǒng)計(jì)信息。

    嘗試采用下述方法:

    gdb(或另一個(gè)調(diào)試器)啟動(dòng)mysqld。請(qǐng)參見E.1.3節(jié),“在gdb環(huán)境下調(diào)試mysqld”。

    運(yùn)行測(cè)試腳本。

    3個(gè)較低層面上輸出backtrace(向后跟蹤)和局部變量。在gdb中,當(dāng)mysqldgdb內(nèi)崩潰時(shí),可使用下述命令完成該任務(wù):

    backtrace
    info local
    up
    info local
    up
    info local

    使用gdb,你還能檢查與info線程共存的線程,并切換至特定的線程N,其中,N是線程ID。

    嘗試用Perl腳本模擬你的應(yīng)用程序,強(qiáng)制MySQL崩潰或行為異常。

    發(fā)送正常的缺陷報(bào)告。請(qǐng)參見1.7.1.3節(jié),“如何通報(bào)缺陷和問題”。應(yīng)比通常的報(bào)告更詳細(xì)。由于MySQL是為很多人提供服務(wù)的,它可能因僅存在于你的計(jì)算機(jī)上的某事崩潰(例如,與你的特定系統(tǒng)庫(kù)有關(guān)的錯(cuò)誤)。

    如果你遇到與包含動(dòng)態(tài)長(zhǎng)度行的表有關(guān)的問題,而且你僅使用VARCHAR(而不是BLOBTEXT列),可嘗試用ALTER TABLE將所有VARCHAR列更改為CHAR列。這樣,就會(huì)強(qiáng)制MySQL使用固定大小的行。固定大小的行占用的空間略多,但對(duì)損壞的容忍度更高。

    目前的動(dòng)態(tài)行代碼在MySQL AB已使用多年,很少遇到問題,但從本質(zhì)上看,動(dòng)態(tài)長(zhǎng)度行更傾向于出現(xiàn)錯(cuò)誤,因此,不妨嘗試采用該策略以查看它是否有幫助,這不失為一個(gè)好主意。

    診斷問題時(shí)不要將你的服務(wù)器硬件排除在外。有缺陷的硬件能夠?qū)е聰?shù)據(jù)損壞。對(duì)硬件進(jìn)行故障診斷與排除操作時(shí),尤其應(yīng)注意RAM和硬盤驅(qū)動(dòng)器。

A.4.3.?MySQL處理磁盤滿的方式

在本節(jié)中,介紹了MySQL響應(yīng)磁盤滿錯(cuò)誤的方式(如“設(shè)備上無(wú)剩余空間”),以及響應(yīng)超配額錯(cuò)誤的方式(如“寫入失敗”或“達(dá)到了用戶屏蔽限制”)。

本節(jié)介紹的內(nèi)容與寫入MyISAM表有關(guān)。它也適用于寫入二進(jìn)制日志文件和二進(jìn)制索引文件,但對(duì)row”和“record”的應(yīng)用應(yīng)被視為“event”。

出現(xiàn)磁盤滿狀況時(shí),MySQL將:

每分鐘檢查一次,查看是否有足夠空間寫入當(dāng)前行。如果有足夠空間,將繼續(xù),就像什么也未發(fā)生一樣。

10分鐘將1個(gè)條目寫入日志文件,提醒磁盤滿狀況。

為了減輕問題,可采取下述措施:

要想繼續(xù),僅需有足夠的磁盤空間以插入所有記錄。

要想放棄線程,必須使用mysqladmin kill。下次檢查磁盤時(shí)將放棄線程(1分鐘)。

其他線程可能會(huì)正在等待導(dǎo)致磁盤滿狀況的表。如果有數(shù)個(gè)“已鎖定”的線程,殺死正在磁盤滿狀況下等待的某一線程,以便允許其他線程繼續(xù)。

對(duì)前述行為的例外是,當(dāng)你使用REPAIR TABLEOPTIMIZE TABLE時(shí),或當(dāng)索引是在LOAD DATA INFILEALTER TABLE語(yǔ)句后、在批操作中創(chuàng)建的。所有這些語(yǔ)句能創(chuàng)建大的臨時(shí)文件,如果保留這些文件,會(huì)導(dǎo)致系統(tǒng)其他部分出現(xiàn)大問題。如果在MySQL執(zhí)行這類操作的同時(shí)磁盤已滿,它將刪除大的臨時(shí)文件,并將表標(biāo)注為崩潰。但對(duì)于ALTER TABLE例外,舊表保持不變。

A.4.4.?MySQL將臨時(shí)文件儲(chǔ)存在哪里

MySQL使用環(huán)境變量TMPDIR的值作為保存臨時(shí)文件的目錄的路徑名。如果未設(shè)置TMPDIR,MySQL將使用系統(tǒng)的默認(rèn)值,通常為/tmp、/var/tmp/usr/tmp。如果包含臨時(shí)文件目錄的文件系統(tǒng)過小,可對(duì)mysqld使用“—tmpdir”選項(xiàng),在具有足夠空間的文件系統(tǒng)內(nèi)指定1個(gè)目錄。

MySQL 5.1中,“—tmpdir”選項(xiàng)可被設(shè)置為數(shù)個(gè)路徑的列表,以循環(huán)方式使用。在Unix平臺(tái)上,路徑用冒號(hào)字符“:”隔開,在WindowsNetWareOS/2平臺(tái)上,路徑用分號(hào)字符“;”隔開。注意,為了有效分布負(fù)載,這些路徑應(yīng)位于不同的物理磁盤上,而不是位于相同磁盤的不同分區(qū)中。

如果MySQL服務(wù)器正作為復(fù)制從服務(wù)器使用,不應(yīng)將“--tmpdir”設(shè)置為指向基于內(nèi)存的文件系統(tǒng)的目錄,或當(dāng)服務(wù)器主機(jī)重啟時(shí)將清空的目錄。對(duì)于復(fù)制從服務(wù)器,需要在機(jī)器重啟時(shí)仍保留一些臨時(shí)文件,以便能夠復(fù)制臨時(shí)表或執(zhí)行LOAD DATA INFILE操作。如果在服務(wù)器重啟時(shí)丟失了臨時(shí)文件目錄下的文件,復(fù)制將失敗。

MySQL會(huì)以隱含方式創(chuàng)建所有的臨時(shí)文件。這樣,就能確保中止mysqld時(shí)會(huì)刪除所有臨時(shí)文件。使用隱含文件的缺點(diǎn)在于,在臨時(shí)文件目錄所在的位置中,看不到占用了文件系統(tǒng)的大臨時(shí)文件。

進(jìn)行排序時(shí)(ORDER BYGROUP BY),MySQL通常會(huì)使用1個(gè)或多個(gè)臨時(shí)文件。所需的最大磁盤空間由下述表達(dá)式?jīng)Q定:

(length of what is sorted + sizeof(row pointer))
* number of matched rows
* 2

row pointer”(行指針)的大小通常是4字節(jié),但在以后,對(duì)于大的表,該值可能會(huì)增加。

對(duì)于某些SELECT查詢,MySQL還會(huì)創(chuàng)建臨時(shí)SQL表。它們不是隱含表,并具有SQL_*形式的名稱。

ALTER TABLE會(huì)在與原始表目錄相同的目錄下創(chuàng)建臨時(shí)表。

A.4.5.?如何保護(hù)或更改MySQL套接字文件/tmp/mysql.sock

對(duì)于服務(wù)器用來(lái)與本地客戶端進(jìn)行通信的Unix套接字文件,其默認(rèn)位置是/tmp/mysql.sock。這有可能導(dǎo)致問題,原因在于,在某些版本的Unix上,任何人都能刪除/tmp目錄下的文件。

在大多數(shù)Unix版本中,可對(duì)/tmp目錄進(jìn)行保護(hù),使得文件只能被其所有這或超級(jí)用戶(根用戶)刪除。為此,以根用戶身份登錄,并使用下述命令在/tmp目錄上設(shè)置粘著位:

shell> chmod +t /tmp

通過執(zhí)行ls -ld /tmp,可檢查是否設(shè)置了粘著位。如果最后一個(gè)許可字符是“t”,表明設(shè)置了粘著位。

另一種方法是改變服務(wù)器創(chuàng)建Unix套接字文件的位置。如果進(jìn)行了這類操作,還應(yīng)讓客戶端程序知道文件的位置。能夠以多種不同方式指定文件位置:

在全局或局部選項(xiàng)文件中指定路徑。例如,將下述行置于文件/etc/my.cnf中:

[mysqld]
socket=/path/to/socket
?
[client]
socket=/path/to/socket

請(qǐng)參見4.3.2節(jié),“使用選項(xiàng)文件”。

在運(yùn)行客戶端程序時(shí),在命令行上為mysqld_safe指定--socket”選項(xiàng)。

MYSQL_UNIX_PORT環(huán)境變量設(shè)置為Unix套接字文件的路徑。

重新從源碼編譯MySQL,以使用不同的默認(rèn)Unix套接字文件位置。運(yùn)行configure時(shí),用“--with-unix-socket-path”選項(xiàng)定義文件路徑。請(qǐng)參見2.8.2節(jié),“典型配置選項(xiàng)”。

用下述命令連接服務(wù)器,能夠測(cè)試新的套接字位置是否工作:

shell> mysqladmin --socket=/path/to/socket version

A.4.6.?時(shí)區(qū)問題

如果遇到與SELECT NOW()有關(guān)的問題,它返回GMT值而不是當(dāng)?shù)貢r(shí)間,就應(yīng)通知服務(wù)器你的當(dāng)前失去。如果UNIX_TIMESTAMP()返回錯(cuò)誤值,上述方式同樣適用。應(yīng)為服務(wù)器所運(yùn)行的環(huán)境進(jìn)行這類設(shè)置,例如,在mysqld_safemysql.server中。請(qǐng)參見附錄F:環(huán)境變量。

也可以對(duì)mysqld_safe使用“--timezone=timezone_name”選項(xiàng),為服務(wù)器設(shè)置失去。也可以在啟動(dòng)mysqld之前,通過設(shè)置TZ環(huán)境變量完成該設(shè)置。

--timezone”或TZ的允許值與系統(tǒng)有關(guān)。關(guān)于可接受的值,請(qǐng)參見操作系統(tǒng)文檔。

A.5.?與查詢有關(guān)的事宜

A.5.1. 搜索中的大小寫敏感性
A.5.2. 使用DATE列方面的問題
A.5.3. 與NULL值有關(guān)的問題
A.5.4. 與列別名有關(guān)的問題
A.5.5. 非事務(wù)表回滾失敗
A.5.6. 從相關(guān)表刪除行
A.5.7. 解決與不匹配行有關(guān)的問題
A.5.8. 與浮點(diǎn)比較有關(guān)的問題

A.5.1.?搜索中的大小寫敏感性

在默認(rèn)情況下,MySQL搜索不區(qū)分大小寫(但某些字符集始終區(qū)分大小寫,如czech)。這意味著,如果你使用col_name LIKE 'a%'進(jìn)行搜索,你將獲得以Aa開始的所有列。如果打算使搜索區(qū)分大小寫,請(qǐng)確保操作數(shù)之一具有區(qū)分大小寫的或二進(jìn)制校對(duì)。例如,如果你正在比較均適用latin1字符集的列和字符串,可使用COLLATE操作符,使1個(gè)操作數(shù)具有latin1_general_cslatin1_bin校對(duì)特性。例如:

col_name COLLATE latin1_general_cs LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_general_cs
col_name COLLATE latin1_bin LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_bin

如果希望總是以區(qū)分大小寫的方式處理列,可使用區(qū)分大小寫的或二進(jìn)制校對(duì)聲明它。請(qǐng)參見13.1.5節(jié),“CREATE TABLE語(yǔ)法”。

簡(jiǎn)單的比較操作(>=, >, =, <, <=, 排序和分組)基于每個(gè)字符的“排序值”。具有相同排序值的字符(如‘E, e,和‘??’)將被當(dāng)作相同的寫字符。

A.5.2.?使用DATE列方面的問題

DATE值的格式是'YYYY-MM-DD'。按照標(biāo)準(zhǔn)的SQL,不允許其他格式。在UPDATE表達(dá)式以及SELECT語(yǔ)句的WHERE子句中應(yīng)使用該格式。例如:

mysql> SELECT * FROM tbl_name WHERE date >= '2003-05-05';

為了方便,如果日期是在數(shù)值環(huán)境下使用的,MySQL會(huì)自動(dòng)將日期轉(zhuǎn)換為數(shù)值(反之亦然)。它還具有相當(dāng)?shù)闹悄埽诟聲r(shí)或在與TIMESTAMP、DATEDATETIME列比較日期的WHERE子句中,允許寬松的字符串形式(寬松形式表示,任何標(biāo)點(diǎn)字符均能用作各部分之間的分隔符。例如,'2004-08-15''2004#08#15'是等同的)。MySQL還能轉(zhuǎn)換不含任何分隔符的字符串(如'20040815'),前體是它必須是有意義的日期。

使用<<=、=、>=>、或BETWEEN操作符將DATE、TIME、DATETIMETIMESTAMP與常量字符串進(jìn)行比較時(shí),MySQL通常會(huì)將字符串轉(zhuǎn)換為內(nèi)部長(zhǎng)整數(shù),以便進(jìn)行快速比較(以及略為“寬松”的字符串檢查)。但是,該轉(zhuǎn)換具有下述例外:

比較兩列時(shí)

DATETIME、DATETIMETIMESTAMP列與表達(dá)式進(jìn)行比較時(shí)

使用其他比較方法時(shí),如INSTRCMP()。

對(duì)于這些例外情形,會(huì)將對(duì)象轉(zhuǎn)換為字符串并執(zhí)行字符串比較,采用該方式進(jìn)行比較。

為了保持安全,假定按字符串比較字符串,如果你打算比較臨時(shí)值和字符串,將使用恰當(dāng)?shù)淖址瘮?shù)。

對(duì)于特殊日期'0000-00-00',能夠以'0000-00-00'形式保存和檢索。在MyODBC中使用'0000-00-00'日期時(shí),對(duì)于MyODBC 2.50.12或更高版本,該日期將被自動(dòng)轉(zhuǎn)換為NULL,這是因?yàn)?span>ODBC不能處理這類日期。

由于MySQL能夠執(zhí)行前面所介紹的轉(zhuǎn)換,下述語(yǔ)句均能正常工作:

mysql> INSERT INTO tbl_name (idate) VALUES (19970505);
mysql> INSERT INTO tbl_name (idate) VALUES ('19970505');
mysql> INSERT INTO tbl_name (idate) VALUES ('97-05-05');
mysql> INSERT INTO tbl_name (idate) VALUES ('1997.05.05');
mysql> INSERT INTO tbl_name (idate) VALUES ('1997 05 05');
mysql> INSERT INTO tbl_name (idate) VALUES ('0000-00-00');
?
mysql> SELECT idate FROM tbl_name WHERE idate >= '1997-05-05';
mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT MOD(idate,100) FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT idate FROM tbl_name WHERE idate >= '19970505';

但是,下述語(yǔ)句不能正常工作:

mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,'20030505')=0;

STRCMP()是一種字符串函數(shù),它能將idate轉(zhuǎn)換為'YYYY-MM-DD'格式的字符串,并執(zhí)行字符串比較。它不能將'20030505'轉(zhuǎn)換為日期'2003-05-05'并進(jìn)行日期比較。

如果你正在使用ALLOW_INVALID_DATES SQL模式,MySQL允許以僅執(zhí)行給定的有限檢查方式保存日期:MySQL僅保證天位于131的范圍內(nèi),月位于112的范圍內(nèi)。

這樣就使得MySQL很適合于Web應(yīng)用程序,其中,你能獲得三個(gè)不同字段中的年、月、日值,也能準(zhǔn)確保存用戶插入的值(無(wú)日期驗(yàn)證)。

如果未使用NO_ZERO_IN_DATE SQL模式,“天”和“月”部分可能為0。如果你打算將生日保存在DATE列而且僅知道部分日期,它十分方便。

如果未使用NO_ZERO_DATE SQL模式,MySQL也允許你將'0000-00-00'保存為“偽日期”。在某些情況下,它比使用NULL值更方便。

如果無(wú)法將日期轉(zhuǎn)換為任何合理值,“0”將保存在DATE列中,并被檢索為'0000-00-00'。這是兼顧速度和便利性的事宜。我們認(rèn)為,數(shù)據(jù)庫(kù)服務(wù)器的職責(zé)是檢索與你保存的日期相同的日期(即使在任何情況下,數(shù)據(jù)在邏輯上不正確也同樣)。我們認(rèn)為,對(duì)日期的檢查應(yīng)由應(yīng)用程序而不是服務(wù)器負(fù)責(zé)。

如果你希望MySQL檢查所有日期并僅接受合法日期(除非由IGNORE覆蓋),應(yīng)將sql_mode設(shè)置為"NO_ZERO_IN_DATE,NO_ZERO_DATE"。

A.5.3.?與NULL值有關(guān)的問題

對(duì)于SQL的新手,NULL值的概念常常會(huì)造成混淆,他們常認(rèn)為NULL是與空字符串''相同的事。情況并非如此。例如,下述語(yǔ)句是完全不同的:

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');

這兩條語(yǔ)句均會(huì)將值插入phone(電話)列,但第1條語(yǔ)句插入的是NULL值,第2條語(yǔ)句插入的是空字符串。第1種情況的含義可被解釋為“電話號(hào)碼未知”,而第2種情況的含義可被解釋為“該人員沒有電話,因此沒有電話號(hào)碼”。

為了進(jìn)行NULL處理,可使用IS NULLIS NOT NULL操作符以及IFNULL()函數(shù)。

SQL中,NULL與任何其它值的比較(即使是NULL)永遠(yuǎn)不會(huì)為“真”。包含NULL的表達(dá)式總是會(huì)導(dǎo)出NULL值,除非在關(guān)于操作符的文檔中以及表達(dá)式的函數(shù)中作了其他規(guī)定。下述示例中的所有列均返回NULL

mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);

如果打算搜索列值為NULL的列,不能使用expr = NULL測(cè)試。下述語(yǔ)句不返回任何行,這是因?yàn)椋瑢?duì)于任何表達(dá)式,expr = NULL永遠(yuǎn)不為

mysql> SELECT * FROM my_table WHERE phone = NULL;

要想查找NULL值,必須使用IS NULL測(cè)試。在下面的語(yǔ)句中,介紹了查找NULL電話號(hào)碼和空電話號(hào)碼的方式:

mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';

更多信息和示例,請(qǐng)參見3.3.4.6節(jié),“使用NULL值”。

如果你正在使用MyISAM、InnoDBBDB、或MEMORY存儲(chǔ)引擎,能夠在可能具有NULL值的列上增加1條索引。如不然,必須聲明索引列為NOT NULL,而且不能將NULL插入到列中。

LOAD DATA INFILE讀取數(shù)據(jù)時(shí),對(duì)于空的或丟失的列,將用''更新它們。如果希望在列中具有NULL值,應(yīng)在數(shù)據(jù)文件中使用\N。在某些情況下,也可以使用文字性單詞“NULL”。請(qǐng)參見13.2.5 LOAD DATA INFILE語(yǔ)法”

使用DISTINCT、GROUP BYORDER BY時(shí),所有NULL值將被視為等同的。

使用ORDER BY時(shí),首先將顯示NULL值,如果指定了DESC按降序排列,NULL值將最后顯示。

對(duì)于聚合(累計(jì))函數(shù),如COUNT()、MIN()SUM(),將忽略NULL值。對(duì)此的例外是COUNT(*),它將計(jì)數(shù)行而不是單獨(dú)的列值。例如,下述語(yǔ)句產(chǎn)生兩個(gè)計(jì)數(shù)。首先計(jì)數(shù)表中的行數(shù),其次計(jì)數(shù)age列中的非NULL值數(shù)目:

mysql> SELECT COUNT(*), COUNT(age) FROM person;

對(duì)于某些列類型,MySQL將對(duì)NULL值進(jìn)行特殊處理。如果將NULL插入TIMESTAMP列,將插入當(dāng)前日期和時(shí)間。如果將NULL插入具有AUTO_INCREMENT屬性的整數(shù)列,將插入序列中的下一個(gè)編號(hào)。

A.5.4.?與列別名有關(guān)的問題

可以使用別名來(lái)引用GROUP BY、ORDER BYHAVING子句中的列。別名也能用于為列提供更好的名稱:
SELECT SQRT(a*b) AS root FROM tbl_name GROUP BY root HAVING root > 0;
SELECT id, COUNT(*) AS cnt FROM tbl_name GROUP BY id HAVING cnt > 0;
SELECT id AS 'Customer identity' FROM tbl_name;

標(biāo)準(zhǔn)SQL不允許在WHERE子句中已用列別名。這是因?yàn)?,?zhí)行WHERE代碼時(shí),可能尚未確定列值。例如,下述查詢是非法的:

SELECT id, COUNT(*) AS cnt FROM tbl_name WHERE cnt > 0 GROUP BY id;

執(zhí)行WHERE語(yǔ)句以確定哪些行應(yīng)被包含在GROUP BY部分中,而HAVING用于確定應(yīng)使用結(jié)果集中的哪些行。

A.5.5.?非事務(wù)表回滾失敗

執(zhí)行ROLLBACK(回滾)時(shí),如果收到下述消息,表示事務(wù)中使用的1個(gè)或多個(gè)表不支持事務(wù):

警告:某些更改的非事務(wù)性表不能被回滾。

這些非事務(wù)性表不受ROLLBACK語(yǔ)句的影響。

如果在事務(wù)中意外地混合了事務(wù)性表和非事務(wù)性表,導(dǎo)致該消息的最可能原因是,你認(rèn)為本應(yīng)是事務(wù)性的表實(shí)際上不是。如你試圖使用mysqld服務(wù)器不支持的事務(wù)性存儲(chǔ)引擎(或用啟動(dòng)選項(xiàng)禁止了它)創(chuàng)建表,就可能出現(xiàn)該情況。如果mysqld不支持存儲(chǔ)引擎,它將以MyISAM表創(chuàng)建表,這是非事務(wù)性表。

可使用下述語(yǔ)句之一檢查表的標(biāo)類型:

SHOW TABLE STATUS LIKE 'tbl_name';
SHOW CREATE TABLE tbl_name;

請(qǐng)參見13.5.4.18節(jié),“SHOW TABLE STATUS語(yǔ)法以及13.5.4.5節(jié),“SHOW CREATE TABLE語(yǔ)法”。

使用下述語(yǔ)句,可檢查mysqld服務(wù)器支持的存儲(chǔ)引擎:

SHOW ENGINES;

也可以使用下述語(yǔ)句,檢查與你感興趣的存儲(chǔ)引擎有關(guān)的變量值:

SHOW VARIABLES LIKE 'have_%';

例如,要想確定InnoDB存儲(chǔ)引擎是否可用,可檢查have_innodb變量的值。

請(qǐng)參見13.5.4.8節(jié),“SHOW ENGINES語(yǔ)法”和13.5.4.21節(jié),“SHOW VARIABLES語(yǔ)法”。

A.5.6.?從相關(guān)表刪除行

如果針對(duì)related_tableDELETE語(yǔ)句的總長(zhǎng)度超過1MB(系統(tǒng)變量max_allowed_packet的默認(rèn)值),應(yīng)將其分為較小的部分,并執(zhí)行多個(gè)DELETE語(yǔ)句。如果related_column是索引列,為每條語(yǔ)句指定1001000個(gè)related_column值,或許能獲得更快的DELETE速度。如果related_column不是索引列,速度與IN子句中的參量數(shù)目無(wú)關(guān)。

A.5.7.?解決與不匹配行有關(guān)的問題

如果有使用了很多表的復(fù)雜查詢,但未返回任何行,應(yīng)采用下述步驟找出什么出錯(cuò):

EXPLAIN測(cè)試查詢,以檢查是否發(fā)現(xiàn)某事顯然出錯(cuò)。請(qǐng)參見7.2.1節(jié),“EXPLAIN語(yǔ)法(獲取關(guān)于SELECT的信息)”。

僅選擇在WHERE子句中使用的列。

從查詢中1次刪除1個(gè)表,直至返回了某些行為止。如果表很大,較好的主意是在查詢中使用LIMIT 10。

對(duì)于具有與上次從查詢中刪除的表匹配的行的列,發(fā)出SELECT查詢。

如果將FLOATDOUBLE列與具有數(shù)值類型的數(shù)值進(jìn)行比較,不能使用等式(=)比較。在大多數(shù)計(jì)算機(jī)語(yǔ)言中,該問題很常見,這是因?yàn)?,并非所有的浮點(diǎn)值均能以準(zhǔn)確的精度保存。在某些情況下,將FLOAT更改為DOUBLE可更正該問題。請(qǐng)參見A.5.8節(jié),“與浮點(diǎn)比較有關(guān)的問題”。

如果仍不能找出問題之所在,請(qǐng)創(chuàng)建能與顯示問題的“mysql test < query.sql”一起運(yùn)行的最小測(cè)試。通過使用mysqldump --quick db_name tbl_name_1 ... tbl_name_n > query.sql轉(zhuǎn)儲(chǔ)表,可創(chuàng)建測(cè)試文件。在編輯器中打開文件,刪除某些插入的行(如果有超出演示問題所需的行),并在文件末尾添加SELECT語(yǔ)句。

通過執(zhí)行下述命令,驗(yàn)證測(cè)試文件能演示問題:

shell> mysqladmin create test2
shell> mysql test2 < query.sql

使用mysqlbug將測(cè)試文件張貼到喲娜通用MySQL郵件列表。請(qǐng)參見1.7.1.1節(jié),“The MySQL郵件列表”。

A.5.8.?與浮點(diǎn)比較有關(guān)的問題

注意,下述部分主要與DOUBLEFLOAT列相關(guān),原因在于浮點(diǎn)數(shù)的不準(zhǔn)確本質(zhì)。MySQL使用64位十進(jìn)制數(shù)值的精度執(zhí)行DECIMAL操作,當(dāng)處理DECIMAL列時(shí),應(yīng)能解決大多數(shù)常見的不準(zhǔn)確問題。

浮點(diǎn)數(shù)有時(shí)會(huì)導(dǎo)致混淆,這是因?yàn)樗鼈儫o(wú)法以準(zhǔn)確值保存在計(jì)算機(jī)體系結(jié)構(gòu)中。你在屏幕上所看到的值通常不是數(shù)值的準(zhǔn)確值。對(duì)于FLOATDOUBLE列類型,情況就是如此。DECIMAL列能保存具有準(zhǔn)確精度的值,這是因?yàn)樗鼈兪怯勺址硎镜摹?/span>

在下面的示例中,介紹了使用DOUBLE時(shí)的問題:

mysql> CREATE TABLE t1 (i INT, d1 DOUBLE, d2 DOUBLE);
mysql> INSERT INTO t1 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00),
??? -> (2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40),
??? -> (2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00),
??? -> (4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00),
??? -> (5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20),
??? -> (6, 0.00, 0.00), (6, -51.40, 0.00);
?
mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b
??? -> FROM t1 GROUP BY i HAVING a <> b;
?
+------+-------+------+
| i??? | a???? | b??? |
+------+-------+------+
| ???1 |? 21.4 | 21.4 |
|??? 2 |? 76.8 | 76.8 |
|??? 3 |?? 7.4 |? 7.4 |
|??? 4 |? 15.4 | 15.4 |
|??? 5 |?? 7.2 |? 7.2 |
|??? 6 | -51.4 |??? 0 |
+------+-------+------+

結(jié)果是正確的。盡管前5個(gè)記錄看上去不應(yīng)能進(jìn)行比較測(cè)試(ab的值看上去沒有什么不同),但它們能進(jìn)行比較,這是因?yàn)轱@示的數(shù)值間的差異在十分位左右,具體情況取決于計(jì)算機(jī)的體系結(jié)構(gòu)。

如果列d1d2定義為DECIMAL而不是DOUBLE,SELECT查詢的結(jié)果僅包含1行,即上面顯示的最后1行。

A.6.?與優(yōu)化器有關(guān)的事宜

MySQL采用了基于開銷的優(yōu)化器,以確定處理查詢的最解方式。在很多情況下,MySQL能夠計(jì)算最佳的可能查詢計(jì)劃,但在某些情況下,MySQL沒有關(guān)于數(shù)據(jù)的足夠信息,不得不就數(shù)據(jù)進(jìn)行“有教養(yǎng)”的估測(cè)。

當(dāng)MySQL未能做“正確的”事時(shí),可使用下述工具來(lái)幫助MySQL

使用EXPLAIN語(yǔ)句獲取關(guān)于MySQL如何處理查詢的信息。要想使用它,可在SELECT語(yǔ)句前添加關(guān)鍵字EXPLAIN

mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t1.i = t2.i;

關(guān)于EXPLAIN的詳細(xì)討論,請(qǐng)參見7.2.1節(jié),“EXPLAIN語(yǔ)法(獲取關(guān)于SELECT的信息)”。

使用ANALYZE TABLE tbl_name,為已掃描的表更新鍵分配。請(qǐng)參見13.5.2.1節(jié),“ANALYZE TABLE語(yǔ)法”。

為已掃描的表使用FORCE INDEX,通知MySQL:與使用給定的索引相比,表掃描開銷昂貴。請(qǐng)參見13.2.7節(jié),“SELECT語(yǔ)法”。

SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
WHERE t1.col_name=t2.col_name;

USE INDEXIGNORE INDEX也有一定的幫助。

關(guān)于全局和表級(jí)別的STRAIGHT_JOIN。請(qǐng)參見13.2.7節(jié),“SELECT語(yǔ)法”。

你可以調(diào)節(jié)全局或線程類系統(tǒng)變量。例如,用“--max-seeks-for-key=1000選項(xiàng)啟動(dòng)mysqld,或使用“SET max_seeks_for_key=1000”來(lái)通知優(yōu)化器:假定任何表掃描均不會(huì)導(dǎo)致1000個(gè)以上的鍵搜索。請(qǐng)參見5.3.3節(jié),“服務(wù)器系統(tǒng)變量”。

A.7.?與表定義有關(guān)的事宜

A.7.1. 與ALTER TABLE有關(guān)的問題
A.7.2. 如何更改表中的列順序
A.7.3. TEMPORARY TABLE問題

A.7.1.?與ALTER TABLE有關(guān)的問題

ALTER TABLE將表更改為當(dāng)前字符集。如果在執(zhí)行ALTER TABLE操作期間遇到重復(fù)鍵錯(cuò)誤,原因在于新的字符集將2個(gè)鍵映射到了相同值,或是表已損壞。在后一種情況下,應(yīng)在表上運(yùn)行REPAIR TABLE。

如果ALTER TABLE失敗并給出下述錯(cuò)誤,問題可能是因?yàn)樵?span>ALTER TABLE操作的早期階段出現(xiàn)MySQL崩潰,沒有名為A-xxxB-xxx的舊表:

Error on rename of './database/name.frm'
to './database/B-xxx.frm' (Errcode: 17)

在該情況下,進(jìn)入MySQL數(shù)據(jù)目錄,并刪除其名稱為以A-B-開始的所有文件(或許你希望將它們移動(dòng)到其他地方而不是刪除它們)。

ALTER TABLE的工作方式如下:

  • 用請(qǐng)求的結(jié)構(gòu)變化創(chuàng)建名為A-xxx的新表。
  • 將所有行從原始表拷貝到A-xxx
  • 將原始表重命名為B-xxx。
  • A-xxx重命名為原始表的名稱。
  • 刪除B-xxx。

如果在重命名操作中出錯(cuò),MySQL將嘗試撤銷更改。如果錯(cuò)誤很嚴(yán)重(盡管這不應(yīng)出現(xiàn)),MySQL會(huì)將舊表保留為B-xxx。簡(jiǎn)單地在系統(tǒng)級(jí)別上重命名表文件,應(yīng)能使數(shù)據(jù)復(fù)原。

如果在事務(wù)性表上使用ALTER TABLE,或正在使用WindowsOS/2操作系統(tǒng),如果已在表上執(zhí)行了LOCK TABLE操作,ALTER TABLE將對(duì)表執(zhí)行解鎖操作。這是因?yàn)?span>InnoDB和這類操作系統(tǒng)不能撤銷正在使用的表。

A.7.2.?如何更改表中的列順序

首先,請(qǐng)考慮是否的確需要更改表中的列順序。SQL的核心要點(diǎn)是從數(shù)據(jù)存儲(chǔ)格式獲取應(yīng)用。總應(yīng)指定檢索數(shù)據(jù)的順序。在下面的第1條語(yǔ)句中,以col_name1、col_name2、col_name3順序返回列;在第2條語(yǔ)句中,以col_name1col_name3、col_name2順序返回列:

mysql> SELECT col_name1, col_name2, col_name3 FROM tbl_name;
mysql> SELECT col_name1, col_name3, col_name2 FROM tbl_name;

如果決定更改表列的順序,可執(zhí)行下述操作:

  1. 用具有新順序的列創(chuàng)建新表。
  2. 執(zhí)行該語(yǔ)句:
mysql> INSERT INTO new_table
??? -> SELECT columns-in-new-order FROM old_table;
  1. 撤銷或重命名old_table
  2. 將新表重命名為原始名稱:
mysql> ALTER TABLE new_table RENAME old_table;

SELECT *十分適合于測(cè)試查詢。但是,在應(yīng)用程序中,永遠(yuǎn)不要依賴SELECT *的使用,不要依賴根據(jù)其位置檢索列。如果添加、移動(dòng)或刪除了列,所返回的列的順序和位置不會(huì)保持相同。對(duì)表結(jié)構(gòu)的簡(jiǎn)單更改也會(huì)導(dǎo)致應(yīng)用程序失敗。

A.7.3.?TEMPORARY TABLE問題

下面介紹了對(duì)使用TEMPORARY表的限制:

  • TEMPORARY表只能是HEAP、ISAM、MyISAMMERGE、或InnoDB類型。
  • 在相同的查詢中,不能引用TEMPORARY1次以上。例如,下例不能正常工作:
mysql> SELECT * FROM temp_table, temp_table AS t2;
錯(cuò)誤1137:不能再次打開表:'temp_table'
  • SHOW TABLES語(yǔ)句不會(huì)列出TEMPORARY表。
  • 不能使用RENAME重命名TEMPORARY表。但能使用ALTER TABLE取而代之:
mysql> ALTER TABLE orig_name RENAME new_name;

A.8.?MySQL中的已知事宜

A.8.1. MySQL中的打開事宜

在本節(jié)中,列出了當(dāng)前MySQL版本中的已知事宜。

關(guān)于平臺(tái)相關(guān)事宜的更多信息,請(qǐng)參見2.12節(jié),“具體操作系統(tǒng)相關(guān)的注意事項(xiàng)”和附錄E:移植到其他系統(tǒng)中的安裝和移植說(shuō)明。

A.8.1.?MySQL中的打開事宜

下面列出了已知問題,更正它們具有較高的優(yōu)先級(jí):

  • 如果將NULL值與使用ALL/ANY/SOME的子查詢進(jìn)行比較,而且子查詢返回空的結(jié)果,比較操作會(huì)評(píng)估NULL的非標(biāo)準(zhǔn)結(jié)果而不是TRUEFALSE。在MySQL 5.1中將更正該問題。
  • 對(duì)于IN的線子查詢優(yōu)化不像“=”那樣有效。
  • 即使使用了lower_case_table_names=2(允許MySQL記住數(shù)據(jù)庫(kù)名和表名使用的大小寫),對(duì)于函數(shù)DATABASE()或在各種日志內(nèi)(在不區(qū)分大小寫的系統(tǒng)上),MySQL也不會(huì)記住數(shù)據(jù)庫(kù)名使用的大小寫情況。
  • 在復(fù)制操作中,撤銷FOREIGN KEY約束不工作,這是因?yàn)榧s束可能在從服務(wù)器上有另一個(gè)名稱。
  • REPLACE(以及具有REPLACE選項(xiàng)的LOAD DATA)不會(huì)觸發(fā)ON DELETE CASCADE
  • 如果未使用所有列而且僅使用DISTINCT列表中的列,在GROUP_CONCAT()中,DISTINCT不能與ORDER BY一起工作。
  • 如果1位用戶擁有長(zhǎng)時(shí)間運(yùn)行的事務(wù),而且另1位用戶撤銷了在事務(wù)中更新的某1表,那么在表用于事務(wù)本身之前,存在較小的機(jī)會(huì),會(huì)在二進(jìn)制日志中包含DROP TABLE命令。我們計(jì)劃更正該問題,方法是讓DROP TABLE命令等待,直至表未在任何事務(wù)中使用為止。
  • 將大的整數(shù)值(介于2632641之間)插入數(shù)值或字符串列時(shí),它將作為負(fù)值插入,這是因?yàn)樵摂?shù)值是在有符號(hào)整數(shù)環(huán)境下評(píng)估的。
  • 如果服務(wù)器運(yùn)行在不具備二進(jìn)制日志功能的條件下,FLUSH TABLES WITH READ LOCK不能屏蔽COMMIT,執(zhí)行完整備份時(shí)這可能會(huì)導(dǎo)致問題(表間的一致性問題)。
  • 在某些情況下,作用在BDB表上的ANALYZE TABLE會(huì)導(dǎo)致表不可用,直至重啟mysqld為止。如果出現(xiàn)該情況,請(qǐng)?jiān)?span>MySQL錯(cuò)誤文件中查找下述形式的錯(cuò)誤:
001207 22:07:56? bdb:? log_flush: LSN past current end-of-log
  • 在所有事務(wù)完成之前,不要在BDB表(正在其上運(yùn)行多語(yǔ)句事務(wù))上執(zhí)行ALTER TABLE(可能會(huì)忽略事務(wù))。
  • 對(duì)于正在使用INSERT DELAYED的表,在其上執(zhí)行ANALYZE TABLE、OPTIMIZE TABLEREPAIR TABLE時(shí),可能會(huì)導(dǎo)致問題。
  • 在表上執(zhí)行LOCK TABLE ...FLUSH TABLES ...時(shí),不保證沒有完成一半的事務(wù)。
  • BDB打開的速度相對(duì)較慢。如果你在數(shù)據(jù)庫(kù)上有很多BDB表,如果未使用“-A”選項(xiàng)或正使用再混編功能,要想在數(shù)據(jù)庫(kù)上使用mysql客戶端,需要花費(fèi)較長(zhǎng)的時(shí)間。當(dāng)你有大的表高速緩沖時(shí),這點(diǎn)尤其明顯。
  • 復(fù)制功能采用了查詢級(jí)日志功能:主服務(wù)器將已執(zhí)行的查詢寫入二進(jìn)制日志。這是一種速度很快、簡(jiǎn)潔和有效的記錄方法,在大多數(shù)情況下工作良好。

如果以特定的方式設(shè)計(jì)查詢,使得數(shù)據(jù)更改是非決定性(通常不推薦,即使在復(fù)制之外也同樣),主服務(wù)器和從服務(wù)器上的數(shù)據(jù)將變得不同。

例如:

  • 將0或NULL值插入AUTO_INCREMENT列中的CREATE ... SELECT或INSERT ... SELECT語(yǔ)句。
  • DELETE,如果從具有ON DELETE CASCADE屬性的外鍵的表中刪除行。
  • REPLACE ... SELECT、INSERT IGNORE ... SELECT,如果在插入的數(shù)據(jù)中具有重復(fù)鍵。

當(dāng)且僅當(dāng)前述查詢沒有保證決定行順序的ORDER BY子句時(shí)。

例如,對(duì)于不具有ORDER BYINSERT ... SELECTSELECT可能會(huì)以不同的順序返回行(它會(huì)導(dǎo)致具有不同等級(jí)的行,從而導(dǎo)致AUTO_INCREMENT列中的不同數(shù)值),具體情況取決于優(yōu)化器在主服務(wù)器和從服務(wù)器上所作的選擇。

在主服務(wù)器和從服務(wù)器上,查詢將進(jìn)行不同的優(yōu)化,僅當(dāng):

  • 使用不同的存儲(chǔ)引擎在主服務(wù)器上而不是從服務(wù)器上保存表。(能夠在主服務(wù)器和從服務(wù)器上使用不同的存儲(chǔ)引擎。例如,如果從服務(wù)器具有較少的可用磁盤空間,可以在主服務(wù)器上使用InnoDB,但在 從服務(wù)器桑使用MyISAM)。
  • 在主服務(wù)器和從服務(wù)器上,MySQL緩沖區(qū)大小是不同的(key_buffer_size等)。
  • 在主服務(wù)器和從服務(wù)器上運(yùn)行不同的MySQL版本,版本間的優(yōu)化器代碼也不同。

該問題也會(huì)影響使用mysqlbinlog|mysql的數(shù)據(jù)庫(kù)恢復(fù)。

避免該問題的最簡(jiǎn)單方法是,為前述的非決定性查詢?cè)黾?span>ORDER BY子句,以確??偸且韵嗤捻樞虮4婊蚋男?。

在將來(lái)的MySQL版本中,需要時(shí),我們將自動(dòng)增加ORDER BY子句。

下面列出了已知的事宜,這些事宜將在恰當(dāng)?shù)臅r(shí)候更正:

  • 日志文件名基于服務(wù)器主機(jī)名(如果未使用啟動(dòng)選項(xiàng)指定文件名的話)。如果更改了主機(jī)名,你將不得不使用諸如“--log-bin=old_host_name-bin”等選下美國(guó)。另一種選擇是重命名舊文件,以反映主機(jī)名變更情況(如果是二進(jìn)制日志,需要編輯二進(jìn)制日志索引文件,并更正binlog名稱)。請(qǐng)參見5.3.1節(jié),“mysqld命令行選項(xiàng)”。
  • Mysqlbinlog不刪除執(zhí)行LOAD DATA INFILE命令后遺留的臨時(shí)文件。請(qǐng)參見8.6節(jié),“mysqlbinlog:用于處理二進(jìn)制日志文件的實(shí)用工具”。
  • RENAME不能與TEMPORARY表一起工作,也不能與MERGE表中使用的表一起工作。
  • 由于表定義文件的保存方式,不能在表名、列名或枚舉中使用字符255CHAR(255))。按照安排,當(dāng)我們實(shí)施了新的表定義格式文件時(shí),將在5.1版中更正該問題。
  • 使用SET CHARACTER SET時(shí),不能在數(shù)據(jù)庫(kù)、表和列名中使用轉(zhuǎn)換的字符。
  • 不能在LIKE ... ESCAPE中與ESCAPE一起使用_’或‘%’。
  • 如果你有1個(gè)DECIMAL列,其中,相同的數(shù)值以不同的格式保存(例如,+01.00、1.0001.00),GROUP BY可能會(huì)將每個(gè)值當(dāng)作不同的值。
  • 使用MIT-pthreads時(shí),不能在另一個(gè)目錄下創(chuàng)建服務(wù)器。這是因?yàn)樗枰?span>MIT-pthreads,我們不太會(huì)更正該問題。請(qǐng)參見2.8.5 MIT-pthreads注意事項(xiàng)” 。
  • GROUP BY、ORDER BYDISTINCT中,不能可靠地使用BLOBTEXT值。在這類情況下,與BLOB值進(jìn)行比較時(shí),僅使用最前的max_sort_length字節(jié)。max_sort_length的默認(rèn)值是1024,可在服務(wù)器啟動(dòng)時(shí)或運(yùn)行時(shí)更改它。
  • 數(shù)值計(jì)算是使用BIGINTDOUBLE(正常情況下均為64位長(zhǎng))進(jìn)行的。你所能獲得的精度取決于函數(shù)。通用規(guī)則是位函數(shù)是按BIGINT精度執(zhí)行的,IFELT()是按BIGINTDOUBLE精度執(zhí)行的,其余的函數(shù)是按DOUBLE精度執(zhí)行的。對(duì)于除位字段外的其他數(shù),如果大于63位(9223372036854775807),應(yīng)避免使用無(wú)符號(hào)長(zhǎng)long值。
  • 1個(gè)表中,最多能有255個(gè)ENUMSET列。
  • MIN()MAX()以及其他聚合函數(shù)中,MySQL目前會(huì)根據(jù)其字符串值比較ENUMSET列,而不是根據(jù)字符串在集合中的相對(duì)位置。
  • mysqld_safe會(huì)將來(lái)自mysqld的所有消息再定向到mysqld日志。與之相關(guān)的1個(gè)問題是,如果你執(zhí)行mysqladmin refresh關(guān)閉并再次打開日志,stdoutstderr仍會(huì)被重定向到舊的日志。如果你以廣義方式使用“--log”,應(yīng)編輯mysqld_safe以記錄到host_name.err而不是host_name.log,以便通過刪除它并執(zhí)行mysqladmin refresh,方便地收回為舊日志分配的空間。
  • UPDATE語(yǔ)句中,列從左向右更新。如果引用了已更新的列,你將得到更新值而不是原始值。例如,下述語(yǔ)句會(huì)將KEY增加2,而不是1
mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;
  • 你可以在相同查詢中引用多個(gè)臨時(shí)表,但不能引用任何給定的臨時(shí)表1次以上。例如,下述語(yǔ)句不能正常工作:
mysql> SELECT * FROM temp_table, temp_table AS t2;
錯(cuò)誤1137:不能再次打開表:'temp_table'
  • 當(dāng)你在聯(lián)合操作中使用“隱含”列時(shí),與未使用隱含列相比,優(yōu)化器將以不同的方式處理DISTINCT。在聯(lián)合操作中,隱含列將作為結(jié)果的組成部份計(jì)數(shù)(即使未顯示),但在正常查詢中,隱含列不參與DISTINCT比較。在以后,我們可能會(huì)更改該情況,在執(zhí)行DISTINCT時(shí)不比較隱含列。

例如:

SELECT DISTINCT mp3id FROM band_downloads
?????? WHERE userid = 9 ORDER BY id DESC;

以及

SELECT DISTINCT band_downloads.mp3id
?????? FROM band_downloads,band_mp3
?????? WHERE band_downloads.userid = 9
?????? AND band_mp3.id = band_downloads.mp3id
?????? ORDER BY band_downloads.id DESC;

在第2種情況下,使用MySQL服務(wù)器3.23.x,可在結(jié)果集中獲得2個(gè)等同行(這是因?yàn)?,隱藏ID列中的值可能不同)。

注意,在結(jié)果集中,僅對(duì)不含ORDER BY列的查詢才會(huì)出現(xiàn)該情況。

  • 如果在返回空集的查詢上執(zhí)行PROCEDURE,在某些情況下,PROCEDURE不轉(zhuǎn)換列。
  • 創(chuàng)建具有MERGE類型的表時(shí),不檢查基本表是否具有兼容的類型。
  • 如果使用ALTER TABLEMERGE表中使用的表增加了UNIQUE索引,然后在MERGE表上增加了正常索引,如果在表中存在舊的、非UNIQUE鍵,對(duì)于這些表,鍵順序是不同的。這是因?yàn)椋?span>ALTER TABLE會(huì)將UNIQUE索引放在正常索引之前,以便能盡早檢測(cè)到重復(fù)的鍵。
?

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

前の記事: 次の記事: