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

目錄 搜索
目錄 前言 1. 一般信息 1.1. 關于本手冊 1.2. 本手冊采用的慣例 1.3. MySQL AB概述 1.4. MySQL數(shù)據(jù)庫管理系統(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數(shù)據(jù)庫管理系統(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數(shù)據(jù)庫拷貝到另一臺機器 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)建并使用數(shù)據(jù)庫 3.3.1. 創(chuàng)建并選擇數(shù)據(jù)庫 3.3.2. 創(chuàng)建表 3.3.3. 將數(shù)據(jù)裝入表中 3.3.4. 從表檢索信息 3.4. 獲得數(shù)據(jù)庫和表的信息 NoName 3.6. 常用查詢的例子 3.6.1. 列的最大值 3.6.2. 擁有某個列的最大值的行 3.6.3. 列的最大值:按組 3.6.4. 擁有某個字段的組間最大值的行 3.6.5. 使用用戶變量 3.6.6. 使用外鍵 3.6.7. 根據(jù)兩個鍵搜索 3.6.8. 根據(jù)天計算訪問量 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. 數(shù)據(jù)庫管理 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. 數(shù)據(jù)庫備份 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. 數(shù)據(jù)和排序用字符集 5.10.2. 設置錯誤消息語言 5.10.3. 添加新的字符集 5.10.4. 字符定義數(shù)組 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)化數(shù)據(jù)庫結構 7.4.1. 設計選擇 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)計集合 7.4.8. MySQL如何計算打開的表 7.4.9. MySQL如何打開和關閉表 7.4.10. 在同一個數(shù)據(jù)庫中創(chuàng)建多個表的缺陷 7.5. 優(yōu)化MySQL服務器 7.5.1. 系統(tǒng)因素和啟動參數(shù)的調節(jié) 7.5.2. 調節(jié)服務器參數(shù) 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:數(shù)據(jù)庫備份程序 8.9. mysqlhotcopy:數(shù)據(jù)庫備份程序 8.10. mysqlimport:數(shù)據(jù)導入程序 8.11. mysqlshow-顯示數(shù)據(jù)庫、表和列信息 8.12. myisamlog:顯示MyISAM日志文件內容 8.13. perror:解釋錯誤代碼 8.14. replace:字符串替換實用工具 8.15. mysql_zap:殺死符合某一模式的進程 9. 語言結構 9.1. 文字值 9.1.1. 字符串 9.1.2. 數(shù)值 9.1.3. 十六進制值 9.1.4. 布爾值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 數(shù)據(jù)庫、表、索引、列和別名 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. 數(shù)據(jù)庫字符集和校對 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. 用于元數(shù)據(jù)的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. 數(shù)值類型概述 11.1.2. 日期和時間類型概述 11.1.3. 字符串類型概述 11.2. 數(shù)值類型 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. 使用來自其他數(shù)據(jù)庫引擎的列類型 12. 函數(shù)和操作符 12.1. 操作符 12.1.1. 操作符優(yōu)先級 12.1.2. 圓括號 12.1.3. 比較函數(shù)和操作符 12.1.4. 邏輯操作符 12.2. 控制流程函數(shù) 12.3. 字符串函數(shù) 12.3.1. 字符串比較函數(shù) 12.4. 數(shù)值函數(shù) 12.4.1. 算術操作符 12.4.2. 數(shù)學函數(shù) 12.5. 日期和時間函數(shù) 12.6. MySQL使用什么日歷? 12.7. 全文搜索功能 12.7.1. 布爾全文搜索 12.7.2. 全文搜索帶查詢擴展 12.7.3. 全文停止字 12.7.4. 全文限定條件 12.7.5. 微調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語句語法 13.1. 數(shù)據(jù)定義語句 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. 數(shù)據(jù)操作語句 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. 數(shù)據(jù)庫管理語句 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數(shù)據(jù)庫服務器層 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數(shù)據(jù)和日志文件 15.2.8. InnoDB數(shù)據(jù)庫的備份和恢復 15.2.9. 將InnoDB數(shù)據(jù)庫移到另一臺機器上 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表時可能出現(xiàn)的錯誤 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()函數(shù) 16.9.2. 實施external_lock()函數(shù) 16.9.3. 實施rnd_init()函數(shù) 16.9.4. 實施info()函數(shù) 16.9.5. 實施extra()函數(shù) 16.9.6. 實施rnd_next()函數(shù) 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. 加載示例數(shù)據(jù)并執(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. 支持的空間數(shù)據(jù)格式 19.3.1. 著名的文本(WKT)格式 19.3.2. 著名的二進制(WKB)格式 19.4. 創(chuàng)建具備空間功能的MySQL數(shù)據(jù)庫 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格式轉換函數(shù) 19.5.2. Geometry函數(shù) 19.5.3. 從已有Geometry創(chuàng)建新Geometry的函數(shù) 19.5.4. 測試幾何對象間空間關系的函數(shù) 19.5.5. 關于幾何最小邊界矩形(MBR)的關系 19.5.6. 測試幾何類之間空間關系的函數(shù) 19.6. 優(yōu)化空間分析 19.6.1. 創(chuàng)建空間索引 19.6.2. 使用空間索引 19.7. MySQL的一致性和兼容性 19.7.1. 尚未實施的GIS特性 20. 存儲程序和函數(shù) 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. 存儲程序、函數(shù)、觸發(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信息數(shù)據(jù)庫 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ù)學 24.1. 數(shù)值的類型 24.2. DECIMAL數(shù)據(jù)類型更改 24.3. 表達式處理 24.4. 四舍五入 24.5. 精度數(shù)學示例 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數(shù)據(jù)類型 25.2.2. C API函數(shù)概述 25.2.3. C API函數(shù)描述 25.2.4. C API預處理語句 25.2.5. C API預處理語句的數(shù)據(jù)類型 25.2.6. C API預處理語句函數(shù)概述 25.2.7. C API預處理語句函數(shù)描述 25.2.8. C API預處理語句方面的問題 25.2.9. 多查詢執(zhí)行的C API處理 25.2.10. 日期和時間值的C API處理 25.2.11. C API線程函數(shù)介紹 25.2.12. C API嵌入式服務器函數(shù)介紹 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數(shù)據(jù)類型 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添加新函數(shù) 27.2.1. 自定義函數(shù)接口的特性 27.2.2. CREATE FUNCTION/DROP FUNCTION語法 27.2.3. 添加新的自定義函數(shù) 27.2.4. 添加新的固有函數(shù) 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. 輸入密碼時出現(xiàn)密碼錯誤 NoName A.2.6. 連接數(shù)過多 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. 如果出現(xiàn)表崩潰,請生成測試案例 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許可例外 索引
文字

第11章:列類型

目錄

11.1. 列類型概述
11.1.1. 數(shù)值類型概述
11.1.2. 日期和時間類型概述
11.1.3. 字符串類型概述
11.2. 數(shù)值類型
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. 使用來自其他數(shù)據(jù)庫引擎的列類型

MySQL支持多種列類型:數(shù)值類型、日期/時間類型和字符串(字符)類型。本章首先對這些列類型進行了概述,然后更加詳細地描述了各種列的類型,以及列類型存儲需求的總結。概述很簡單。關于具體列類型的詳細信息應查閱詳細的描述,例如指定值時允許使用的格式。

MySQL支持處理空間數(shù)據(jù)的擴展名。關于空間類型的信息參見第19章:MySQL中的空間擴展。

幾種列類型描述使用了下述慣例:

·???????? M

表示最大顯示寬度。最大有效顯示寬度是255。

·???????? D

適用于浮點和定點類型,并表示小數(shù)點后面的位數(shù)。最大可能的值是30,但不應大于M-2。

·???????? 方括號([’和‘])表示可選部分。

11.1.?列類型概述

11.1.1. 數(shù)值類型概述
11.1.2. 日期和時間類型概述
11.1.3. 字符串類型概述

11.1.1.?數(shù)值類型概述

下面為數(shù)值列類型的概述。詳細信息參見11.2節(jié),“數(shù)值類型”。列存儲需求參見11.5節(jié),“列類型存儲需求”。

M指示最大顯示寬度。最大有效顯示寬度是255。顯示寬度與存儲大小或類型包含的值的范圍無關,相關描述見11.2節(jié),“數(shù)值類型”。

如果為一個數(shù)值列指定ZEROFILL,MySQL自動為該列添加UNSIGNED屬性。

SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一個別名。

在整數(shù)列定義中,SERIAL DEFAULT VALUENOT NULL AUTO_INCREMENT UNIQUE的一個別名。

警告:應當清楚,當使用在整數(shù)值(其中一個是UNSIGNED類型)之間使用減號時,結果是無符號。參見12.8節(jié),“Cast函數(shù)和操作符”。

·???????? BIT[(M)]

位字段類型。M表示每個值的位數(shù),范圍為從164。如果M被省略, 默認為1。

·???????? TINYINT[(M)] [UNSIGNED] [ZEROFILL]

很小的整數(shù)。帶符號的范圍是-128127。無符號的范圍是0255

·???????? BOOL,BOOLEAN

TINYINT(1)的同義詞。zero值被視為假。非zero值視為真。

在將來,將根據(jù)標準SQL引入完全布爾類型的處理。

·???????? SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

小的整數(shù)。帶符號的范圍是-3276832767。無符號的范圍是065535。

·???????? MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

中等大小的整數(shù)。帶符號的范圍是-83886088388607。無符號的范圍是016777215。

·???????? INT[(M)] [UNSIGNED] [ZEROFILL]

普通大小的整數(shù)。帶符號的范圍是-21474836482147483647。無符號的范圍是04294967295

·???????? INTEGER[(M)] [UNSIGNED] [ZEROFILL]

這是INT的同義詞。

·???????? BIGINT[(M)] [UNSIGNED] [ZEROFILL]

大整數(shù)。帶符號的范圍是-92233720368547758089223372036854775807。無符號的范圍是018446744073709551615。

應清楚BIGINT列的下述內容:

o??????? 使用帶符號的BIGINTDOUBLE值進行所有算法,因此除了位函數(shù),不應使用大于9223372036854775807(63)的無符號的大整數(shù)! 如果這樣做,結果中的最后幾位可能出錯,這是由于將BIGINT值轉換為DOUBLE進行四舍五入時造成的錯誤。

MySQL可以在以下情況下處理BIGINT

§???????? 當使用整數(shù)在一個BIGINT列保存大的無符號的值時。

§???????? MIN(col_name)MAX(col_name)中,其中col_nameBIGINT列。

§???????? 使用操作符(+-,*等等)并且兩個操作數(shù)均為整數(shù)時。

o??????? 總是可以使用一個字符串在BIGINT列中保存嚴格整數(shù)值。在這種情況下,MySQL執(zhí)行字符串-數(shù)字轉換,其間不存在雙精度表示。

o??????? 當兩個操作數(shù)均為整數(shù)值時,-、+* 操作符使用BIGINT算法。這說明如果乘兩個大整數(shù)(或來自返回整數(shù)的函數(shù)),當結果大于9223372036854775807時,會得到意想不到的結果。

·???????? FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

(單精度)浮點數(shù)。允許的值是-3.402823466E+38-1.175494351E-3801.175494351E-383.402823466E+38。這些是理論限制,基于IEEE標準。實際的范圍根據(jù)硬件或操作系統(tǒng)的不同可能稍微小些。

M是小數(shù)縱位數(shù),D是小數(shù)點后面的位數(shù)。如果MD被省略,根據(jù)硬件允許的限制來保存值。單精度浮點數(shù)精確到大約7位小數(shù)位。

如果指定UNSIGNED,不允許負值。

使用浮點數(shù)可能會遇到意想不到的問題,因為在MySQL中的所有計算用雙精度完成。參見A.5.7節(jié),“解決與不匹配行有關的問題”。

·???????? DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

普通大小(雙精度)浮點數(shù)。允許的值是-1.7976931348623157E+308-2.2250738585072014E-308、02.2250738585072014E-3081.7976931348623157E+308。這些是理論限制,基于IEEE標準。實際的范圍根據(jù)硬件或操作系統(tǒng)的不同可能稍微小些。

M是小數(shù)總位數(shù),D是小數(shù)點后面的位數(shù)。如果MD被省略,根據(jù)硬件允許的限制來保存值。雙精度浮點數(shù)精確到大約15位小數(shù)位。

如果指定UNSIGNED,不允許負值。

·???????? DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]

DOUBLE的同義詞。除了:如果SQL服務器模式包括REAL_AS_FLOAT選項,REALFLOAT的同義詞而不是DOUBLE的同義詞。

·???????? FLOAT(p) [UNSIGNED] [ZEROFILL]

浮點數(shù)。p表示精度(以位數(shù)表示),但MySQL只使用該值來確定是否結果列的數(shù)據(jù)類型為FLOATDOUBLE。如果p為從024,數(shù)據(jù)類型變?yōu)闆]有MD值的FLOAT。如果p為從2553,數(shù)據(jù)類型變?yōu)闆]有MD值的DOUBLE。結果列范圍與本節(jié)前面描述的單精度FLOAT或雙精度DOUBLE數(shù)據(jù)類型相同。

FLOAT(p)語法與ODBC兼容。

·???????? DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

壓縮的“嚴格”定點數(shù)。M是小數(shù)位數(shù)(精度)的總數(shù),D是小數(shù)點(標度)后面的位數(shù)。小數(shù)點和(負數(shù))的‘-’符號不包括在M中。如果D0,則值沒有小數(shù)點或分數(shù)部分。DECIMAL整數(shù)最大位數(shù)(M)65。支持的十進制數(shù)的最大位數(shù)(D)30。如果D被省略, 默認是0。如果M被省略, 默認是10。

如果指定UNSIGNED,不允許負值。

所有DECIMAL列的基本計算(+-,*/)65位精度完成。

·???????? DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]

DECIMAL的同義詞。FIXED同義詞適用于與其它服務器的兼容性。

11.1.2.?日期和時間類型概述

本節(jié)綜合討論了臨時列類型。詳細信息,參見11.3節(jié),“日期和時間類型”。列存儲需求參見11.5節(jié),“列類型存儲需求”。

·???????? DATE

日期。支持的范圍為'1000-01-01''9999-12-31'。MySQL'YYYY-MM-DD'格式顯示DATE值,但允許使用字符串或數(shù)字為DATE列分配值。

·???????? DATETIME

日期和時間的組合。支持的范圍是'1000-01-01 00:00:00''9999-12-31 23:59:59'。MySQL'YYYY-MM-DD HH:MM:SS'格式顯示DATETIME值,但允許使用字符串或數(shù)字為DATETIME列分配值。

·???????? TIMESTAMP[(M)]

時間戳。范圍是'1970-01-01 00:00:00'2037年。

TIMESTAMP列用于INSERTUPDATE操作時記錄日期和時間。如果你不分配一個值,表中的第一個TIMESTAMP列自動設置為最近操作的日期和時間。也可以通過分配一個NULL值,將TIMESTAMP列設置為當前的日期和時間。

TIMESTAMP值返回后顯示為'YYYY-MM-DD HH:MM:SS'格式的字符串,顯示寬度固定為19個字符。如果想要獲得數(shù)字值,應在TIMESTAMP 列添加+0

注釋:MySQL 4.1以前使用的TIMESTAMP格式在MySQL 5.1中不支持;關于舊格式的信息參見MySQL 4.1 參考手冊

·???????? TIME

時間。范圍是'-838:59:59''838:59:59'MySQL'HH:MM:SS'格式顯示TIME值,但允許使用字符串或數(shù)字為TIME列分配值。

·???????? YEAR[(2|4)]

兩位或四位格式的年。默認是四位格式。在四位格式中,允許的值是190121550000。在兩位格式中,允許的值是7069,表示從1970年到2069年。MySQLYYYY 格式顯示YEAR值,但允許使用字符串或數(shù)字為YEAR列分配值。

11.1.3.?字符串類型概述

本節(jié)綜合討論了字符串列類型。詳細信息參見11.4節(jié),“String類型”。列存儲需求參見11.5節(jié),“列類型存儲需求”。

在某些情況中,MySQL可以將一個字符串列更改為不同于CREATE TABLEALTER TABLE語句中所給出的類型。參見13.1.5.1節(jié),“沉寂的列規(guī)格變更”。

MySQL 5.1字符串數(shù)據(jù)類型包括部分在MySQL 4.1之前的版本中沒有的特性:

·???????? 許多字符串數(shù)據(jù)類型的列定義可以包括指定字符集的CHARACTER SET屬性,也可能包括校對規(guī)則。(CHARSETCHARACTER SET的一個同義詞)。這些屬性適用于CHAR、VARCHARTEXT類型、ENUMSET。例如:

·??????????????? CREATE TABLE t
·??????????????? (
·??????????????? ????c1 CHAR(20) CHARACTER SET utf8,
·??????????????? ????c2 CHAR(20) CHARACTER SET latin1 COLLATE latin1_bin
·??????????????? );

該表定義創(chuàng)建了一個名為c1的列,具有一個utf8字符集和該字符集的默認 校對規(guī)則,和一個名為c2的列以及latin1字符集和該字符集的二元 校對規(guī)則。二元校對規(guī)則對大小寫不敏感。

·???????? MySQL 5.1用字符單位解釋在字符列定義中的長度規(guī)范。(以前的一些MySQL版本以字節(jié)解釋長度)。

·???????? 對于CHAR、VARCHARTEXT類型,BINARY屬性可以為列分配該列字符集的 校對規(guī)則。

·???????? 字符列的排序和比較基于分配給列的字符集。在以前的版本中,排序和比較基于服務器字符集的校對規(guī)則。對于CHARVARCHAR 列,你可以用BINARY屬性聲明列讓排序和 校對規(guī)則使用當前的字符代碼值而不是詞匯順序。

關于MySQL 5.1中字符集的支持,參見第10章:字符集支持

·???????? [NATIONAL] CHAR(M) [BINARY| ASCII | UNICODE]

固定長度字符串,當保存時在右側填充空格以達到指定的長度。M表示列長度。M的范圍是0255個字符。

注釋:當檢索CHAR值時尾部空格被刪除。

如果想要將某個CHAR的長度設為大于255,執(zhí)行的CREATE TABLEALTER TABLE語句將失敗并提示錯誤:

mysql> CREATE TABLE c1 (col1 INT, col2 CHAR(500));
ERROR 1074 (42000): Column length too big for column 'col' (max = 255); use BLOB or TEXT instead
mysql> SHOW CREATE TABLE c1;
ERROR 1146 (42S02): Table 'test.c1' doesn't exist

CHARCHARACTER的簡寫。NATIONAL CHAR(或其等效短形式NCHAR)是標準的定義CHAR列應使用 默認字符集的SQL方法。這在MySQL中為默認值。

BINARY屬性是指定列字符集的二元 校對規(guī)則的簡寫。排序和比較基于數(shù)值字符值。

列類型CHAR BYTECHAR BINARY的一個別名。這是為了保證兼容性。

可以為CHAR指定ASCII屬性。它分配latin1字符集。

可以為CHAR指定UNICODE屬性。它分配ucs2字符集。

MySQL允許創(chuàng)建類型CHAR(0)的列。這主要用于必須有一個列但實際上不使用值的舊版本的應用程序相兼容。當你需要只能取兩個值的列時也很好:沒有定義為NOT NULL的一個CHAR(0)列只占用一位,只可以取值NULL''(空字符串)。

·???????? CHAR

這是CHAR(1)的同義詞。

·???????? [NATIONAL] VARCHAR(M) [BINARY]

變長字符串。M 表示最大列長度。M的范圍是065,535。(VARCHAR的最大實際長度由最長的行的大小和使用的字符集確定。最大有效長度是65,532字節(jié))。

注釋:MySQL 5.1遵從標準SQL規(guī)范,并且不刪除VARCHAR值的尾部空格。

VARCHAR是字符VARYING的簡寫。

BINARY屬性是指定列的字符集的二元 校對規(guī)則的簡寫。排序和比較基于數(shù)值字符值。

VARCHAR保存時用一個字節(jié)或兩個字節(jié)長的前綴+數(shù)據(jù)。如果VARCHAR列聲明的長度大于255,長度前綴是兩個字節(jié)。

·???????? BINARY(M)

BINARY類型類似于CHAR類型,但保存二進制字節(jié)字符串而不是非二進制字符串。

·???????? VARBINARY(M)

VARBINARY類型類似于VARCHAR類型,但保存二進制字節(jié)字符串而不是非二進制字符串。

·???????? TINYBLOB

最大長度為255(281)字節(jié)的BLOB列。

·???????? TINYTEXT

最大長度為255(281)字符的TEXT列。

·???????? BLOB[(M)]

最大長度為65,535(2161)字節(jié)的BLOB列。

可以給出該類型的可選長度M。如果給出,則MySQL將列創(chuàng)建為最小的但足以容納M字節(jié)長的值的BLOB類型。

·???????? TEXT[(M)]

最大長度為65,535(2161)字符的TEXT列。

可以給出可選長度M。則MySQL將列創(chuàng)建為最小的但足以容納M字符長的值的TEXT類型。

·???????? MEDIUMBLOB

最大長度為16,777,215(2241)字節(jié)的BLOB列。

·???????? MEDIUMTEXT

最大長度為16,777,215(2241)字符的TEXT列。

·???????? LONGBLOB

最大長度為4,294,967,2954GB(2321)字節(jié)的BLOB列。LONGBLOB列的最大有效(允許的)長度取決于客戶端/服務器協(xié)議中配置最大包大小和可用的內存。

·???????? LONGTEXT

最大長度為4,294,967,2954GB(2321)字符的TEXT列。LONGTEXT列的最大有效(允許的)長度取決于客戶端/服務器協(xié)議中配置最大包大小和可用的內存。

·???????? ENUM('value1','value2',...)

枚舉類型。只能有一個值的字符串,從值列'value1','value2',...,NULL中或特殊 ''錯誤值中選出。ENUM列最多可以有65,535個截然不同的值。ENUM值在內部用整數(shù)表示。

·???????? SET('value1','value2',...)

一個設置。字符串對象可以有零個或多個值,每個值必須來自列值'value1','value2',...SET列最多可以有64個成員。SET值在內部用整數(shù)表示。

11.2.?數(shù)值類型

MySQL支持所有標準SQL數(shù)值數(shù)據(jù)類型。這些類型包括嚴格數(shù)值數(shù)據(jù)類型(INTEGER、SMALLINT、DECIMALNUMERIC),以及近似數(shù)值數(shù)據(jù)類型(FLOAT、REALDOUBLE PRECISION)。關鍵字INTINTEGER的同義詞,關鍵字DECDECIMAL的同義詞。

BIT數(shù)據(jù)類型保存位字段值,并且支持MyISAM、MEMORY、InnoDBBDB表。

作為SQL標準的擴展,MySQL也支持整數(shù)類型TINYINTMEDIUMINTBIGINT。下面的表顯示了需要的每個整數(shù)類型的存儲和范圍。

類型

字節(jié)

最小值

最大值

?

?

(帶符號的/無符號的)

(帶符號的/無符號的)

TINYINT

1

-128

127

?

?

0

255

SMALLINT

2

-32768

32767

?

?

0

65535

MEDIUMINT

3

-8388608

8388607

?

?

0

16777215

INT

4

-2147483648

2147483647

?

?

0

4294967295

BIGINT

8

-9223372036854775808

9223372036854775807

?

?

0

18446744073709551615

MySQL還支持選擇在該類型關鍵字后面的括號內指定整數(shù)值的顯示寬度(例如,INT(4))。該可選顯示寬度規(guī)定用于顯示寬度小于指定的列寬度的值時從左側填滿寬度。

顯示寬度并不限制可以在列內保存的值的范圍,也不限制超過列的指定寬度的值的顯示。

當結合可選擴展屬性ZEROFILL使用時, 默認補充的空格用零代替。例如,對于聲明為INT(5) ZEROFILL的列,值4檢索為00004。請注意如果在整數(shù)列保存超過顯示寬度的一個值,當MySQL為復雜聯(lián)接生成臨時表時會遇到問題,因為在這些情況下MySQL相信數(shù)據(jù)適合原列寬度。

所有整數(shù)類型可以有一個可選(非標準)屬性UNSIGNED。當你想要在列內只允許非負數(shù)和該列需要較大的上限數(shù)值范圍時可以使用無符號值。

浮點和定點類型也可以為UNSIGNED。同數(shù)類型,該屬性防止負值保存到列中。然而,與整數(shù)類型不同的是,列值的上范圍保持不變。

如果為一個數(shù)值列指定ZEROFILL,MySQL自動為該列添加UNSIGNED屬性。

對于浮點列類型,在MySQL中單精度值使用4個字節(jié),雙精度值使用8個字節(jié)。

FLOAT類型用于表示近似數(shù)值數(shù)據(jù)類型。SQL標準允許在關鍵字FLOAT后面的括號內選擇用位指定精度(但不能為指數(shù)范圍)。MySQL還支持可選的只用于確定存儲大小的精度規(guī)定。023的精度對應FLOAT列的4字節(jié)單精度。2453的精度對應DOUBLE列的8字節(jié)雙精度。

MySQL允許使用非標準語法:FLOAT(M,D)REAL(M,D)DOUBLE PRECISION(M,D)。這里,“(M,D)”表示該值一共顯示M位整數(shù),其中D位位于小數(shù)點后面。例如,定義為FLOAT(7,4)的一個列可以顯示為-999.9999。MySQL保存值時進行四舍五入,因此如果在FLOAT(7,4)列內插入999.00009,近似結果是999.0001。

MySQLDOUBLE視為DOUBLE PRECISION(非標準擴展)的同義詞。MySQL還將REAL視為DOUBLE PRECISION(非標準擴展)的同義詞,除非SQL服務器模式包括REAL_AS_FLOAT選項。

為了保證最大可能的可移植性,需要使用近似數(shù)值數(shù)據(jù)值存儲的代碼應使用FLOATDOUBLE PRECISION,不規(guī)定精度或位數(shù)。

DECIMALNUMERIC類型在MySQL中視為相同的類型。它們用于保存必須為確切精度的值,例如貨幣數(shù)據(jù)。當聲明該類型的列時,可以(并且通常要)指定精度和標度;例如:

salary DECIMAL(5,2)

在該例子中,5是精度,2是標度。精度表示保存值的主要位數(shù),標度表示小數(shù)點后面可以保存的位數(shù)。

MySQL 5.1中以二進制格式保存DECIMALNUMERIC值。

標準SQL要求salary列能夠用5位整數(shù)位和兩位小數(shù)保存任何值。因此,在這種情況下可以保存在salary列的值的范圍是從-999.99999.99。

在標準SQL中,語法DECIMAL(M)等價于DECIMAL(M,0)。同樣,語法DECIMAL等價于DECIMAL(M,0),可以通過計算確定M的值。在MySQL 5.1中支持DECIMALNUMERIC數(shù)據(jù)類型的變量形式。M默認值是10。

DECIMALNUMERIC的最大位數(shù)是65,但具體的DECIMALNUMERIC列的實際范圍受具體列的精度或標度約束。如果此類列分配的值小數(shù)點后面的位數(shù)超過指定的標度允許的范圍,值被轉換為該標度。(具體操作與操作系統(tǒng)有關,但一般結果均被截取到允許的位數(shù))

BIT數(shù)據(jù)類型可用來保存位字段值。BIT(M)類型允許存儲M位值。M范圍為164。

要指定位值,可以使用b'value'符。value是一個用01編寫的二進制值。例如,b'111'b'100000000'分別表示7128。參見9.1.5節(jié),“位字段值”。

如果為BIT(M)列分配的值的長度小于M位,在值的左邊用0填充。例如,為BIT(6)列分配一個值b'101',其效果與分配b'000101'相同。

當要在一個數(shù)值列內保存一個超出該列允許范圍的值時,MySQL的操作取決于此時有效的SQL模式。如果模式未設置,MySQL將值裁剪到范圍的相應端點,并保存裁減好的值。但是,如果模式設置為traditional(“嚴格模式),超出范圍的值將被拒絕并提示錯誤,并且根據(jù)SQL標準插入會失敗。參見5.3.2節(jié),“SQL服務器模式”。

如果INT列是UNSIGNED,列范圍的大小相同,但其端點會變?yōu)榈?span>0和4294967295。如果你試圖保存-99999999999999999999,以非嚴格模式保存到列中的值是04294967296。

如果在浮點或定點列中分配的值超過指定(或默認)精度和標度規(guī)定的范圍,MySQL以非嚴格模式保存表示范圍相應端點的值。

MySQL沒有工作在嚴格模式時,對于ALTER TABLE、LOAD DATA INFILE、UPDATE和多行INSERT語句,由于裁剪發(fā)生的轉換將報告為警告。當MySQL工作在嚴格模式時,這些語句將失敗,并且部分或全部值不會插入或更改,取決于是否表為事務表和其它因素。詳情參見5.3.2節(jié),“SQL服務器模式”。

11.3.?日期和時間類型

11.3.1. DATETIME、DATE和TIMESTAMP類型
11.3.2. TIME類型
11.3.3. YEAR類型
11.3.4. Y2K事宜和日期類型

表示時間值的DATE和時間類型為DATETIME、DATE、TIMESTAMP、TIMEYEAR。每個時間類型有一個有效值范圍和一個“”值,當指定不合法的MySQL不能表示的值時使用“”值。TIMESTAMP類型有專有的自動更新特性,將在后面描述。

如果試圖插入一個不合法的日期,MySQL將給出警告或錯誤??梢允褂?span>ALLOW_INVALID_DATES SQL模式讓MySQL接受某些日期,例如'1999-11-31'。當你想要保存一個“可能錯誤的”用戶已經在數(shù)據(jù)庫中指定(例如,以web形式)用于將來處理的值時很有用。在這種模式下,MySQL只驗證月范圍為從012,日范圍為從031。這些范圍可以包括零,因為MySQL允許在DATEDATETIME列保存日/月和日是零的日期。這在應用程序需要保存一個你不知道確切日期的生日時非常有用。在這種情況下,只需要將日期保存為'1999-00-00''1999-01-00'。如果保存此類日期,DATE_SUB()DATE_ADD等需要完整日期的函數(shù)不會得到正確的結果。(如果你不想在日期中出現(xiàn)零,可以使用NO_ZERO_IN_DATE SQL模式)。

MySQL還允許將'0000-00-00'保存為“偽日期”(如果不使用NO_ZERO_DATE SQL模式)。這在某些情況下比使用NULL值更方便(并且數(shù)據(jù)和索引占用的空間更小)。

sql_mode系統(tǒng)變量設置為相應模式值,可以更確切你想讓MySQL支持哪種日期。參見5.3.2節(jié),“SQL服務器模式”。

當使用日期和時間類型時應記住以下幾點:

·???????? MySQL以標準輸出格式檢索給定日期或時間類型的值,但它盡力解釋你指定的各種輸入值格式(例如,當你指定一個分配給或與日期或時間類型進行比較的值時)。只支持下面章節(jié)中描述的格式。期望你能提供有效值。如果你使用其它格式的值會發(fā)生意想不到的結果。

·???????? 包含兩位年值的日期會令人模糊,因為世紀不知道。MySQL使用以下規(guī)則解釋兩位年值:

o??????? 70-99范圍的年值轉換為1970-1999。

o??????? 00-69范圍的年值轉換為2000-2069。

·???????? 盡管MySQL嘗試解釋幾種格式的值,日期總是以年--日順序(例如,'98-09-04'),而不是其它地方常用的月--年或日--年順序(例如,'09-04-98''04-09-98')。

·???????? 如果值用于數(shù)值上下文中,MySQL自動將日期或時間類型的值轉換為數(shù)字,反之亦然。

·???????? MySQL遇到一個日期或時間類型的超出范圍或對于該類型不合法的值時(如本節(jié)開始所描述),它將該值轉換為該類的“”值。一個例外是超出范圍的TIME值被裁剪到TIME范圍的相應端點。

下面的表顯示了各類“”值的格式。請注意如果啟用NO_ZERO_DATE SQL模式,使用這些值會產生警告。

列類型

”值

DATETIME

'0000-00-00 00:00:00'

DATE

'0000-00-00'

TIMESTAMP

00000000000000

TIME

'00:00:00'

YEAR

0000

·???????? ”值是特殊值,但你可以使用表內顯示的值顯式保存或引用它們。你也可以使用值'0'0來保存或引用,寫起來更容易。

·???????? MyODBC中使用的“”日期或時間值在MyODBC 2.50.12和以上版本中被自動轉換為NULL,因為ODBC不能處理此類值。

11.3.1.?DATETIME、DATE和TIMESTAMP類型

11.3.1.1. 自MySQL 4.1以來的TIMESTAMP屬性

DATETIMEDATETIMESTAMP類型是相關的。該節(jié)描述了它們的特征,它們的相似點和不同點。

當你需要同時包含日期和時間信息的值時則使用DATETIME類型。MySQL'YYYY-MM-DD HH:MM:SS'格式檢索和顯示DATETIME值。支持的范圍為'1000-01-01 00:00:00''9999-12-31 23:59:59'(支持”表示盡管先前的值可能工作,但沒有保證)

當你只需要日期值而不需要時間部分時應使用DATE類型。MySQL'YYYY-MM-DD'格式檢索和顯示DATE值。支持的范圍是'1000-01-01''9999-12-31'。

TIMESTAMP列類型的屬性不固定,取決于MySQL版本和服務器運行的SQL模式。這些屬性將在本節(jié)后面描述。

可以使用任何常見格式指定DATETIME、DATETIMESTAMP值:

·???????? 'YYYY-MM-DD HH:MM:SS''YY-MM-DD HH:MM:SS'格式的字符串。允許“不嚴格”語法:任何標點符都可以用做日期部分或時間部分之間的間割符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45''98@12@31 11^30^45'是等價的。

·???????? 'YYYY-MM-DD''YY-MM-DD'格式的字符串。這里也允許使用“不嚴格的”語法。例如,'98-12-31'、'98.12.31''98/12/31''98@12@31'是等價的。

·???????? 'YYYYMMDDHHMMSS''YYMMDDHHMMSS'格式的沒有間割符的字符串,假定字符串對于日期類型是有意義的。例如,'19970523091528''970523091528'被解釋為'1997-05-23 09:15:28',但'971122129015'是不合法的(它有一個沒有意義的分鐘部分),將變?yōu)?span>'0000-00-00 00:00:00'。

·???????? 'YYYYMMDD''YYMMDD'格式的沒有間割符的字符串,假定字符串對于日期類型是有意義的。例如,'19970523''970523'被解釋為 '1997-05-23',但'971332'是不合法的(它有一個沒有意義的月和日部分),將變?yōu)?span>'0000-00-00'。

·???????? YYYYMMDDHHMMSSYYMMDDHHMMSS格式的數(shù)字,假定數(shù)字對于日期類型是有意義的。例如,19830905132800830905132800被解釋為 '1983-09-05 13:28:00'

·???????? YYYYMMDDYYMMDD格式的數(shù)字,假定數(shù)字對于日期類型是有意義的。例如,19830905830905被解釋為'1983-09-05'。

·???????? 函數(shù)返回的結果,其值適合DATETIME、DATE或者TIMESTAMP上下文,例如NOW()CURRENT_DATE。

無效DATETIME、DATE或者TIMESTAMP值被轉換為相應類型的“”值('0000-00-00 00:00:00'、'0000-00-00'或者00000000000000)。

對于包括日期部分間割符的字符串值,如果日和月的值小于10,不需要指定兩位數(shù)。'1979-6-9''1979-06-09'是相同的。同樣,對于包括時間部分間割符的字符串值,如果時、分和秒的值小于10,不需要指定兩位數(shù)。'1979-10-30 1:2:3''1979-10-30 01:02:03'相同。

數(shù)字值應為6、8、12或者14位長。如果一個數(shù)值是814位長,則假定為YYYYMMDDYYYYMMDDHHMMSS格式,前4位數(shù)表示年。如果數(shù)字 是612位長,則假定為YYMMDDYYMMDDHHMMSS格式,前2位數(shù)表示年。其它數(shù)字被解釋為仿佛用零填充到了最近的長度。

指定為非限定符字符串的值使用給定的長度進行解釋。如果字符串為814字符長,前4位數(shù)表示年。否則,前2位數(shù)表示年。從左向右解釋字符串內出現(xiàn)的各部分,以發(fā)現(xiàn)年、月、日、小時、分和秒值。這說明不應使用少于6字符的字符串。例如,如果你指定'9903',認為它表示19993月,MySQL將在你的表內插入一個“”日期值。這是因為年和月值是9903,但日部分完全丟失,因此該值不是一個合法的日期。但是,可以明顯指定一個零值來代表缺少的月或日部分。例如,可以使用'990300'來插入值'1999-03-00'。

在一定程度上,可以將一個日期類型的值分配給一個不同的日期類型。但是,值可能會更改或丟失一些信息:

·???????? 如果你為一個DATETIMETIMESTAMP對象分配一個DATE值,結果值的時間部分被設置為'00:00:00',因為DATE值未包含時間信息。

·???????? 如果你為一個DATE對象分配一個DATETIMETIMESTAMP值,結果值的時間部分被刪除,因為DATE值未包含時間信息。

·???????? 記住盡管可以使用相同的格式指定DATETIME、DATETIMESTAMP值,不同類型的值的范圍卻不同。例如,TIMESTAMP值不能早于1970或晚于2037。這說明一個日期,例如'1968-01-01',雖然對于DATETIMEDATE值是有效的,但對于TIMESTAMP值卻無效,如果分配給這樣一個對象將被轉換為0

當指定日期值時請注意某些缺陷:

·???????? 指定為字符串的值允許的非嚴格格式可能會欺騙。例如,值'10:11:12'由于‘:’間割符看上去可能象時間值,但如果用于日期上下文值則被解釋為年'2010-11-12'。值'10:45:15'被轉換為'0000-00-00'因為'45'不是合法月。

·???????? 在非嚴格模式,MySQL服務器只對日期的合法性進行基本檢查:年、月和日的范圍分別是10009999、00120031。任何包含超出這些范圍的部分的日期被轉換成'0000-00-00'。請注意仍然允許你保存非法日期,例如'2002-04-31'。要想確保不使用嚴格模式時日期有效,應檢查應用程序。

在嚴格模式,非法日期不被接受,并且不轉換。

詳細信息參見5.3.2節(jié),“SQL服務器模式”。

·???????? 包含兩位年值的日期會令人模糊,因為世紀不知道。MySQL使用以下規(guī)則解釋兩位年值:

o??????? 00-69范圍的年值轉換為2000-2069。

o??????? 70-99范圍的年值轉換為1970-1999。

11.3.1.1.?自MySQL 4.1以來的TIMESTAMP屬性

注釋:舊版本的MySQL(4.1之前),TIMESTAMP列類型的屬性在許多方面于本節(jié)所描述的大大不同。如果你需要對舊的TIMESTAMP數(shù)據(jù)進行轉化以便在MySQL 5.1中工作,詳情請參見MySQL 4.1 參考手冊。

TIMESTAMP列的顯示格式與DATETIME列相同。換句話說,顯示寬度固定在19字符,并且格式為YYYY-MM-DD HH:MM:SS。

MySQL服務器也可以以MAXDB模式運行。當服務器以該模式運行時,TIMESTAMPDATETIME相等。也就是說,如果創(chuàng)建表時服務器以MAXDB模式運行,TIMESTAMP列創(chuàng)建為DATETIME列。結果是,該列使用DATETIME顯示格式,有相同的值范圍,并且沒有自動對當前的日期和時間進行初始化或更新。

要想啟用MAXDB模式,在啟動服務器時使用--sql-mode=MAXDB服務器選項或在運行時通過設置全局sql_mode變量將SQL服務器模式設置為MAXDB

mysql> SET GLOBAL sql_mode=MAXDB;

客戶端可以按照下面方法讓服務器為它的連接以MAXDB模式運行:

mysql> SET SESSION sql_mode=MAXDB;

?

MySQL不接受在日或月列包括一個零或包含非法日期值的時間戳值。該規(guī)則的唯一例外是特殊值'0000-00-00 00:00:00'。

你可以非常靈便地確定什么時候初始化和更新TIMESTAMP和對哪些列進行初始化和更新:

·???????? 你可以將當前的時間戳指定為默認值和自動更新的值。但只能選擇一個,或者兩者都不選。(不可能一個列選擇一個行為而另一個列選擇另一個行為)

·???????? 你可以指定哪個TIMESTAMP列自動初始化或更新為當前的日期和時間。不再需要為第1TIMESTAMP列。

請注意下面討論所信息只適用于創(chuàng)建時未啟用MAXDB模式的表的TIMESTAMP列。(如上所述,MAXDB模式使列創(chuàng)建為DATETIME列)。控制TIMESTAMP列的初始化和更新的規(guī)則如下所示:

·???????? 如果一個表內的第1TIMESTAMP列指定為一個DEFAULT值,則不能忽略。 默認值可以為CURRENT_TIMESTAMP或常量日期和時間值。

·???????? DEFAULT NULL與第1TIMESTAMP 列的DEFAULT CURRENT_TIMESTAMP相同。對于其它TIMESTAMP列,DEFAULT NULL被視為DEFAULT 0。

·???????? 表內的任何一個TIMESTAMP列可以設置為自動初始化為當前時間戳和/或更新。

·???????? CREATE TABLE語句中,可以用下面的任何一種方式聲明第1TIMESTAMP列:

o??????? DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP子句,列為默認值使用當前的時間戳,并且自動更新。

o??????? 不使用DEFAULTON UPDATE子句,與DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP相同。

o??????? DEFAULT CURRENT_TIMESTAMP子句不用ON UPDATE子句,列為默認值使用當前的時間戳但是不自動更新。

o??????? 不用DEFAULT子句但用ON UPDATE CURRENT_TIMESTAMP子句,列有默認值0并自動更新。

o??????? 用常量DEFAULT值,列有給出的 默認值。如果列有一個ON UPDATE CURRENT_TIMESTAMP子句,它自動更新,否則不。

換句話說,你可以為初始值和自動更新的值使用當前的時間戳,或者其中一個使用,或者兩個皆不使用。(例如,你可以指定ON UPDATE來啟用自動更新而不讓列自動初始化)。

·???????? DEFAULTON UPDATE子句中可以使用CURRENT_TIMESTAMPCURRENT_TIMESTAMP()或者NOW()。它們均具有相同的效果。

兩個屬性的順序并不重要。如果一個TIMESTAMP列同時指定了DEFAULTON UPDATE,任何一個可以在另一個的前面。

例子,下面這些語句是等效的:

CREATE TABLE t (ts TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
???????????????????????????? ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
???????????????????????????? DEFAULT CURRENT_TIMESTAMP);

·???????? 要為TIMESTAMP列而不是第1列指定自動默認或更新,必須通過將第1TIMESTAMP列顯式分配一個常量DEFAULT值來禁用自動初始化和更新。(例如,DEFAULT 0DEFAULT'2003-01-01 00:00:00')。然后,對于其它TIMESTAMP列,規(guī)則與第1TIMESTAMP列相同,例外情況是不能忽略DEFAULTON UPDATE子句。如果這樣做,則不會自動進行初始化或更新。

例如:下面這些語句是等效的:

CREATE TABLE t (
??? ts1 TIMESTAMP DEFAULT 0,
??? ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
????????????????? ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (
??? ts1 TIMESTAMP DEFAULT 0,
??? ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
????????????????? DEFAULT CURRENT_TIMESTAMP);

可以對每個連接設置當前的時區(qū),相關描述參見5.10.8節(jié),“MySQL服務器時區(qū)支持”。TIMESTAMP值以UTC格式保存,存儲時對當前的時區(qū)進行轉換,檢索時再轉換回當前的時區(qū)。只要時區(qū)設定值為常量,便可以得到保存時的值。如果保存一個TIMESTAMP值,應更改時區(qū)然后檢索該值,它與你保存的值不同。這是因為在兩個方向的轉換中沒有使用相同的時區(qū)。當前的時區(qū)可以用作time_zone系統(tǒng)變量的值。

可以在TIMESTAMP列的定義中包括NULL屬性以允許列包含NULL值。例如:

CREATE TABLE t
(
? ts1 TIMESTAMP NULL DEFAULT NULL,
? ts2 TIMESTAMP NULL DEFAULT 0,
? ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
);

如果未指定NULL屬性,將列設置為NULL設置則會將它設置為當前的時間戳。請注意允許NULL值的TIMESTAMP列不會采用當前的時間戳,除非要么其 默認值定義為CURRENT_TIMESTAMP,或者NOW()CURRENT_TIMESTAMP被插入到該列內。換句話說,只有使用如下定義創(chuàng)建,定義為 NULLTIMESTAMP列才會自動更新:

CREATE TABLE t (ts NULLDEFAULT CURRENT_TIMESTAMP);

否則-也就是說,如果使用NULL而不是DEFAULT TIMESTAMP來定義TIMESTAMP列,如下所示...

CREATE TABLE t1 (ts NULL DEFAULT NULL);
CREATE TABLE t2 (ts NULL DEFAULT '0000-00-00 00:00:00');

...則必須顯式插入一個對應當前日期和時間的值。例如:

INSERT INTO t1 VALUES (NOW());
INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);

11.3.2.?TIME類型

MySQL'HH:MM:SS'格式檢索和顯示TIME(或對于大的小時值采用'HHH:MM:SS'格式)。TIME值的范圍可以從'-838:59:59''838:59:59'。小時部分會因此大的原因是TIME類型不僅可以用于表示一天的時間(必須小于24小時),還可能為某個事件過去的時間或兩個事件之間的時間間隔(可以大于24小時,或者甚至為負)。

你可以用各種格式指定TIME值:

·???????? 'D HH:MM:SS.fraction'格式的字符串。還可以使用下面任何一種“非嚴格”語法:'HH:MM:SS.fraction''HH:MM:SS'、'HH:MM'、'D HH:MM:SS'、'D HH:MM'、'D HH''SS'。這里D表示日,可以取034之間的值。請注意MySQL還不保存分數(shù)。

·???????? 'HHMMSS'格式的沒有間割符的字符串,假定是有意義的時間。例如,'101112'被理解為'10:11:12',但'109712'是不合法的(它有一個沒有意義的分鐘部分),將變?yōu)?span>'00:00:00'。

·???????? HHMMSS格式的數(shù)值,假定是有意義的時間。例如,101112被理解為'10:11:12'。下面格式也可以理解:SSMMSS、HHMMSS、HHMMSS.fraction。請注意MySQL還不保存分數(shù)。

·???????? 函數(shù)返回的結果,其值適合TIME上下文,例如CURRENT_TIME。

對于指定為包括時間部分間割符的字符串的TIME值,如果時、分或者秒值小于10,則不需要指定兩位數(shù)。'8:3:2''08:03:02'相同。

TIME列分配簡寫值時應注意。沒有冒號,MySQL解釋值時假定最右邊的兩位表示秒。(MySQL解釋TIME值為過去的時間而不是當天的時間)例如,你可能認為'1112'1112表示'11:12:00'(11點過12),但MySQL將它們解釋為'00:11:12'(11分,12 )。同樣,'12'12 被解釋為 '00:00:12'。相反,TIME值中使用冒號則肯定被看作當天的時間。也就是說,'11:12'表示'11:12:00',而不是'00:11:12'。

超出TIME范圍但合法的值被裁為范圍最接近的端點。例如,'-850:00:00''850:00:00'被轉換為'-838:59:59''838:59:59'

無效TIME值被轉換為'00:00:00'。請注意由于'00:00:00'本身是一個合法TIME值,只從表內保存的一個'00:00:00'值還不能說出原來的值是 '00:00:00'還是不合法的值。

11.3.3.?YEAR類型

YEAR類型是一個單字節(jié)類型用于表示年。

MySQLYYYY格式檢索和顯示YEAR值。范圍是19012155。

可以指定各種格式的YEAR值:

·???????? 四位字符串,范圍為'1901''2155'。

·???????? 四位數(shù)字,范圍為19012155

·???????? 兩位字符串,范圍為'00''99''00''69''70''99'范圍的值被轉換為2000206919701999范圍的YEAR值。

·???????? 兩位整數(shù),范圍為199。1697099范圍的值被轉換為2001206919701999范圍的YEAR值。請注意兩位整數(shù)范圍與兩位字符串范圍稍有不同,因為你不能直接將零指定為數(shù)字并將它解釋為2000。你必須將它指定為一個字符串'0''00'或它被解釋為0000。

·???????? 函數(shù)返回的結果,其值適合YEAR上下文,例如NOW()。

非法YEAR值被轉換為0000。

11.3.4.?Y2K事宜和日期類型

MySQL本身對于2000(Y2K)是安全的(參見1.4.5節(jié),“2000年兼容性”),但輸入給MySQL的值可能不安全。任何包含兩位年值的輸入都會令人模糊,因為世紀不知道。這些值必須解釋為四位形式,因為MySQL內部使用四位來保存年。

對于DATETIMEDATE、TIMESTAMPYEAR類型,MySQL使用以下規(guī)則解釋含模糊年值的日期:

·???????? 00-69范圍的年值轉換為2000-2069

·???????? 70-99范圍的年值轉換為1970-1999。

請記住這些規(guī)則只是合理猜測數(shù)據(jù)值表示什么。如果MySQL使用的啟發(fā)不能產生正確的值,你應提供包含四位年值的確切輸入。

ORDER BY可以正確排序有兩位年的TIMESTAMPYEAR值。

部分函數(shù)如MIN()MAX()TIMESTAMPYEAR轉換為一個數(shù)字。這說明使用有兩位年值的值,這些函數(shù)不能工作正確。在這種情況下的修復方法是將TIMESTAMPYEAR轉換為四位年格式或使用MIN(DATE_ADD(TIMESTAMP,INTERVAL 0 DAYS))。

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類型
字符串類型指CHARVARCHAR、BINARYVARBINARY、BLOBTEXT、ENUMSET。該節(jié)描述了這些類型如何工作以及如何在查詢中使用這些類型。

11.4.1.?CHAR和VARCHAR類型

CHARVARCHAR類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換。

CHARVARCHAR類型聲明的長度表示你想要保存的最大字符數(shù)。例如,CHAR(30)可以占用30個字符。

CHAR列的長度固定為創(chuàng)建表時聲明的長度。長度可以為從0255的任何值。當保存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格被刪除掉。在存儲或檢索過程中不進行大小寫轉換。

VARCHAR列中的值為可變長字符串。長度可以指定為065,535之間的值。(VARCHAR的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是65,532字節(jié))。

CHAR對比,VARCHAR值保存時只保存需要的字符數(shù),另加一個字節(jié)來記錄長度(如果列聲明的長度超過255,則使用兩個字節(jié))。

VARCHAR值保存時不進行填充。當值保存和檢索時尾部的空格仍保留,符合標準SQL。

如果分配給CHARVARCHAR列的值超過列的最大長度,則對值進行裁剪以使其適合。如果被裁掉的字符不是空格,則會產生一條警告。如果裁剪非空格字符,則會造成錯誤(而不是警告)并通過使用嚴格SQL模式禁用值的插入。參見5.3.2節(jié),“SQL服務器模式”。

下面的表顯示了將各種字符串值保存到CHAR(4)VARCHAR(4)列后的結果,說明了CHARVARCHAR之間的差別:

CHAR(4)

存儲需求

VARCHAR(4)

存儲需求

''

'????'

4個字節(jié)

''

1個字節(jié)

'ab'

'ab??'

4個字節(jié)

'ab '

3個字節(jié)

'abcd'

'abcd'

4個字節(jié)

'abcd'

5個字節(jié)

'abcdefgh'

'abcd'

4個字節(jié)

'abcd'

5個字節(jié)

請注意上表中最后一行的值只適用不使用嚴格模式時;如果MySQL運行在嚴格模式,超過列長度不的值保存,并且會出現(xiàn)錯誤。

CHAR(4)VARCHAR(4)列檢索的值并不總是相同,因為檢索時從CHAR列刪除了尾部的空格。通過下面的例子說明該差別:

mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.02 sec)
?
mysql> INSERT INTO vc VALUES ('ab? ', 'ab? ');
Query OK, 1 row affected (0.00 sec)
?
mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
+----------------+----------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+----------------+
| ab? +????????? | ab+??????????? |
+----------------+----------------+
1 row in set (0.00 sec)

根據(jù)分配給列的字符集校對規(guī)則對CHARVARCHAR列中的值進行排序和比較。

請注意所有MySQL校對規(guī)則屬于PADSPACE類。這說明在MySQL中的所有CHARVARCHAR值比較時不需要考慮任何尾部空格。例如:

mysql> CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10));
Query OK, 0 rows affected (0.09 sec)
?
mysql> INSERT INTO names VALUES ('Monty ', 'Monty ');
Query OK, 1 row affected (0.00 sec)
?
mysql> SELECT myname = 'Monty? ', yourname = 'Monty? ' FROM names;
+--------------------+----------------------+
| myname = 'Monty? ' | yourname = 'Monty? ' |
+--------------------+----------------------+
|????????????????? 1 |??????????????????? 1 |
+--------------------+----------------------+
1 row in set (0.00 sec)

請注意所有MySQL版本均如此,并且它不受SQL服務器模式的影響。

對于尾部填充字符被裁剪掉或比較時將它們忽視掉的情形,如果列的索引需要唯一的值,在列內插入一個只是填充字符數(shù)不同的值將會造成復制鍵值錯誤。

CHAR BYTECHAR BINARY的別名。這是為了保證兼容性。

ASCII屬性為CHAR列分配latin1字符集。UNICODE屬性分配ucs2字符集。

11.4.2.?BINARY和VARBINARY類型

BINARYVARBINARY類類似于CHARVARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節(jié)字符串而不是字符字符串。這說明它們沒有字符集,并且排序和比較基于列值字節(jié)的數(shù)值值。

BINARYVARBINARY允許的最大長度一樣,如同CHARVARCHAR,不同的是BINARYVARBINARY的長度是字節(jié)長度而不是字符長度。

BINARYVARBINARY數(shù)據(jù)類型不同于CHAR BINARYVARCHAR BINARY數(shù)據(jù)類型。對于后一種類型,BINARY屬性不會將列視為二進制字符串列。相反,它致使使用列字符集的二元 校對規(guī)則,并且列自身包含非二進制字符字符串而不是二進制字節(jié)字符串。例如CHAR(5) BINARY被視為CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin,假定默認字符集是latin1。這不同于BINARY(5),它保存5字節(jié)二進制字符串,沒有字符集或 校對規(guī)則。

當保存BINARY值時,在它們右邊填充值以達到指定長度。填充值是0x00(零字節(jié))。插入值時在右側添加0x00 on,并且選擇時不刪除尾部的字節(jié)。比較時所有字節(jié)很重要,包括ORDER BYDISTINCT操作。比較時0x00字節(jié)和空格是不同的,0x00<空格。

例如:對于一個BINARY(3)列,當插入時 'a' 變?yōu)? 'a?\0'。'a\0'插入時變?yōu)?span>'a\0\0'。當選擇時兩個插入的值均不更改。

對于VARBINARY,插入時不填充字符,選擇時不裁剪字節(jié)。比較時所有字節(jié)很重要,包括ORDER BYDISTINCT操作。比較時0x00字節(jié)和空格是不同的,0x00<空格。

對于尾部填充字符被裁剪掉或比較時將它們忽視掉的情形,如果列的索引需要唯一的值,在列內插入一個只是填充字符數(shù)不同的值將會造成復制鍵值錯誤。

如果你計劃使用這些數(shù)據(jù)類型來保存二進制數(shù)據(jù)并且需要檢索的值與保存的值完全相同,應考慮前面所述的填充和裁剪特征。下面的例子說明了用0x00填充的BINARY值如何影響列值比較:

mysql> CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec)
?
mysql> INSERT INTO t SET c = 'a';
Query OK, 1 row affected (0.01 sec)
?
mysql> SELECT HEX(c), c = 'a', c = 'a\0\0' from t;
+--------+---------+-------------+
| HEX(c) | c = 'a' | c = 'a\0\0' |
+--------+---------+-------------+
| 610000 |?????? 0 |?????????? 1 |
+--------+---------+-------------+
1 row in set (0.09 sec)

如果檢索的值必須與指定進行存儲而沒有填充的值相同,最好使用BLOB數(shù)據(jù)類型。

創(chuàng)建表時,MySQL可以默默更改BINARYVARBINARY列的類型。參見13.1.5.1節(jié),“沉寂的列規(guī)格變更”。

11.4.3.?BLOB和TEXT類型

BLOB是一個二進制大對象,可以容納可變數(shù)量的數(shù)據(jù)。有4BLOB類型:TINYBLOB、BLOB、MEDIUMBLOBLONGBLOB。它們只是可容納值的最大長度不同。

4TEXT類型:TINYTEXTTEXT、MEDIUMTEXTLONGTEXT。這些對應4BLOB類型,有相同的最大長度和存儲需求。

參見11.5節(jié),“列類型存儲需求”。

BLOB 列被視為二進制字符串(字節(jié)字符串)。TEXT列被視為非二進制字符串(字符字符串)。BLOB列沒有字符集,并且排序和比較基于列值字節(jié)的數(shù)值值。TEXT列有一個字符集,并且根據(jù)字符集的 校對規(guī)則對值進行排序和比較。

TEXTBLOB列的存儲或檢索過程中,不存在大小寫轉換。

當未運行在嚴格模式時,如果你為BLOBTEXT列分配一個超過該列類型的最大長度的值值,值被截取以保證適合。如果截掉的字符不是空格,將會產生一條警告。使用嚴格SQL模式,會產生錯誤,并且值將被拒絕而不是截取并給出警告。參見5.3.2節(jié),“SQL服務器模式”。

在大多數(shù)方面,可以將BLOB列視為能夠足夠大的VARBINARY列。同樣,可以將TEXT列視為VARCHAR列。BLOBTEXT在以下幾個方面不同于VARBINARYVARCHAR

·???????? 當保存或檢索BLOBTEXT列的值時不刪除尾部空格。(這與VARBINARYVARCHAR列相同)

請注意比較時將用空格對TEXT進行擴充以適合比較的對象,正如CHARVARCHAR。

·???????? 對于BLOBTEXT列的索引,必須指定索引前綴的長度。對于CHARVARCHAR,前綴長度是可選的。參見7.4.3節(jié),“列索引”。

·???????? BLOBTEXT列不能有 默認值。

LONGLONG VARCHAR對應MEDIUMTEXT數(shù)據(jù)類型。這是為了保證兼容性。如果TEXT列類型使用BINARY屬性,將為列分配列字符集的二元 校對規(guī)則。

MySQL連接程序/ODBCBLOB值定義為LONGVARBINARY,將TEXT值定義為LONGVARCHAR

由于BLOBTEXT值可能會非常長,使用它們時可能遇到一些約束:

·???????? 當排序時只使用該列的前max_sort_length個字節(jié)。max_sort_length的 默認值是1024;該值可以在啟動mysqld服務器時使用--max_sort_length選項進行更改。參見5.3.3節(jié),“服務器系統(tǒng)變量”。

運行時增加max_sort_length的值可以在排序或組合時使更多的字節(jié)有意義。任何客戶端可以更改其會話max_sort_length變量的值:

mysql> SET max_sort_length = 2000;
mysql> SELECT id, comment FROM tbl_name
??? -> ORDER BY comment;

當你想要使超過max_sort_length的字節(jié)有意義,對含長值的BLOBTEXT列使用GROUP BYORDER BY的另一種方式是將列值轉換為固定長度的對象。標準方法是使用SUBSTRING函數(shù)。例如,下面的語句對comment列的2000個字節(jié)進行排序:

mysql> SELECT id, SUBSTRING(comment,1,2000) FROM tbl_name
??? -> ORDER BY SUBSTRING(comment,1,2000);

·???????? BLOBTEXT對象的最大大小由其類型確定,但在客戶端和服務器之間實際可以傳遞的最大值由可用內存數(shù)量和通信緩存區(qū)大小確定。你可以通過更改max_allowed_packet變量的值更改消息緩存區(qū)的大小,但必須同時修改服務器和客戶端程序。例如,可以使用 mysqlmysqldump來更改客戶端的max_allowed_packet值。參見7.5.2節(jié),“調節(jié)服務器參數(shù)”、8.3節(jié),“mysql:MySQL命令行工具”和8.8節(jié),“mysqldump:數(shù)據(jù)庫備份程序”。

每個BLOBTEXT值分別由內部分配的對象表示。這與其它列類型形成對比,后者是當打開表時為每1列分配存儲引擎。

11.4.4.?ENUM類型

ENUM是一個字符串對象,其值來自表創(chuàng)建時在列規(guī)定中顯式枚舉的一列值。

在某些情況下,ENUM值也可以為空字符串('')NULL

·???????? 如果你將一個非法值插入ENUM(也就是說,允許的值列之外的字符串),將插入空字符串以作為特殊錯誤值。該字符串與“普通”空字符串不同,該字符串有數(shù)值值0。后面有詳細討論。

·???????? 如果將ENUM列聲明為允許NULLNULL值則為該列的一個有效值,并且 默認值為NULL。如果ENUM列被聲明為NOT NULL,其默認值為允許的值列的第1個元素。

每個枚舉值有一個索引:

·???????? 來自列規(guī)定的允許的值列中的值從1開始編號。

·???????? 空字符串錯誤值的索引值是0。這說明你可以使用下面的SELECT語句來找出分配了非法ENUM值的行:

·??????????????? mysql> SELECT * FROM tbl_name WHERE enum_col=0;

·???????? NULL值的索引是NULL。

例如,定義為ENUM的列('one','two''three')可以有下面所示任何值。還顯示了每個值的索引:

索引

NULL

NULL

''

0

'one'

1

'two'

2

'three'

3

枚舉最多可以有65,535個元素。

當創(chuàng)建表時,ENUM成員值的尾部空格將自動被刪除。

當檢索時,保存在ENUM列的值使用列定義中所使用的大小寫來顯示。請注意可以為ENUM列分配字符集和 校對規(guī)則。對于二進制或大小寫敏感的校對規(guī)則,當為列分配值時應考慮大小寫。

如果在數(shù)值上下文中檢索一個ENUM值,將返回列值的索引。例如,你可以這樣從ENUM列搜索數(shù)值值:

mysql> SELECT enum_col+0 FROM tbl_name;

如果將一個數(shù)字保存到ENUM列,數(shù)字被視為索引,并且保存的值是該索引對應的枚舉成員。(但是,這不適合LOAD DATA,它將所有輸入視為字符串)。不建議使用類似數(shù)字的枚舉值來定義一個ENUM列,因為這很容易引起混淆。例如,下面的列含有字符串值'0'、'1''2'的枚舉成員,但數(shù)值索引值為1、23

numbers ENUM('0','1','2')

根據(jù)枚舉成員在列定義中列出的順序對ENUM值進行排序。(換句話說,ENUM值根據(jù)索引編號進行排序)。例如,對于ENUM('a','b'),'a'排在'b'前面,但對于ENUM('b','a')'b'排在'a'前面??兆址旁诜强兆址懊妫⑶?span>NULL值排在所有其它枚舉值前面。要想防止意想不到的結果,按字母順序規(guī)定ENUM列。還可以使用GROUP BY? CAST(col AS CHAR)GROUP BY? CONCAT(col)來確保按照詞匯對列進行排序而不是用索引數(shù)字。

如果你想要確定一個ENUM列的所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE enum_col,并解析輸出中第2列的ENUM定義。

11.4.5.?SET類型

SET是一個字符串對象,可以有零或多個值,其值來自表創(chuàng)建時規(guī)定的允許的一列值。指定包括多個SET成員的SET列值時各成員之間用逗號(,)間隔開。這樣SET成員值本身不能包含逗號。

例如,指定為SET('one', 'two') NOT NULL的列可以有下面的任何值:

''
'one'
'two'
'one,two'

SET最多可以有64個不同的成員。

當創(chuàng)建表時,SET成員值的尾部空格將自動被刪除。

當檢索時,保存在SET列的值使用列定義中所使用的大小寫來顯示。請注意可以為SET列分配字符集和 校對規(guī)則。對于二進制或大小寫敏感的校對規(guī)則,當為列分配值時應考慮大小寫。

MySQL用數(shù)字保存SET值,所保存值的低階位對應第1SET成員。如果在數(shù)值上下文中檢索一個SET值,檢索的值的位設置對應組成列值的SET成員。例如,你可以這樣從一個SET列檢索數(shù)值值:

mysql> SELECT set_col+0 FROM tbl_name;

如果將一個數(shù)字保存到SET列中,數(shù)字中二進制表示中的位確定了列值中的SET成員。對于指定為SET('a','b','c','d')的列,成員有下面的十進制和二進制值:

SET成員

十進制值

二進制值

'a'

1

0001

'b'

2

0010

'c'

4

0100

'd'

8

1000

?

如果你為該列分配一個值9,其二進制形式為1001,因此第1個和第4SET值成員'a''d'被選擇,結果值為 'a,d'。

對于包含多個SET元素的值,當插入值時元素所列的順序并不重要。在值中一個給定的元素列了多少次也不重要。當以后檢索該值時,值中的每個元素出現(xiàn)一次,根據(jù)表創(chuàng)建時指定的順序列出元素。例如,假定某個列指定為SET('a','b','c','d')

mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));

插入值'a,d'、'd,a'、'a,d,d''a,d,a''d,a,d':

mysql> INSERT INTO myset (col) VALUES 
-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
Query OK, 5 rows affected (0.01 sec)
Records: 5? Duplicates: 0? Warnings: 0

當檢索時所有這些值顯示為 'a,d'

mysql> SELECT col FROM myset;
+------+
| col? |
+------+
| a,d? |
| a,d? |
| a,d? |
| a,d? |
| a,d? |
+------+
5 rows in set (0.04 sec)

如果將SET列設置為一個不支持的值,則該值被忽略并發(fā)出警告:

mysql> INSERT INTO myset (col) VALUES ('a,d,d,s');
Query OK, 1 row affected, 1 warning (0.03 sec)
?
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------+
| Level?? | Code | Message????????????????????????????????? |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'col' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.04 sec)
?
mysql> SELECT col FROM myset;
+------+
| col? |
+------+
| a,d? |
| a,d? |
| a,d? |
| a,d? |
| a,d? |
| a,d? |
+------+
6 rows in set (0.01 sec)

SET值按數(shù)字順序排序。NULL值排在非NULL SET值的前面。

通常情況,可以使用FIND_IN_SET()函數(shù)或LIKE操作符搜索SET值:

mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';

1個語句找出SET_col包含value set成員的行。第2個類似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另一個SET成員的子字符串中。

下面的語句也是合法的:

mysql> SELECT * FROM tbl_name WHERE set_col & 1;
mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';

1個語句尋找包含第1set成員的值。第2個語句尋找一個確切匹配的值。應注意第2類的比較。將set值與'val1,val2'比較返回的結果與同'val2,val1'比較返回的結果不同。指定值時的順序應與在列定義中所列的順序相同。

如果想要為SET列確定所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE set_col并解析輸出中第2列的SET定義。

11.5.?列類型存儲需求

根據(jù)類別列出了MySQL支持的每個列類型的存儲需求。

MyISAM表中行的最大大小為65,534字節(jié)。每個BLOBTEXT列 賬戶只占其中的59個字節(jié)。

如果MyISAM表包括變長列類型,記錄格式也是可變長度。當創(chuàng)建表時,在某些條件下,MySQL可以將一個列從變長類型改為固定長度的類型或反之亦然。詳細信息參見13.1.5.1節(jié),“沉寂的列規(guī)格變更”。

數(shù)值類型存儲需求

列類型

存儲需求

TINYINT

1個字節(jié)

SMALLINT

2個字節(jié)

MEDIUMINT

3個字節(jié)

INT, INTEGER

4個字節(jié)

BIGINT

8個字節(jié)

FLOAT(p)

如果0 <= p <= 244個字節(jié), 如果25 <= p <= 538個字節(jié)

FLOAT

4個字節(jié)

DOUBLE [PRECISION], item REAL

8個字節(jié)

DECIMAL(M,D), NUMERIC(M,D)

變長;參見下面的討論

BIT(M)

大約(M+7)/8個字節(jié)

DECIMAL(NUMERIC)的存儲需求與具體版本有關:

使用二進制格式將9個十進制(基于10)數(shù)壓縮為4個字節(jié)來表示DECIMAL列值。每個值的整數(shù)和分數(shù)部分的存儲分別確定。每個9位數(shù)的倍數(shù)需要4個字節(jié),并且“剩余的”位需要4個字節(jié)的一部分。下表給出了超出位數(shù)的存儲需求:

剩余的

字節(jié)

位數(shù)

數(shù)目

0

0

1

1

2

1

3

2

4

2

5

3

6

3

7

4

8

4

9

4

日期和時間類型的存儲需求

列類型

存儲需求

DATE

3個字節(jié)

DATETIME

8個字節(jié)

TIMESTAMP

4個字節(jié)

TIME

3個字節(jié)

YEAR

1個字節(jié)

字符串類型的存儲需求

列類型

存儲需求

CHAR(M)

M個字節(jié),0 <= M <= 255

VARCHAR(M)

L+1個字節(jié),其中L <= M 0 <= M <= 65535(參見下面的注釋)

BINARY(M)

M個字節(jié),0 <= M <= 255

VARBINARY(M)

L+1個字節(jié),其中L <= M 0 <= M <= 255

TINYBLOB, TINYTEXT

L+1個字節(jié),其中L < 28

BLOB, TEXT

L+2個字節(jié),其中L < 216

MEDIUMBLOB, MEDIUMTEXT

L+3個字節(jié),其中L < 224

LONGBLOB, LONGTEXT

L+4個字節(jié),其中L < 232

ENUM('value1','value2',...)

12個字節(jié),取決于枚舉值的個數(shù)(最多65,535個值)

SET('value1','value2',...)

1、23、4或者8個字節(jié),取決于set成員的數(shù)目(最多64個成員)

VARCHARBLOBTEXT類是變長類型。每個類型的存儲需求取決于列值的實際長度(用前面的表中的L表示),而不是該類型的最大可能的大小。例如,VARCHAR(10)列可以容納最大長度為10的字符串。實際存儲需求是字符串(L)的長度,加上一個記錄字符串長度的字節(jié)。對于字符串'abcd',L4,存儲需要5個字節(jié)。

對于CHARVARCHARTEXT類型,前面的表中的值LM應解釋為字符數(shù)目,并且列定義中的這些類型的長度表示字符數(shù)目。例如,要想保存一個TINYTEXT值需要L字符+ 1個字節(jié)。

要想計算用于保存具體CHAR、VARCHAR或者TEXT列值的字節(jié)數(shù),需要考慮該列使用的字符集。在具體情況中,當使用Unicode時,必須記住所有Unicode字符使用相同的字節(jié)數(shù)。為了細分用于不同類Unicode字符使用的存儲,參見10.5節(jié),“Unicode支持”。

注釋:VARCHAR列的有效最大長度為65,532字符。

NDBCLUSTER引擎只支持固定寬度的列。這說明MySQL簇中的表中的VARCHAR列的行為如同類型CHAR(不同的是每個記錄仍然有一個額外字節(jié)空間)。例如,在Cluster表中,聲明為VARCHAR(100)的列中的每個記錄存儲時將占用101個字節(jié),無論實際存儲的記錄中的字符串的長度為多少。

BLOBTEXT類需要 1、23或者4個字節(jié)來記錄列值的長度,取決于該類的最大可能的長度。參見11.4.3節(jié),“BLOB和TEXT類型”。

NDB Cluster存儲引擎中,TEXTBLOB列的實施是不同的,其中TEXT列中的每個記錄由兩個單獨部分組成。一個是固定大小(256字節(jié)),并且實際上保存在原表中。另一個包括超出256字節(jié)的任何數(shù)據(jù),保存在隱含的表中。第2個表中的記錄總是2,000字節(jié)長。這說明如果size<= 256,TEXT列的大小為256(其中size表示記錄的大小);否則,大小是256 +size+(2000(size256)%2000)

ENUM對象的大小由不同的枚舉值的數(shù)目確定。枚舉用一個字節(jié),可以有255個可能的值。當枚舉的值位于25665,535之間時,用兩個字節(jié)。參見11.4.4節(jié),“ENUM類型”。

SET對象的大小由不同的set成員的數(shù)量確定。如果set大小是N,對象占(N+7)/8個字節(jié),四舍五入到1、2、3、4或者8個字節(jié)。SET最多可以有64個成員。參見11.4.5節(jié),“SET類型”。

11.6.?選擇正確的列類型

為了優(yōu)化存儲,在任何情況下均應使用最精確的類型。例如,如果列的值的范圍為從199999,若使用整數(shù),則MEDIUMINT UNSIGNED是好的類型。在所有可以表示該列值的類型中,該類型使用的存儲最少。

用精度為65位十進制數(shù)(基于10)DECIMAL 列進行所有基本計算(+、-*/)。參見11.1.1節(jié),“數(shù)值類型概述”。

使用雙精度操作對DECIMAL值進行計算。如果準確度不是太重要或如果速度為最高優(yōu)先級,DOUBLE類型即足夠了。為了達到高精度,可以轉換到保存在BIGINT中的定點類型。這樣可以用64位整數(shù)進行所有計算,根據(jù)需要將結果轉換回浮點值。

11.7.?使用來自其他數(shù)據(jù)庫引擎的列類型

為了使用由其它賣方編寫的SQL執(zhí)行代碼,MySQL按照下表所示對列類型進行映射。通過這些映射,可以很容易地從其它數(shù)據(jù)庫引擎將表定義導入到MySQL中:

其它賣方類型

MySQL類型

BOOL,

TINYINT

BOOLEAN

TINYINT

CHAR VARYING(M)

VARCHAR(M)

DEC

DECIMAL

FIXED

DECIMAL

FLOAT4

FLOAT

FLOAT8

DOUBLE

INT1

TINYINT

INT2

SMALLINT

INT3

MEDIUMINT

INT4

INT

INT8

BIGINT

LONG VARBINARY

MEDIUMBLOB

LONG VARCHAR

MEDIUMTEXT

LONG

MEDIUMTEXT

MIDDLEINT

MEDIUMINT

NUMERIC

DECIMAL

在創(chuàng)建表時對列類型進行映射,然后原來的類型定義被丟棄。如果你使用其它賣方的類型創(chuàng)建一個表,然后執(zhí)行DESCRIBE tbl_name語句,MySQL使用等效的MySQL類型來報告表的結構。例如:

mysql> CREATE TABLE t (a BOOL, b FLOAT8, c LONG, d NUMERIC);
Query OK, 0 rows affected (0.08 sec)
?
mysql> DESCRIBE t;
+-------+---------------+------+-----+---------+-------+
| Field | Type????????? | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| a???? | tinyint(1)??? | YES? |???? | NULL??? |?????? |
| b???? | double??????? | YES? |???? | NULL??? |?????? |
| c???? | mediumtext??? | YES? |???? | NULL??? |?????? |
| d???? | decimal(10,0) | YES? |???? | NULL??? |?????? |
+-------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

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

上一篇: 下一篇: