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

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

第24章:精度數學

目錄

24.1. 數值的類型
24.2. DECIMAL數據類型更改
24.3. 表達式處理
24.4. 四舍五入
24.5. 精度數學示例

MySQL 5.1提供了對精度數學的支持,也就是說,數值處理功能,它能給出極其精確的結果,并能對無效值進行高度控制。精度數學基于下述兩種特性:

·???????? SQL模式,控制服務器接受或拒絕無效值的嚴格程度(請參見5.3.2節(jié),“SQL服務器模式”)。

·???????? 用于定點算法的MySQL庫。

對于數值操作,這些特性具有數種隱含意義:

·???????? 精確計算:對于準確值數值,計算不會引入浮點錯誤。相反,將使用準確的精度。例如,對于數值.0001,會將其當作準確值予以處理,而不是近似值,將其加10000次可獲得準確的結果1,而不是近似于1的值。

·???????? 定義良好的四舍五入特性:對于準確值數值,ROUND()的結果取決于其參量,而不是環(huán)境因素,如底層C庫的工作方式等。

·???????? 平臺無關性:對準確數值的操作在不同平臺上(如UnixWindows)是相同的。

·???????? 對無效值處理的控制:能夠檢測到溢出和除0情況,并會將其當作錯誤加以處理。例如,能夠將對于某列來說過大的值當作錯誤對待,而不是對該值進行截短使之位于列數據類型的范圍內。同樣,也會將除0當作錯誤,而不是會獲得NULL結果的操作。至于選擇那種方式,它是由系統(tǒng)變量sql_mode的設置決定的(請參見5.3.2節(jié),“SQL服務器模式”)。

這類特性的一個重要結果是,MySQL 5.1提供了與標準SQL的高度兼容性。

在下面的討論中,介紹了精度數學的數種工作方式(包括與早期應用程序的可能的不兼容性)。在最后,給出了一些示例,演示了MySQL 5.1是如何精確處理數值操作的。

24.1.?數值的類型

對于準確值操作,精度數學的范圍包括準確值的數據類型(DECIMAL和整數類型)以及準確值數值文字。對于近似值數據類型和數值文字,仍會將其當作浮點數值予以處理。

準確值數值文字具有整數部分和小數部分,或兩者。它們可以是有符號的。例如:1、.2、3.4、-5-6.78、+9.10。

近似值數值文字采用科學計數法表示,包含尾數和指數。任意部分或兩者均可以是帶符號的。例如,1.2E3、1.2E-3、-1.2E3、-1.2E-3

對于看上去類似的數值,不需要均為準確值或近似值。例如,2.34是準確值(定點)數值,而2.34E0是近似值(浮點)數值。

DECIMAL數據類型是定點類型,其計算是準確的。在MySQL中,DECIMAL類型有多個同義詞:NUMERIC、DEC、FIXED。整數類型也是準確值類型。

FLOATDOUBLE數據類型是浮點類型,其計算是近似的。在MySQL中,與FLOATDOUBLE同義的類型是DOUBLE PRECISIONREAL

24.2.?DECIMAL數據類型更改

本節(jié)討論了MySQL 5.1DECIMAL數據類型(以及其同義類型)的特性,尤其是下述方面:

·???????? 數字的最大數。

·???????? 存儲格式。

·???????? 存儲要求。

·???????? DECIMAL列上界 的非標準MySQL擴展。

在本節(jié)中,對于為較早MySQL版本編寫的應用程序,在相應的地方指出了可能的不兼容性。

DECIMAL列的聲明語法是DECIMAL(M,D)。在MySQL 5.1中,參量的取值范圍如下:

·???????? M是數字的最大數(精度)。其范圍為165(在較舊的MySQL版本中,允許的范圍是1254)。

·???????? D是小數點右側數字的數目(標度)。其范圍是030,但不得超過M。

對于M,最大值65意味著,對DECIMAL值的計算能精確到65位數字。這種65位數字的精度限制也適用于準確值數值文字,因此,這類文字值的最大范圍不同于以前的范圍(在較早的MySQL版本中,十進制值能達到254位。不過,采用的是浮點計算,因而是近似計算而不是準確計算)。

MySQL 5.1中,采用二進制格式保存DECIMAL列的值,將9個十進制數字打包在4字節(jié)中。對于每個值的整數部分和小數部分,其存儲要求是分別確定的。每9個數字需要4字節(jié),任何剩余的數字將占用4字節(jié)的一部分。例如,DECIMAL(18,9)列在小數點的每一側均有9位數字,因此,整數部分和小數部分均需要4字節(jié)。DECIMAL(20,10)列在小數點的每一側均有10位數字。對于每一部分,9位數字需要4字節(jié),剩余的1位數字需要1字節(jié)。

在下表中,給出了關于剩余數字的存儲要求:

剩余的數字

字節(jié)數

0

0

1

1

2

1

3

2

4

2

5

3

6

3

7

4

8

4

9

4

與某些較早的MySQL版本不同,在MySQL 5.1中,DECIMAL列不保存前導“+”字符或前導“0”數字。如果將+0003.1插入DECIMAL(5,1)列,將保存為3.1。為了適應該變化,必須更改依賴于早期行為的應用程序。

MySQL 5.1中,DECIMAL列不允許保存大于列定義中隱含范圍的值。例如,DECIMAL(3,0)列支持的范圍為-999999。對于DECIMAL(M,D)列,小數點左側最多允許M D位數字(它與依賴于早期MySQL版本的應用程序不兼容,允許保存額外數字代替“+”號)。

SQL標準要求,NUMERIC(M,D)的精度必須準確為M位數字。對于DECIMAL(M,D),標準要求的精度至少為M位數字,但允許更多。在MySQL中,DECIMAL(M,D)NUMERIC(M,D)是相同的,兩者的精度均準確為M位數字。

對于依賴DECIMAL數據類型早期處理方式的應用程序,關于移植這類應用程序的更多信息,請參見MySQL 5.0參考手冊。

24.3.?表達式處理

對于精度數學,只要可能,就會使用給定的準確值數值。例如,在比較中所用的數值與給定的值準確相同,無任何變化。在嚴格的SQL模式下,對于插入具有準確數據類型(DECIMAL或整數)的列的INSERT操作,如果值在列的允許范圍內,將插入具有準確值的數值。檢索時,所獲得的值與插入的值應是相同(如果未采用嚴格模式,允許INSERT執(zhí)行截短操作)。

對數值表達式的處理取決于表達式包含的值的類型:

·???????? 如果存在任何近似值,表達式也是近似的,并將使用浮點算法進行評估。

·???????? 如果不存在近似值,表達式僅包含準確值。如果任一準確值包含小數部分(小數點后面的值),將使用DECIMAL準確算法來計算表達式,其精度為65位數字。術語“準確”受二進制表述方面的限制。例如,1.0/3.0在十進制表述中可近似為.333...,但并不是準確數值,因此(1.0/3.0)*3.0不會被計算為準確的1.0

·???????? 另外,表達式僅包含整數值。表達式是準確的,并將使用整數算法進行計算,其精度與BIGINT的相同(64比特)。

如果數值表達式包含任何字符串,會將其轉換為雙精度浮點值,表達式是近似的。

數值列中的插入操作受SQL模式的影響,它是由sql_mode系統(tǒng)變量控制的(請參見1.8.2節(jié),“選擇SQL模式”)。下面介紹了嚴格模式(由STRICT_ALL_TABLESSTRICT_TRANS_TABLES模式值選擇)RROR_FOR_DIVISION_BY_ZERO。要想打開所有限制,可簡單地使用TRADITIONAL模式,它包含嚴格模式和ERROR_FOR_DIVISION_BY_ZERO

mysql> SET SQL_MODE='TRADITIONAL';

如果將數值插入具有準確類型的列(DECIMAL或整數),如果值在列允許的范圍內,將以準確值形式插入數值。

如果數值在其小數部分有過多位,將執(zhí)行四舍五入操作并給出告警。關于四舍五入的具體介紹,請參見四舍五入一節(jié)。

如果數值在其整數部分有過多位,數值過大,并將按下述方式處理:

·???????? 如果未啟用嚴格模式,該數值將被截短為最近的合法值,并發(fā)出警告。

·???????? 如果啟用了嚴格模式,將給出溢出錯誤。

不檢測下溢,因而下溢處理是不確定的。

默認情況下,除0操作會導致NULL結果,不產生告警。啟用了ERROR_FOR_DIVISION_BY_ZERO SQL模式后,MySQL會以不同方式處理除0問題:

·???????? 如果未啟用嚴格模式,發(fā)出警告。

·???????? 如果啟用了嚴格模式,將禁止包含除0操作的插入和更新,并給出錯誤。

換句話講,對于包含執(zhí)行除0操作的表達式的插入和更新,將被當作錯誤對待,但除了嚴格模式外還需要ERROR_FOR_DIVISION_BY_ZERO。

假定下述語句:

INSERT INTO t SET i = 1/0;

對于嚴格模式和ERROR_FOR_DIVISION_BY_ZERO模式的組合,情況如下:

sql_mode

結果

'' (Default)

無告警,無錯誤:i被設置為NULL。

strict

無告警,無錯誤:i被設置為NULL

ERROR_FOR_DIVISION_BY_ZERO

告警,無錯誤:i被設置為NULL

strict,ERROR_FOR_DIVISION_BY_ZERO

錯誤條件,不插入任何行。

將字符串插入數值列時,如果字符串具有非數值內容,將按下述方式將字符串轉換為數值:

·???????? 對于未以數值開始的字符串,在嚴格模式下,不能將其作為數值使用,并會產生錯誤,在其他情況下,給出警告。包括空字符串。

·???????? 對于以數值開始的字符串,可以進行轉換,但尾隨的非數值部分將被截去。在嚴格模式下會導致錯誤,在其他情況下,給出警告。

24.4.?四舍五入

本節(jié)討論了精度數學的四舍五入特性,ROUND()函數,以及插入DECIMAL列時的四舍五入特性。

ROUND()函數的行為取決于其參量是準確的還是近似的:

·???????? 對于準確值數值,ROUND()采用“半值向上舍入”規(guī)則:如果小數部分的值為.5或更大,如果是正數,向上取下一個整數,如果是負數,向下取下一個整數(換句話講,以0為界限執(zhí)行舍入)。如果小數部分的值小于.5,如果是正數,向下取下一個整數,如果是負數,向上取下一個整數。

·???????? 對于近似值數值,結果取決于C庫函數。在很多系統(tǒng)上,它意味著ROUND()將使用舍入至最近的偶數規(guī)則:具有任何小數部分的值均將被舍入為最近的偶數。

在下面的示例中,介紹了舍入操作對準確值和近似值的不同處理方式:

mysql> SELECT ROUND(2.5), ROUND(25E-1);
+------------+--------------+
| ROUND(2.5) | ROUND(25E-1) |
+------------+--------------+
| 3????????? |?????? ?????2 |
+------------+--------------+

對于向DECIMAL列的插入操作,目標是準確的數據類型,無論要插入的值是準確的還是近似的,將采用“半值向上舍入”規(guī)則:

mysql> CREATE TABLE t (d DECIMAL(10,0));
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t VALUES(2.5),(2.5E0);
Query OK, 2 rows affected, 2 warnings (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 2

mysql> SELECT d FROM t;
+------+
| d    |
+------+
| 3    |
| 3    |
+------+

24.5.?精度數學示例

本節(jié)給出了一些示例,介紹了MySQL 5.1中的精度數學查詢結果。

示例1??赡軙r,將使用給定的準確值:

mysql> SELECT .1 + .2 = .3;
+--------------+
| .1 + .2 = .3 |
+--------------+
|??????????? 1 |
+--------------+

但是,對于浮點值,結果是不準確的:

mysql> SELECT .1E0 + .2E0 = .3E0;
+--------------------+
| .1E0 + .2E0 = .3E0 |
+--------------------+
|????????????????? 0 |
+--------------------+

查看準確值和近似值處理差異的另一個方法是,增加1個小的數值,并多次累加。請考慮下述存儲程序,它將.0001加到變量上1000次。

CREATE PROCEDURE p ()
BEGIN
 ?DECLARE i INT DEFAULT 0;
? DECLARE d DECIMAL(10,4) DEFAULT 0;
? DECLARE f FLOAT DEFAULT 0;
? WHILE i < 10000 DO
??? SET d = d + .0001;
??? SET f = f + .0001E0;
? ??SET i = i + 1;
? END WHILE;
? SELECT d, f;
END;

從邏輯上講,df的合計應為1,但僅對decimal計算來說是這樣。浮點計算會引入小的誤差:

+--------+------------------+
| d????? | f??????????????? |
+--------+------------------+
| 1.0000 | 0.99999999999991 |
+--------+------------------+

示例2。乘法是按照標準SQL所要求的標度執(zhí)行。也就是說,對于具有標度S1S2的兩個數值X1X2,結果的標度為S1 + S2

mysql> SELECT .01 * .01;
+-----------+
| .01 * .01 |
+-----------+
| 0.0001??? |
+-----------+

示例3:四舍五入定義良好:

MySQL 5.1中,四舍五入操作(例如,使用ROUND()函數)獨立于底層C庫函數的實施,這意味著,在不同平臺上結果是一致的。

MySQL 5.1中,對于DECIMAL列和準確值數值,采用了半值向上舍入規(guī)則。對于小數部分等于或大于0.5的值,以0為分界舍入至最近的整數,如下所示:

mysql> SELECT ROUND(2.5), ROUND(-2.5);
+------------+-------------+
| ROUND(2.5) | ROUND(-2.5) |
+------------+-------------+
| 3????????? | -3????????? |
+------------+-------------+

但是,對于浮點值的舍入采用C庫,在很多系統(tǒng)上,使用舍入至最近的偶數規(guī)則。在這類系統(tǒng)上,具有任何小數部分的值均將被舍入為最近的偶數:

mysql> SELECT ROUND(2.5E0), ROUND(-2.5E0);
+--------------+---------------+
| ROUND(2.5E0) | ROUND(-2.5E0) |
+--------------+---------------+
|??????????? 2 |??????????? -2 |
+--------------+---------------+

示例4。在嚴格模式下,插入過大的值會導致溢出和錯誤,而不是截短至合法值。

MySQL未運行在嚴格模式下時,將截短至合法值:

mysql> SET SQL_MODE='';
Query OK, 0 rows affected (0.00 sec)
?
mysql> CREATE TABLE t (i TINYINT);
Query OK, 0 rows affected (0.00 sec)
?
mysql> INSERT INTO t SET i = 128;
Query OK, 1 row affected, 1 warning (0.01 sec)
?
mysql> SELECT i FROM t;
+------+
| i??? |
+------+
|? 127 |
+------+
1 row in set (0.00 sec)

但是,如果嚴格模式起作用,將出現溢出狀況:

mysql> SET SQL_MODE='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)
?
mysql> CREATE TABLE t (i TINYINT);
Query OK, 0 rows affected (0.01 sec)
?
mysql> SET sql_mode='STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.10 sec)
?
mysql> INSERT INTO t SET i = 128;
ERROR 1264 (22003): Out of range value adjusted for column 'i' at row 1
?
mysql> SELECT i FROM t;
Empty set (0.00 sec)

示例5。在嚴格模式下并具有ERROR_FOR_DIVISION_BY_ZERO設置時,除0會導致錯誤,而不是產生NULL結果。

在非嚴格模式下,除0將得出NULL結果:

mysql> SET SQL_MODE='';
Query OK, 0 rows affected (0.00 sec)
?
mysql> CREATE TABLE t (i TINYINT);
Query OK, 0 rows affected (0.01 sec)
?
mysql> INSERT INTO t SET i = 1 / 0;
Query OK, 1 row affected (0.06 sec)
?
mysql> SELECT i FROM t;
+------+
| i??? |
+------+
| NULL |
+------+
1 row in set (0.01 sec)

但是,如果恰當的SQL模式處于有效狀態(tài),除0將導致錯誤:

mysql> SET SQL_MODE='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)
?
mysql> CREATE TABLE t (i TINYINT);
Query OK, 0 rows affected (0.00 sec)
?
mysql> SET sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO';
Query OK, 0 rows affected (0.00 sec)
?
mysql> INSERT INTO t SET i = 1 / 0;
ERROR 1365 (22012): Division by 0
?
mysql> SELECT i FROM t;
Empty set (0.01 sec)

示例6。在MySQL 4中(引入精度數學之前),準確值和近似值文字均會被轉換為雙精度浮點值:

mysql> SELECT VERSION();
+-----------------+
| VERSION()?????? |
+-----------------+
| 4.0.25-standard |
+-----------------+
1 row in set (0.00 sec)
?
?
mysql> CREATE TABLE t SELECT 2.5 AS a, 25E-1 AS b;
?
mysql> DESCRIBE t;
+-------+-------------+------+-----+---------+-------+
| Field | Type??????? | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a???? | double(3,1) |????? |???? | 0.0???? |?????? |
| b???? | double????? |????? |???? | 0?????? |?????? |
+-------+-------------+------+-----+---------+-------+

MySQL 5.1中,近似值文字仍會被轉換為浮點值,但準確值文字將被當作DECIMAL處理:

mysql> SELECT VERSION();
+-----------------+
| VERSION()?????? |
+-----------------+
| 5.1.2-alpha-log |
+-----------------+
1 row in set (0.00 sec)
?
mysql> CREATE TABLE t SELECT 2.5 AS a, 25E-1 AS b;
?
mysql> DESCRIBE t;
+-------+--------------+------+-----+---------+-------+
| Field | Type ????????| Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a???? | decimal(2,1) | NO?? |???? | 0.0???? |?????? |
| b???? | double??? ???| NO?? |???? | 0?????? |?????? |
+-------+--------------+------+-----+---------+-------+

示例7。如果聚合函數的參量是準確的數值類型,其結果也是準確的數值類型,標度至少為參量的標度。

考慮下述語句:

mysql> CREATE TABLE t (i INT, d DECIMAL, f FLOAT);
mysql> INSERT INTO t VALUES(1,1,1);
mysql> CREATE TABLE y SELECT AVG(i), AVG(d), AVG(f) FROM t;

MySQL 4.04.1(在MySQL中引入精度數學之前)中的結果:

mysql> DESCRIBE y;
+--------+--------------+------+-----+---------+-------+
| Field? | Type???????? | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| AVG(i) | double(17,4) | YES? |???? | NULL??? |?????? |
| AVG(d) | double(17,4) | YES? |???? | NULL??? |?????? |
| AVG(f) | double?????? | YES? |???? | NULL??? |?????? |
+--------+--------------+------+-----+---------+-------+

無論參量類型是什么,結果為double。

MySQL 5.1中的結果:

mysql> DESCRIBE y;
+--------+---------------+------+-----+---------+-------+
| Field? | Type????????? | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| AVG(i) | decimal(14,4) | YES? |???? | NULL??? |?????? |
| AVG(d) | decimal(14,4) | YES? |???? | NULL??? |?????? |
| AVG(f) | double??????? | YES? |???? | NULL??? |?????? |
+--------+---------------+------+-----+---------+-------+

僅對浮點參量,其結果為double。對于準確類型參量,結果也為準確類型。


這是MySQL參考手冊的翻譯版本,關于MySQL參考手冊,請訪問dev.mysql.com。原始參考手冊為英文版,與英文版參考手冊相比,本翻譯版可能不是最新的。

前の記事: 次の記事: