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

directory search
目錄 前言 1. 一般信息 1.1. 關(guān)于本手冊(cè) 1.2. 本手冊(cè)采用的慣例 1.3. MySQL AB概述 1.4. MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)概述 1.4.1. MySQL的歷史 1.4.2. MySQL的的主要特性 1.4.3. MySQL穩(wěn)定性 1.4.4. MySQL表最大能達(dá)到多少 1.4.5. 2000年兼容性 1.5. MaxDB數(shù)據(jù)庫(kù)管理系統(tǒng)概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的歷史 1.5.3. MaxDB的特性 1.5.4. 許可和支持 1.5.5. MaxDB和MySQL之間的特性差異 1.5.6. MaxDB和MySQL之間的協(xié)同性 1.5.7. 與MaxDB有關(guān)的鏈接 1.6. MySQL發(fā)展大事記 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL郵件列表 1.7.2. IRC(在線聊天系統(tǒng))上的MySQL社區(qū)支持 1.7.3. MySQL論壇上的MySQL社區(qū)支持 1.8. MySQL標(biāo)準(zhǔn)的兼容性 1.8.1. MySQL遵從的標(biāo)準(zhǔn)是什么 1.8.2. 選擇SQL模式 1.8.3. 在ANSI模式下運(yùn)行MySQL 1.8.4. MySQL對(duì)標(biāo)準(zhǔn)SQL的擴(kuò)展 1.8.5. MySQL與標(biāo)準(zhǔn)SQL的差別 1.8.6. MySQL處理約束的方式 2. 安裝MySQL 2.1. 一般安裝問(wèn)題 2.1.1. MySQL支持的操作系統(tǒng) 2.1.2. 選擇要安裝的MySQL分發(fā)版 2.1.3. 怎樣獲得MySQL 2.1.4. 通過(guò)MD5校驗(yàn)和或GnuPG驗(yàn)證軟件包的完整性 2.1.5. 安裝布局 2.2. 使用二進(jìn)制分發(fā)版的標(biāo)準(zhǔn)MySQL安裝 2.3. 在Windows上安裝MySQL 2.3.1. Windows系統(tǒng)要求 2.3.2. 選擇安裝軟件包 2.3.3. 用自動(dòng)安裝器安裝MySQL 2.3.4. 使用MySQL安裝向?qū)?/a> 2.3.5. 使用配置向?qū)?/a> 2.3.6. 通過(guò)非安裝Zip文件安裝MySQL 2.3.7. 提取安裝檔案文件 2.3.8. 創(chuàng)建選項(xiàng)文件 2.3.9. 選擇MySQL服務(wù)器類型 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. 從開(kāi)發(fā)源碼樹(shù)安裝 2.8.4. 處理MySQL編譯問(wèn)題 2.8.5. MIT-pthreads注意事項(xiàng) 2.8.6. 在Windows下從源碼安裝MySQL 2.8.7. 在Windows下編譯MySQL客戶端 2.9. 安裝后的設(shè)置和測(cè)試 2.9.1. Windows下安裝后的過(guò)程 2.9.2. Unix下安裝后的過(guò)程 2.9.3. 使初始MySQL賬戶安全 2.10. 升級(jí)MySQL 2.10.1. 從5.0版升級(jí) 2.10.2. 升級(jí)授權(quán)表 2.10.3. 將MySQL數(shù)據(jù)庫(kù)拷貝到另一臺(tái)機(jī)器 2.11. 降級(jí)MySQL 2.12. 具體操作系統(tǒng)相關(guān)的注意事項(xiàng) 2.12.1. Linux注意事項(xiàng) 2.12.2. Mac OS X注意事項(xiàng) 2.12.3. Solaris注意事項(xiàng) 2.12.4. BSD注意事項(xiàng) 2.12.5. 其它Unix注意事項(xiàng) 2.12.6. OS/2注意事項(xiàng) 2.13. Perl安裝注意事項(xiàng) 2.13.1. 在Unix中安裝Perl 2.13.2. 在Windows下安裝ActiveState Perl 2.13.3. 使用Perl DBI/DBD接口的問(wèn)題 3. 教程 3.1. 連接與斷開(kāi)服務(wù)器 3.2. 輸入查詢 3.3. 創(chuàng)建并使用數(shù)據(jù)庫(kù) 3.3.1. 創(chuàng)建并選擇數(shù)據(jù)庫(kù) 3.3.2. 創(chuàng)建表 3.3.3. 將數(shù)據(jù)裝入表中 3.3.4. 從表檢索信息 3.4. 獲得數(shù)據(jù)庫(kù)和表的信息 NoName 3.6. 常用查詢的例子 3.6.1. 列的最大值 3.6.2. 擁有某個(gè)列的最大值的行 3.6.3. 列的最大值:按組 3.6.4. 擁有某個(gè)字段的組間最大值的行 3.6.5. 使用用戶變量 3.6.6. 使用外鍵 3.6.7. 根據(jù)兩個(gè)鍵搜索 3.6.8. 根據(jù)天計(jì)算訪問(wèn)量 3.6.9. 使用AUTO_INCREMENT 3.7. 孿生項(xiàng)目的查詢 3.7.1. 查找所有未分發(fā)的孿生項(xiàng) 3.7.2. 顯示孿生對(duì)狀態(tài)的表 3.8. 與Apache一起使用MySQL 4. MySQL程序概述 4.1. MySQL程序概述 4.2. 調(diào)用MySQL程序 4.3. 指定程序選項(xiàng) 4.3.1. 在命令行上使用選項(xiàng) 4.3.2. 使用選項(xiàng)文件 4.3.3. 用環(huán)境變量指定選項(xiàng) 4.3.4. 使用選項(xiàng)設(shè)置程序變量 5. 數(shù)據(jù)庫(kù)管理 5.1. MySQL服務(wù)器和服務(wù)器啟動(dòng)腳本 5.1.1. 服務(wù)器端腳本和實(shí)用工具概述 5.1.2. mysqld-max擴(kuò)展MySQL服務(wù)器 5.1.3. mysqld_safe:MySQL服務(wù)器啟動(dòng)腳本 5.1.4. mysql.server:MySQL服務(wù)器啟動(dòng)腳本 5.1.5. mysqld_multi:管理多個(gè)MySQL服務(wù)器的程序 5.2. mysqlmanager:MySQL實(shí)例管理器 5.2.1. 用MySQL實(shí)例管理器啟動(dòng)MySQL服務(wù)器 5.2.2. 連接到MySQL實(shí)例管理器并創(chuàng)建用戶賬戶 5.2.3. MySQL實(shí)例管理器命令行選項(xiàng) 5.2.4. MySQL實(shí)例管理器配置文件 5.2.5. MySQL實(shí)例管理器識(shí)別的命令 5.3. mysqld:MySQL服務(wù)器 5.3.1. mysqld命令行選項(xiàng) 5.3.2. SQL服務(wù)器模式 5.3.3. 服務(wù)器系統(tǒng)變量 5.3.4. 服務(wù)器狀態(tài)變量 5.4. mysql_fix_privilege_tables:升級(jí)MySQL系統(tǒng)表 5.5. MySQL服務(wù)器關(guān)機(jī)進(jìn)程 5.6. 一般安全問(wèn)題 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻擊者面前保持安全 5.6.3. Mysqld安全相關(guān)啟動(dòng)選項(xiàng) 5.6.4. LOAD DATA LOCAL安全問(wèn)題 5.7. MySQL訪問(wèn)權(quán)限系統(tǒng) 5.7.1. 權(quán)限系統(tǒng)的作用 5.7.2. 權(quán)限系統(tǒng)工作原理 5.7.3. MySQL提供的權(quán)限 5.7.4. 與MySQL服務(wù)器連接 5.7.5. 訪問(wèn)控制 5.7.6. 訪問(wèn)控制 5.7.7. 權(quán)限更改何時(shí)生效 5.7.8. 拒絕訪問(wèn)錯(cuò)誤的原因 5.7.9. MySQL 4.1中的密碼哈希處理 5.8. MySQL用戶賬戶管理 5.8.1. MySQL用戶名和密碼 5.8.2. 向MySQL增加新用戶賬戶 5.8.3. 從MySQL刪除用戶賬戶 5.8.4. 限制賬戶資源 5.8.5. 設(shè)置賬戶密碼 5.8.6. 使你的密碼安全 5.8.7. 使用安全連接 5.9. 備份與恢復(fù) 5.9.1. 數(shù)據(jù)庫(kù)備份 5.9.2. 示例用備份與恢復(fù)策略 5.9.3. 自動(dòng)恢復(fù) 5.9.4. 表維護(hù)和崩潰恢復(fù) 5.9.5. myisamchk:MyISAM表維護(hù)實(shí)用工具 5.9.6. 建立表維護(hù)計(jì)劃 5.9.7. 獲取關(guān)于表的信息 5.10. MySQL本地化和國(guó)際應(yīng)用 5.10.1. 數(shù)據(jù)和排序用字符集 5.10.2. 設(shè)置錯(cuò)誤消息語(yǔ)言 5.10.3. 添加新的字符集 5.10.4. 字符定義數(shù)組 5.10.5. 字符串比較支持 5.10.6. 多字節(jié)字符支持 5.10.7. 字符集問(wèn)題 5.10.8. MySQL服務(wù)器時(shí)區(qū)支持 5.11. MySQL日志文件 5.11.1. 錯(cuò)誤日志 5.11.2. 通用查詢?nèi)罩?/a> 5.11.3. 二進(jìn)制日志 5.11.4. 慢速查詢?nèi)罩?/a> 5.11.5. 日志文件維護(hù) 5.12. 在同一臺(tái)機(jī)器上運(yùn)行多個(gè)MySQL服務(wù)器 5.12.1. 在Windows下運(yùn)行多個(gè)服務(wù)器 5.12.2. 在Unix中運(yùn)行多個(gè)服務(wù)器 5.12.3. 在多服務(wù)器環(huán)境中使用客戶端程序 5.13. MySQL查詢高速緩沖 5.13.1. 查詢高速緩沖如何工作 5.13.2. 查詢高速緩沖SELECT選項(xiàng) 5.13.3. 查詢高速緩沖配置 5.13.4. 查詢高速緩沖狀態(tài)和維護(hù) 6. MySQL中的復(fù)制 6.1. 復(fù)制介紹 6.2. 復(fù)制實(shí)施概述 6.3. 復(fù)制實(shí)施細(xì)節(jié) 6.3.1. 復(fù)制主線程狀態(tài) 6.3.2. 復(fù)制從I/O線程狀態(tài) 6.3.3. 復(fù)制從SQL線程狀態(tài) 6.3.4. 復(fù)制傳遞和狀態(tài)文件 6.4. 如何設(shè)置復(fù)制 6.5. 不同MySQL版本之間的復(fù)制兼容性 6.6. 升級(jí)復(fù)制設(shè)置 6.6.1. 將復(fù)制升級(jí)到5.0版 6.7. 復(fù)制特性和已知問(wèn)題 6.8. 復(fù)制啟動(dòng)選項(xiàng) 6.9. 復(fù)制FAQ 6.10. 復(fù)制故障診斷與排除 6.11. 通報(bào)復(fù)制缺陷 6.12. 多服務(wù)器復(fù)制中的Auto-Increment 7. 優(yōu)化 7.1. 優(yōu)化概述 7.1.1. MySQL設(shè)計(jì)局限與折衷 7.1.2. 為可移植性設(shè)計(jì)應(yīng)用程序 7.1.3. 我們已將MySQL用在何處? 7.1.4. MySQL基準(zhǔn)套件 7.1.5. 使用自己的基準(zhǔn) 7.2. 優(yōu)化SELECT語(yǔ)句和其它查詢 7.2.1. EXPLAIN語(yǔ)法(獲取SELECT相關(guān)信息) 7.2.2. 估計(jì)查詢性能 7.2.3. SELECT查詢的速度 7.2.4. MySQL怎樣優(yōu)化WHERE子句 7.2.5. 范圍優(yōu)化 7.2.6. 索引合并優(yōu)化 7.2.7. MySQL如何優(yōu)化IS NULL 7.2.8. MySQL如何優(yōu)化DISTINCT 7.2.9. MySQL如何優(yōu)化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何優(yōu)化嵌套Join 7.2.11. MySQL如何簡(jiǎn)化外部聯(lián)合 7.2.12. MySQL如何優(yōu)化ORDER BY 7.2.13. MySQL如何優(yōu)化GROUP BY 7.2.14. MySQL如何優(yōu)化LIMIT 7.2.15. 如何避免表掃描 7.2.16. INSERT語(yǔ)句的速度 7.2.17. UPDATE語(yǔ)句的速度 7.2.18. DELETE語(yǔ)句的速度 7.2.19. 其它優(yōu)化技巧 7.3. 鎖定事宜 7.3.1. 鎖定方法 7.3.2. 表鎖定事宜 7.4. 優(yōu)化數(shù)據(jù)庫(kù)結(jié)構(gòu) 7.4.1. 設(shè)計(jì)選擇 7.4.2. 使你的數(shù)據(jù)盡可能小 7.4.3. 列索引 7.4.4. 多列索引 7.4.5. MySQL如何使用索引 7.4.6. MyISAM鍵高速緩沖 7.4.7. MyISAM索引統(tǒng)計(jì)集合 7.4.8. MySQL如何計(jì)算打開(kāi)的表 7.4.9. MySQL如何打開(kāi)和關(guān)閉表 7.4.10. 在同一個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建多個(gè)表的缺陷 7.5. 優(yōu)化MySQL服務(wù)器 7.5.1. 系統(tǒng)因素和啟動(dòng)參數(shù)的調(diào)節(jié) 7.5.2. 調(diào)節(jié)服務(wù)器參數(shù) 7.5.3. 控制查詢優(yōu)化器的性能 7.5.4. 編譯和鏈接怎樣影響MySQL的速度 7.5.5. MySQL如何使用內(nèi)存 7.5.6. MySQL如何使用DNS 7.6. 磁盤(pán)事宜 7.6.1. 使用符號(hào)鏈接 8. 客戶端和實(shí)用工具程序 8.1. 客戶端腳本和實(shí)用工具概述 8.2. myisampack:生成壓縮、只讀MyISAM表 8.3. mysql:MySQL命令行工具 8.3.1. 選項(xiàng) 8.3.2. mysql命令 8.3.3. 怎樣從文本文件執(zhí)行SQL語(yǔ)句 8.3.4. mysql技巧 8.4. mysqlaccess:用于檢查訪問(wèn)權(quán)限的客戶端 8.5. mysqladmin:用于管理MySQL服務(wù)器的客戶端 8.6. mysqlbinlog:用于處理二進(jìn)制日志文件的實(shí)用工具 8.7. mysqlcheck:表維護(hù)和維修程序 8.8. mysqldump:數(shù)據(jù)庫(kù)備份程序 8.9. mysqlhotcopy:數(shù)據(jù)庫(kù)備份程序 8.10. mysqlimport:數(shù)據(jù)導(dǎo)入程序 8.11. mysqlshow-顯示數(shù)據(jù)庫(kù)、表和列信息 8.12. myisamlog:顯示MyISAM日志文件內(nèi)容 8.13. perror:解釋錯(cuò)誤代碼 8.14. replace:字符串替換實(shí)用工具 8.15. mysql_zap:殺死符合某一模式的進(jìn)程 9. 語(yǔ)言結(jié)構(gòu) 9.1. 文字值 9.1.1. 字符串 9.1.2. 數(shù)值 9.1.3. 十六進(jìn)制值 9.1.4. 布爾值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 數(shù)據(jù)庫(kù)、表、索引、列和別名 9.2.1. 識(shí)別符限制條件 9.2.2. 識(shí)別符大小寫(xiě)敏感性 9.3. 用戶變量 9.4. 系統(tǒng)變量 9.4.1. 結(jié)構(gòu)式系統(tǒng)變量 9.5. 注釋語(yǔ)法 9.6. MySQL中保留字的處理 10. 字符集支持 10.1. 常規(guī)字符集和校對(duì) 10.2. MySQL中的字符集和校對(duì) 10.3. 確定默認(rèn)字符集和校對(duì) 10.3.1. 服務(wù)器字符集和校對(duì) 10.3.2. 數(shù)據(jù)庫(kù)字符集和校對(duì) 10.3.3. 表字符集和校對(duì) 10.3.4. 列字符集和校對(duì) 10.3.5. 字符集和校對(duì)分配示例 10.3.6. 連接字符集和校對(duì) 10.3.7. 字符串文字字符集和校對(duì) 10.3.8. 在SQL語(yǔ)句中使用COLLATE 10.3.9. COLLATE子句優(yōu)先 10.3.10. BINARY操作符 10.3.11. 校對(duì)確定較為復(fù)雜的一些特殊情況 10.3.12. 校對(duì)必須適合字符集 10.3.13. 校對(duì)效果的示例 10.4. 字符集支持影響到的操作 10.4.1. 結(jié)果字符串 10.4.2. CONVERT() 10.4.3. CAST() 10.4.4. SHOW語(yǔ)句 10.5. Unicode支持 10.6. 用于元數(shù)據(jù)的UTF8 10.7. 與其它DBMS的兼容性 10.8. 新字符集配置文件格式 10.9. 國(guó)家特有字符集 10.10. MySQL支持的字符集和校對(duì) 10.10.1. Unicode字符集 10.10.2. 西歐字符集 10.10.3. 中歐字符集 10.10.4. 南歐與中東字符集 10.10.5. 波羅的海字符集 10.10.6. 西里爾字符集 10.10.7. 亞洲字符集 11. 列類型 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表方面的問(wèn)題 15.2. InnoDB存儲(chǔ)引擎 15.2.1. InnoDB概述 15.2.2. InnoDB聯(lián)系信息 15.2.3. InnoDB配置 15.2.4. InnoDB啟動(dòng)選項(xiàng) 15.2.5. 創(chuàng)建InnoDB表空間 15.2.6. 創(chuàng)建InnoDB表 15.2.7. 添加和刪除InnoDB數(shù)據(jù)和日志文件 15.2.8. InnoDB數(shù)據(jù)庫(kù)的備份和恢復(fù) 15.2.9. 將InnoDB數(shù)據(jù)庫(kù)移到另一臺(tái)機(jī)器上 15.2.10. InnoDB事務(wù)模型和鎖定 15.2.11. InnoDB性能調(diào)節(jié)提示 15.2.12. 多版本的實(shí)施 15.2.13. 表和索引結(jié)構(gòu) 15.2.14. 文件空間管理和磁盤(pán)I/O 15.2.15. InnoDB錯(cuò)誤處理 15.2.16. 對(duì)InnoDB表的限制 15.2.17. InnoDB故障診斷與排除 15.3. MERGE存儲(chǔ)引擎 15.3.1. MERGE表方面的問(wèn)題 15.4. MEMORY (HEAP)存儲(chǔ)引擎 15.5. BDB (BerkeleyDB)存儲(chǔ)引擎 15.5.1. BDB支持的操作系統(tǒng) 15.5.2. 安裝BDB 15.5.3. BDB啟動(dòng)選項(xiàng) 15.5.4. BDB表的特性 15.5.5. 修改BDB所需的事宜 15.5.6. 對(duì)BDB表的限制 15.5.7. 使用BDB表時(shí)可能出現(xiàn)的錯(cuò)誤 15.6. EXAMPLE存儲(chǔ)引擎 15.7. FEDERATED存儲(chǔ)引擎 15.7.1. 安裝FEDERATED存儲(chǔ)引擎 15.7.2. FEDERATED存儲(chǔ)引擎介紹 15.7.3. 如何使用FEDERATED表 15.7.4. FEDERATED存儲(chǔ)引擎的局限性 15.8. ARCHIVE存儲(chǔ)引擎 15.9. CSV存儲(chǔ)引擎 15.10. BLACKHOLE存儲(chǔ)引擎 16. 編寫(xiě)自定義存儲(chǔ)引擎 16.1. 前言 16.2. 概述 16.3. 創(chuàng)建存儲(chǔ)引擎源文件 NoName 16.5. 對(duì)處理程序進(jìn)行實(shí)例化處理 16.6. 定義表擴(kuò)展 16.7. 創(chuàng)建表 16.8. 打開(kāi)表 16.9. 實(shí)施基本的表掃描功能 16.9.1. 實(shí)施store_lock()函數(shù) 16.9.2. 實(shí)施external_lock()函數(shù) 16.9.3. 實(shí)施rnd_init()函數(shù) 16.9.4. 實(shí)施info()函數(shù) 16.9.5. 實(shí)施extra()函數(shù) 16.9.6. 實(shí)施rnd_next()函數(shù) 16.10. 關(guān)閉表 NoName NoName NoName 16.14. API引用 16.14.1. bas_ext 16.14.2. close 16.14.3. create 16.14.4. delete_row 16.14.5. delete_table 16.14.6. external_lock 16.14.7. extra 16.14.8. info 16.14.9. open 16.14.10. rnd_init 16.14.11. rnd_next 16.14.12. store_lock 16.14.13. update_row 16.14.14. write_row 17. MySQL簇 17.1. MySQL簇概述 17.2. MySQL簇的基本概念 17.3. 多計(jì)算機(jī)的簡(jiǎn)單基礎(chǔ)知識(shí) 17.3.1. 硬件、軟件和聯(lián)網(wǎng) 17.3.2. 安裝 17.3.3. 配置 17.3.4. 首次啟動(dòng) 17.3.5. 加載示例數(shù)據(jù)并執(zhí)行查詢 17.3.6. 安全關(guān)閉和重啟 17.4. MySQL簇的配置 17.4.1. 從源碼創(chuàng)建MySQL簇 17.4.2. 安裝軟件 17.4.3. MySQL簇的快速測(cè)試設(shè)置 17.4.4. 配置文件 17.5. MySQL簇中的進(jìn)程管理 17.5.1. 用于MySQL簇的MySQL服務(wù)器進(jìn)程使用 17.5.2. ndbd,存儲(chǔ)引擎節(jié)點(diǎn)進(jìn)程 17.5.3. ndb_mgmd,“管理服務(wù)器”進(jìn)程 17.5.4. ndb_mgm,“管理客戶端”進(jìn)程 17.5.5. 用于MySQL簇進(jìn)程的命令選項(xiàng) 17.6. MySQL簇的管理 17.6.1. MySQL簇的啟動(dòng)階段 17.6.2. “管理客戶端”中的命令 17.6.3. MySQL簇中生成的事件報(bào)告 17.6.4. 單用戶模式 17.6.5. MySQL簇的聯(lián)機(jī)備份 17.7. 使用與MySQL簇的高速互連 17.7.1. 配置MySQL簇以使用SCI套接字 17.7.2. 理解簇互連的影響 17.8. MySQL簇的已知限制 17.9. MySQL簇發(fā)展的重要?dú)v程 17.9.1. MySQL 5.0中的MySQL簇變化 17.9.2. 關(guān)于MySQL簇的MySQL 5.1發(fā)展歷程 17.10. MySQL簇常見(jiàn)問(wèn)題解答 17.11. MySQL簇術(shù)語(yǔ)表 18. 分區(qū) 18.1. MySQL中的分區(qū)概述 18.2. 分區(qū)類型 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ù)制:常見(jiàn)問(wèn)題 20.4. 存儲(chǔ)子程序和觸發(fā)程序的二進(jìn)制日志功能 21. 觸發(fā)程序 21.1. CREATE TRIGGER語(yǔ)法 21.2. DROP TRIGGER語(yǔ)法 21.3. 使用觸發(fā)程序 22. 視圖 22.1. ALTER VIEW語(yǔ)法 22.2. CREATE VIEW語(yǔ)法 22.3. DROP VIEW語(yǔ)法 22.4. SHOW CREATE VIEW語(yǔ)法 23. INFORMATION_SCHEMA信息數(shù)據(jù)庫(kù) 23.1. INFORMATION_SCHEMA表 23.1.1. INFORMATION_SCHEMA SCHEMATA表 23.1.2. INFORMATION_SCHEMA TABLES表 23.1.3. INFORMATION_SCHEMA COLUMNS表 23.1.4. INFORMATION_SCHEMA STATISTICS表 23.1.5. INFORMATION_SCHEMA USER_PRIVILEGES表 23.1.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES表 23.1.7. INFORMATION_SCHEMA TABLE_PRIVILEGES表 23.1.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES表 23.1.9. INFORMATION_SCHEMA CHARACTER_SETS表 23.1.10. INFORMATION_SCHEMA COLLATIONS表 23.1.11. INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY表 23.1.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS表 23.1.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE表 23.1.14. INFORMATION_SCHEMA ROUTINES表 23.1.15. INFORMATION_SCHEMA VIEWS表 23.1.16. INFORMATION_SCHEMA TRIGGERS表 23.1.17. 其他INFORMATION_SCHEMA表 NoName 24. 精度數(shù)學(xué) 24.1. 數(shù)值的類型 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ǔ)句方面的問(wèn)題 25.2.9. 多查詢執(zhí)行的C API處理 25.2.10. 日期和時(shí)間值的C API處理 25.2.11. C API線程函數(shù)介紹 25.2.12. C API嵌入式服務(wù)器函數(shù)介紹 25.2.13. 使用C API時(shí)的常見(jiàn)問(wèn)題 25.2.14. 創(chuàng)建客戶端程序 25.2.15. 如何生成線程式客戶端 25.3. MySQL PHP API 25.3.1. 使用MySQL和PHP的常見(jiàn)問(wèn)題 25.4. MySQL Perl API 25.5. MySQL C++ API 25.5.1. Borland C++ 25.6. MySQL Python API 25.7. MySQL Tcl API 25.8. MySQL Eiffel Wrapper 25.9. MySQL程序開(kāi)發(fā)實(shí)用工具 25.9.1. msql2mysql:轉(zhuǎn)換mSQL程序以用于MySQL 25.9.2. mysql_config:獲取編譯客戶端的編譯選項(xiàng) 26. 連接器 26.1. MySQL Connector/ODBC 26.1.1. MyODBC介紹 26.1.2. 關(guān)于ODBC和MyODBC的一般信息 26.1.3. 如何安裝MyODBC 26.1.4. 在Windows平臺(tái)上從二進(jìn)制版本安裝MyODBC 26.1.5. I在Unix平臺(tái)上從二進(jìn)制版本安裝MyODBC 26.1.6. 在Windows平臺(tái)上從源碼版本安裝MyODBC 26.1.7. 在Unix平臺(tái)上從源碼版本安裝MyODBC 26.1.8. 從BitKeeper開(kāi)發(fā)源碼樹(shù)安裝MyODBC 26.1.9. MyODBC配置 26.1.10. 與MyODBC連接相關(guān)的事宜 26.1.11. MyODBC和Microsoft Access 26.1.12. MyODBC和Microsoft VBA及ASP 26.1.13. MyODBC和第三方ODBC工具 26.1.14. MyODBC通用功能 26.1.15. 基本的MyODBC應(yīng)用步驟 26.1.16. MyODBC API引用 26.1.17. MyODBC數(shù)據(jù)類型 26.1.18. MyODBC錯(cuò)誤代碼 26.1.19. MyODBC與VB:ADO、DAO和RDO 26.1.20. MyODBC與Microsoft.NET 26.1.21. 感謝 26.2. MySQL Connector/NET 26.2.1. 前言 26.2.2. 下載并安裝MySQL Connector/NET 26.2.3. Connector/NET體系結(jié)構(gòu) 26.2.4. 使用MySQL Connector/NET 26.2.5. MySQL Connector/NET變更史 26.3. MySQL Connector/J 26.3.1. 基本的JDBC概念 26.3.2. 安裝 Connector/J 26.3.3. JDBC引用 26.3.4. 與J2EE和其他Java框架一起使用 Connector/J 26.3.5. 診斷 Connector/J方面的問(wèn)題 26.3.6. Changelog 26.4. MySQL Connector/MXJ 26.4.1. 前言 26.4.2. 支持平臺(tái): 26.4.3. Junit測(cè)試要求 26.4.4. 運(yùn)行Junit測(cè)試 26.4.5. 作為JDBC驅(qū)動(dòng)程序的一部分運(yùn)行 26.4.6. 在Java對(duì)象中運(yùn)行 26.4.7. MysqldResource API 26.4.8. 在JMX代理(custom)中運(yùn)行 26.4.9. 部署在標(biāo)準(zhǔn)的JMX代理環(huán)境下 (JBoss) 26.4.10. 安裝 27. 擴(kuò)展MySQL 27.1. MySQL內(nèi)部控件 27.1.1. MySQL線程 27.1.2. MySQL測(cè)試套件 27.2. 為MySQL添加新函數(shù) 27.2.1. 自定義函數(shù)接口的特性 27.2.2. CREATE FUNCTION/DROP FUNCTION語(yǔ)法 27.2.3. 添加新的自定義函數(shù) 27.2.4. 添加新的固有函數(shù) 27.3. 為MySQL添加新步驟 27.3.1. 步驟分析 27.3.2. 編寫(xiě)步驟 A. 問(wèn)題和常見(jiàn)錯(cuò)誤 A.1. 如何確定導(dǎo)致問(wèn)題的原因 A.2. 使用MySQL程序時(shí)的常見(jiàn)錯(cuò)誤 A.2.1. 拒絕訪問(wèn) A.2.2. 無(wú)法連接到[local] MySQL服務(wù)器 A.2.3. 客戶端不支持鑒定協(xié)議 A.2.4. 輸入密碼時(shí)出現(xiàn)密碼錯(cuò)誤 NoName A.2.6. 連接數(shù)過(guò)多 A.2.7. 內(nèi)存溢出 A.2.8. MySQL服務(wù)器不可用 A.2.9. 信息包過(guò)大 A.2.10. 通信錯(cuò)誤和失效連接 A.2.11. 表已滿 A.2.12. 無(wú)法創(chuàng)建文件/寫(xiě)入文件 A.2.13. 命令不同步 A.2.14. 忽略用戶 A.2.15. 表tbl_name不存在 A.2.16. 無(wú)法初始化字符集 A.2.17. 文件未找到 A.3. 與安裝有關(guān)的事宜 A.3.1. 與MySQL客戶端庫(kù)的鏈接問(wèn)題 A.3.2. 如何以普通用戶身份運(yùn)行MySQL A.3.3. 與文件許可有關(guān)的問(wèn)題 A.4. 與管理有關(guān)的事宜 A.4.1. 如何復(fù)位根用戶密碼 A.4.2. 如果MySQL依然崩潰,應(yīng)作些什么 A.4.3. MySQL處理磁盤(pán)滿的方式 A.4.4. MySQL將臨時(shí)文件儲(chǔ)存在哪里 A.4.5. 如何保護(hù)或更改MySQL套接字文件/tmp/mysql.sock A.4.6. 時(shí)區(qū)問(wèn)題 A.5. 與查詢有關(guān)的事宜 A.5.1. 搜索中的大小寫(xiě)敏感性 A.5.2. 使用DATE列方面的問(wèn)題 A.5.3. 與NULL值有關(guān)的問(wèn)題 A.5.4. 與列別名有關(guān)的問(wèn)題 A.5.5. 非事務(wù)表回滾失敗 A.5.6. 從相關(guān)表刪除行 A.5.7. 解決與不匹配行有關(guān)的問(wèn)題 A.5.8. 與浮點(diǎn)比較有關(guān)的問(wèn)題 A.6. 與優(yōu)化器有關(guān)的事宜 A.7. 與表定義有關(guān)的事宜 A.7.1. 與ALTER TABLE有關(guān)的問(wèn)題 A.7.2. 如何更改表中的列順序 A.7.3. TEMPORARY TABLE問(wèn)題 A.8. MySQL中的已知事宜 A.8.1. MySQL中的打開(kāi)事宜 B. 錯(cuò)誤代碼和消息 B.1. 服務(wù)器錯(cuò)誤代碼和消息 B.2. 客戶端錯(cuò)誤代碼和消息 C. 感謝 C.1. MySQL AB處的開(kāi)發(fā)人 C.2. MySQL貢獻(xiàn)人 C.3. 資料員和譯員 C.4. MySQL使用和包含的庫(kù) C.5. 支持MySQL的軟件包 C.6. 用于創(chuàng)建MySQL的工具 C.7. MySQL支持人員 D. MySQL變更史 D.1. 5.1.x版中的變更情況(開(kāi)發(fā)) D.1.1. 5.1.2版中的變更情況(尚未發(fā)布) D.1.2. 5.1.1版中的變更情況(尚未發(fā)布) D.2. MyODBC的變更情況 D.2.1. MyODBC 3.51.12的變更情況 D.2.2. MyODBC 3.51.11的變更情況 E. 移植到其他系統(tǒng) E.1. 調(diào)試MySQL服務(wù)器 E.1.1. 針對(duì)調(diào)試編譯MySQL E.1.2. 創(chuàng)建跟蹤文件 E.1.3. 在gdb環(huán)境下調(diào)試mysqld E.1.4. 使用堆棧跟蹤 E.1.5. 使用日志文件找出mysqld中的錯(cuò)誤原因 E.1.6. 如果出現(xiàn)表崩潰,請(qǐng)生成測(cè)試案例 E.2. 調(diào)試MySQL客戶端 E.3. DBUG軟件包 E.4. 關(guān)于RTS線程的注釋 E.5. 線程軟件包之間的差異 F. 環(huán)境變量 G. MySQL正則表達(dá)式 H. MySQL中的限制 H.1. 聯(lián)合的限制 I. 特性限制 I.1. 對(duì)存儲(chǔ)子程序和觸發(fā)程序的限制 I.2. 對(duì)服務(wù)器端光標(biāo)的限制 I.3. 對(duì)子查詢的限制 I.4. 對(duì)視圖的限制 I.5. 對(duì)XA事務(wù)的限制 J. GNU通用公共許可 K. MySQL FLOSS許可例外 索引
characters

第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ù)引擎的列類型

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

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

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

·???????? M

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

·???????? D

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

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

11.1.?列類型概述

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

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

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

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

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

SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一個(gè)別名。

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

警告:應(yīng)當(dāng)清楚,當(dāng)使用在整數(shù)值(其中一個(gè)是UNSIGNED類型)之間使用減號(hào)時(shí),結(jié)果是無(wú)符號(hào)。參見(jiàn)12.8節(jié),“Cast函數(shù)和操作符”。

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

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

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

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

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

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

在將來(lái),將根據(jù)標(biāo)準(zhǔn)SQL引入完全布爾類型的處理。

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

小的整數(shù)。帶符號(hào)的范圍是-3276832767。無(wú)符號(hào)的范圍是065535。

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

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

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

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

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

這是INT的同義詞。

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

大整數(shù)。帶符號(hào)的范圍是-92233720368547758089223372036854775807。無(wú)符號(hào)的范圍是018446744073709551615。

應(yīng)清楚BIGINT列的下述內(nèi)容:

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

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

§???????? 當(dāng)使用整數(shù)在一個(gè)BIGINT列保存大的無(wú)符號(hào)的值時(shí)。

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

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

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

o??????? 當(dāng)兩個(gè)操作數(shù)均為整數(shù)值時(shí),-+* 操作符使用BIGINT算法。這說(shuō)明如果乘兩個(gè)大整數(shù)(或來(lái)自返回整數(shù)的函數(shù)),當(dāng)結(jié)果大于9223372036854775807時(shí),會(huì)得到意想不到的結(jié)果。

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

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

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

如果指定UNSIGNED,不允許負(fù)值。

使用浮點(diǎn)數(shù)可能會(huì)遇到意想不到的問(wèn)題,因?yàn)樵?span>MySQL中的所有計(jì)算用雙精度完成。參見(jiàn)A.5.7節(jié),“解決與不匹配行有關(guān)的問(wèn)題”。

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

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

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

如果指定UNSIGNED,不允許負(fù)值。

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

DOUBLE的同義詞。除了:如果SQL服務(wù)器模式包括REAL_AS_FLOAT選項(xiàng),REALFLOAT的同義詞而不是DOUBLE的同義詞。

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

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

FLOAT(p)語(yǔ)法與ODBC兼容。

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

壓縮的“嚴(yán)格”定點(diǎn)數(shù)。M是小數(shù)位數(shù)(精度)的總數(shù),D是小數(shù)點(diǎn)(標(biāo)度)后面的位數(shù)。小數(shù)點(diǎn)和(負(fù)數(shù))的‘-’符號(hào)不包括在M中。如果D0,則值沒(méi)有小數(shù)點(diǎn)或分?jǐn)?shù)部分。DECIMAL整數(shù)最大位數(shù)(M)65。支持的十進(jìn)制數(shù)的最大位數(shù)(D)30。如果D被省略, 默認(rèn)是0。如果M被省略, 默認(rèn)是10。

如果指定UNSIGNED,不允許負(fù)值。

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

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

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

11.1.2.?日期和時(shí)間類型概述

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

·???????? DATE

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

·???????? DATETIME

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

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

時(shí)間戳。范圍是'1970-01-01 00:00:00'2037年。

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

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

注釋:MySQL 4.1以前使用的TIMESTAMP格式在MySQL 5.1中不支持;關(guān)于舊格式的信息參見(jiàn)MySQL 4.1 參考手冊(cè)。

·???????? TIME

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

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

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

11.1.3.?字符串類型概述

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

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

MySQL 5.1字符串?dāng)?shù)據(jù)類型包括部分在MySQL 4.1之前的版本中沒(méi)有的特性:

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

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

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

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

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

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

關(guān)于MySQL 5.1中字符集的支持,參見(jiàn)第10章:字符集支持。

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

固定長(zhǎng)度字符串,當(dāng)保存時(shí)在右側(cè)填充空格以達(dá)到指定的長(zhǎng)度。M表示列長(zhǎng)度。M的范圍是0255個(gè)字符。

注釋:當(dāng)檢索CHAR值時(shí)尾部空格被刪除。

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

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的簡(jiǎn)寫(xiě)。NATIONAL CHAR(或其等效短形式NCHAR)是標(biāo)準(zhǔn)的定義CHAR列應(yīng)使用 默認(rèn)字符集的SQL方法。這在MySQL中為默認(rèn)值。

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

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

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

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

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

·???????? CHAR

這是CHAR(1)的同義詞。

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

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

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

VARCHAR是字符VARYING的簡(jiǎn)寫(xiě)。

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

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

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

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

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

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

·???????? TINYBLOB

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

·???????? TINYTEXT

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

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

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

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

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

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

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

·???????? MEDIUMBLOB

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

·???????? MEDIUMTEXT

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

·???????? LONGBLOB

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

·???????? LONGTEXT

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

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

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

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

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

11.2.?數(shù)值類型

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

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

作為SQL標(biāo)準(zhǔn)的擴(kuò)展,MySQL也支持整數(shù)類型TINYINT、MEDIUMINTBIGINT。下面的表顯示了需要的每個(gè)整數(shù)類型的存儲(chǔ)和范圍。

類型

字節(jié)

最小值

最大值

?

?

(帶符號(hào)的/無(wú)符號(hào)的)

(帶符號(hào)的/無(wú)符號(hào)的)

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還支持選擇在該類型關(guān)鍵字后面的括號(hào)內(nèi)指定整數(shù)值的顯示寬度(例如,INT(4))。該可選顯示寬度規(guī)定用于顯示寬度小于指定的列寬度的值時(shí)從左側(cè)填滿寬度。

顯示寬度并不限制可以在列內(nèi)保存的值的范圍,也不限制超過(guò)列的指定寬度的值的顯示。

當(dāng)結(jié)合可選擴(kuò)展屬性ZEROFILL使用時(shí), 默認(rèn)補(bǔ)充的空格用零代替。例如,對(duì)于聲明為INT(5) ZEROFILL的列,值4檢索為00004。請(qǐng)注意如果在整數(shù)列保存超過(guò)顯示寬度的一個(gè)值,當(dāng)MySQL為復(fù)雜聯(lián)接生成臨時(shí)表時(shí)會(huì)遇到問(wèn)題,因?yàn)樵谶@些情況下MySQL相信數(shù)據(jù)適合原列寬度。

所有整數(shù)類型可以有一個(gè)可選(非標(biāo)準(zhǔn))屬性UNSIGNED。當(dāng)你想要在列內(nèi)只允許非負(fù)數(shù)和該列需要較大的上限數(shù)值范圍時(shí)可以使用無(wú)符號(hào)值。

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

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

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

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

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

MySQLDOUBLE視為DOUBLE PRECISION(非標(biāo)準(zhǔn)擴(kuò)展)的同義詞。MySQL還將REAL視為DOUBLE PRECISION(非標(biāo)準(zhǔn)擴(kuò)展)的同義詞,除非SQL服務(wù)器模式包括REAL_AS_FLOAT選項(xiàng)。

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

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

salary DECIMAL(5,2)

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

MySQL 5.1中以二進(jìn)制格式保存DECIMALNUMERIC值。

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

在標(biāo)準(zhǔn)SQL中,語(yǔ)法DECIMAL(M)等價(jià)于DECIMAL(M,0)。同樣,語(yǔ)法DECIMAL等價(jià)于DECIMAL(M,0),可以通過(guò)計(jì)算確定M的值。在MySQL 5.1中支持DECIMALNUMERIC數(shù)據(jù)類型的變量形式。M默認(rèn)值是10。

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

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

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

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

當(dāng)要在一個(gè)數(shù)值列內(nèi)保存一個(gè)超出該列允許范圍的值時(shí),MySQL的操作取決于此時(shí)有效的SQL模式。如果模式未設(shè)置,MySQL將值裁剪到范圍的相應(yīng)端點(diǎn),并保存裁減好的值。但是,如果模式設(shè)置為traditional(“嚴(yán)格模式),超出范圍的值將被拒絕并提示錯(cuò)誤,并且根據(jù)SQL標(biāo)準(zhǔn)插入會(huì)失敗。參見(jiàn)5.3.2節(jié),“SQL服務(wù)器模式”。

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

如果在浮點(diǎn)或定點(diǎn)列中分配的值超過(guò)指定(或默認(rèn))精度和標(biāo)度規(guī)定的范圍,MySQL以非嚴(yán)格模式保存表示范圍相應(yīng)端點(diǎn)的值。

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

11.3.?日期和時(shí)間類型

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

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

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

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

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

當(dāng)使用日期和時(shí)間類型時(shí)應(yīng)記住以下幾點(diǎn):

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

·???????? 包含兩位年值的日期會(huì)令人模糊,因?yàn)槭兰o(jì)不知道。MySQL使用以下規(guī)則解釋兩位年值:

o??????? 70-99范圍的年值轉(zhuǎn)換為1970-1999

o??????? 00-69范圍的年值轉(zhuǎn)換為2000-2069。

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

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

·???????? 當(dāng) MySQL遇到一個(gè)日期或時(shí)間類型的超出范圍或?qū)τ谠擃愋筒缓戏ǖ闹禃r(shí)(如本節(jié)開(kāi)始所描述),它將該值轉(zhuǎn)換為該類的“”值。一個(gè)例外是超出范圍的TIME值被裁剪到TIME范圍的相應(yīng)端點(diǎn)。

下面的表顯示了各類“”值的格式。請(qǐng)注意如果啟用NO_ZERO_DATE SQL模式,使用這些值會(huì)產(chǎn)生警告。

列類型

”值

DATETIME

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

DATE

'0000-00-00'

TIMESTAMP

00000000000000

TIME

'00:00:00'

YEAR

0000

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

·???????? MyODBC中使用的“”日期或時(shí)間值在MyODBC 2.50.12和以上版本中被自動(dòng)轉(zhuǎn)換為NULL,因?yàn)?span>ODBC不能處理此類值。

11.3.1.?DATETIME、DATE和TIMESTAMP類型

11.3.1.1. 自MySQL 4.1以來(lái)的TIMESTAMP屬性

DATETIME、DATETIMESTAMP類型是相關(guān)的。該節(jié)描述了它們的特征,它們的相似點(diǎn)和不同點(diǎn)。

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

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

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

可以使用任何常見(jiàn)格式指定DATETIMEDATETIMESTAMP值:

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

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

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

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

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

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

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

無(wú)效DATETIME、DATE或者TIMESTAMP值被轉(zhuǎn)換為相應(yīng)類型的“”值('0000-00-00 00:00:00'、'0000-00-00'或者00000000000000)。

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

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

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

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

·???????? 如果你為一個(gè)DATETIMETIMESTAMP對(duì)象分配一個(gè)DATE值,結(jié)果值的時(shí)間部分被設(shè)置為'00:00:00',因?yàn)?span>DATE值未包含時(shí)間信息。

·???????? 如果你為一個(gè)DATE對(duì)象分配一個(gè)DATETIMETIMESTAMP值,結(jié)果值的時(shí)間部分被刪除,因?yàn)?span>DATE值未包含時(shí)間信息。

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

當(dāng)指定日期值時(shí)請(qǐng)注意某些缺陷:

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

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

在嚴(yán)格模式,非法日期不被接受,并且不轉(zhuǎn)換。

詳細(xì)信息參見(jiàn)5.3.2節(jié),“SQL服務(wù)器模式”。

·???????? 包含兩位年值的日期會(huì)令人模糊,因?yàn)槭兰o(jì)不知道。MySQL使用以下規(guī)則解釋兩位年值:

o??????? 00-69范圍的年值轉(zhuǎn)換為2000-2069。

o??????? 70-99范圍的年值轉(zhuǎn)換為1970-1999。

11.3.1.1.?自MySQL 4.1以來(lái)的TIMESTAMP屬性

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

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

MySQL服務(wù)器也可以以MAXDB模式運(yùn)行。當(dāng)服務(wù)器以該模式運(yùn)行時(shí),TIMESTAMPDATETIME相等。也就是說(shuō),如果創(chuàng)建表時(shí)服務(wù)器以MAXDB模式運(yùn)行,TIMESTAMP列創(chuàng)建為DATETIME列。結(jié)果是,該列使用DATETIME顯示格式,有相同的值范圍,并且沒(méi)有自動(dòng)對(duì)當(dāng)前的日期和時(shí)間進(jìn)行初始化或更新。

要想啟用MAXDB模式,在啟動(dòng)服務(wù)器時(shí)使用--sql-mode=MAXDB服務(wù)器選項(xiàng)或在運(yùn)行時(shí)通過(guò)設(shè)置全局sql_mode變量將SQL服務(wù)器模式設(shè)置為MAXDB

mysql> SET GLOBAL sql_mode=MAXDB;

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

mysql> SET SESSION sql_mode=MAXDB;

?

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

你可以非常靈便地確定什么時(shí)候初始化和更新TIMESTAMP和對(duì)哪些列進(jìn)行初始化和更新:

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

·???????? 你可以指定哪個(gè)TIMESTAMP列自動(dòng)初始化或更新為當(dāng)前的日期和時(shí)間。不再需要為第1個(gè)TIMESTAMP列。

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

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

·???????? DEFAULT NULL與第1個(gè)TIMESTAMP 列的DEFAULT CURRENT_TIMESTAMP相同。對(duì)于其它TIMESTAMP列,DEFAULT NULL被視為DEFAULT 0。

·???????? 表內(nèi)的任何一個(gè)TIMESTAMP列可以設(shè)置為自動(dòng)初始化為當(dāng)前時(shí)間戳和/或更新。

·???????? CREATE TABLE語(yǔ)句中,可以用下面的任何一種方式聲明第1個(gè)TIMESTAMP列:

o??????? DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP子句,列為默認(rèn)值使用當(dāng)前的時(shí)間戳,并且自動(dòng)更新。

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

o??????? DEFAULT CURRENT_TIMESTAMP子句不用ON UPDATE子句,列為默認(rèn)值使用當(dāng)前的時(shí)間戳但是不自動(dòng)更新。

o??????? 不用DEFAULT子句但用ON UPDATE CURRENT_TIMESTAMP子句,列有默認(rèn)值0并自動(dòng)更新。

o??????? 用常量DEFAULT值,列有給出的 默認(rèn)值。如果列有一個(gè)ON UPDATE CURRENT_TIMESTAMP子句,它自動(dòng)更新,否則不。

換句話說(shuō),你可以為初始值和自動(dòng)更新的值使用當(dāng)前的時(shí)間戳,或者其中一個(gè)使用,或者兩個(gè)皆不使用。(例如,你可以指定ON UPDATE來(lái)啟用自動(dòng)更新而不讓列自動(dòng)初始化)。

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

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

例子,下面這些語(yǔ)句是等效的:

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列指定自動(dòng)默認(rèn)或更新,必須通過(guò)將第1個(gè)TIMESTAMP列顯式分配一個(gè)常量DEFAULT值來(lái)禁用自動(dòng)初始化和更新。(例如,DEFAULT 0DEFAULT'2003-01-01 00:00:00')。然后,對(duì)于其它TIMESTAMP列,規(guī)則與第1個(gè)TIMESTAMP列相同,例外情況是不能忽略DEFAULTON UPDATE子句。如果這樣做,則不會(huì)自動(dòng)進(jìn)行初始化或更新。

例如:下面這些語(yǔ)句是等效的:

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);

可以對(duì)每個(gè)連接設(shè)置當(dāng)前的時(shí)區(qū),相關(guān)描述參見(jiàn)5.10.8節(jié),“MySQL服務(wù)器時(shí)區(qū)支持”。TIMESTAMP值以UTC格式保存,存儲(chǔ)時(shí)對(duì)當(dāng)前的時(shí)區(qū)進(jìn)行轉(zhuǎn)換,檢索時(shí)再轉(zhuǎn)換回當(dāng)前的時(shí)區(qū)。只要時(shí)區(qū)設(shè)定值為常量,便可以得到保存時(shí)的值。如果保存一個(gè)TIMESTAMP值,應(yīng)更改時(shí)區(qū)然后檢索該值,它與你保存的值不同。這是因?yàn)樵趦蓚€(gè)方向的轉(zhuǎn)換中沒(méi)有使用相同的時(shí)區(qū)。當(dāng)前的時(shí)區(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屬性,將列設(shè)置為NULL設(shè)置則會(huì)將它設(shè)置為當(dāng)前的時(shí)間戳。請(qǐng)注意允許NULL值的TIMESTAMP列不會(huì)采用當(dāng)前的時(shí)間戳,除非要么其 默認(rèn)值定義為CURRENT_TIMESTAMP,或者NOW()CURRENT_TIMESTAMP被插入到該列內(nèi)。換句話說(shuō),只有使用如下定義創(chuàng)建,定義為 NULLTIMESTAMP列才會(huì)自動(dòng)更新:

CREATE TABLE t (ts NULLDEFAULT CURRENT_TIMESTAMP);

否則-也就是說(shuō),如果使用NULL而不是DEFAULT TIMESTAMP來(lái)定義TIMESTAMP列,如下所示...

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

...則必須顯式插入一個(gè)對(duì)應(yīng)當(dāng)前日期和時(shí)間的值。例如:

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

11.3.2.?TIME類型

MySQL'HH:MM:SS'格式檢索和顯示TIME(或?qū)τ诖蟮男r(shí)值采用'HHH:MM:SS'格式)TIME值的范圍可以從'-838:59:59''838:59:59'。小時(shí)部分會(huì)因此大的原因是TIME類型不僅可以用于表示一天的時(shí)間(必須小于24小時(shí)),還可能為某個(gè)事件過(guò)去的時(shí)間或兩個(gè)事件之間的時(shí)間間隔(可以大于24小時(shí),或者甚至為負(fù))。

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

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

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

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

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

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

TIME列分配簡(jiǎn)寫(xiě)值時(shí)應(yīng)注意。沒(méi)有冒號(hào),MySQL解釋值時(shí)假定最右邊的兩位表示秒。(MySQL解釋TIME值為過(guò)去的時(shí)間而不是當(dāng)天的時(shí)間)。例如,你可能認(rèn)為'1112'1112表示'11:12:00'(11點(diǎn)過(guò)12),但MySQL將它們解釋為'00:11:12'(11分,12 )。同樣,'12'12 被解釋為 '00:00:12'。相反,TIME值中使用冒號(hào)則肯定被看作當(dāng)天的時(shí)間。也就是說(shuō),'11:12'表示'11:12:00',而不是'00:11:12'。

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

無(wú)效TIME值被轉(zhuǎn)換為'00:00:00'。請(qǐng)注意由于'00:00:00'本身是一個(gè)合法TIME值,只從表內(nèi)保存的一個(gè)'00:00:00'值還不能說(shuō)出原來(lái)的值是 '00:00:00'還是不合法的值。

11.3.3.?YEAR類型

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

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

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

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

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

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

·???????? 兩位整數(shù),范圍為199。1697099范圍的值被轉(zhuǎn)換為2001206919701999范圍的YEAR值。請(qǐng)注意兩位整數(shù)范圍與兩位字符串范圍稍有不同,因?yàn)槟悴荒苤苯訉⒘阒付閿?shù)字并將它解釋為2000。你必須將它指定為一個(gè)字符串'0''00'或它被解釋為0000

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

非法YEAR值被轉(zhuǎn)換為0000。

11.3.4.?Y2K事宜和日期類型

MySQL本身對(duì)于2000(Y2K)是安全的(參見(jiàn)1.4.5節(jié),“2000年兼容性”),但輸入給MySQL的值可能不安全。任何包含兩位年值的輸入都會(huì)令人模糊,因?yàn)槭兰o(jì)不知道。這些值必須解釋為四位形式,因?yàn)?span>MySQL內(nèi)部使用四位來(lái)保存年。

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

·???????? 00-69范圍的年值轉(zhuǎn)換為2000-2069。

·???????? 70-99范圍的年值轉(zhuǎn)換為1970-1999。

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

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

部分函數(shù)如MIN()MAX()TIMESTAMPYEAR轉(zhuǎn)換為一個(gè)數(shù)字。這說(shuō)明使用有兩位年值的值,這些函數(shù)不能工作正確。在這種情況下的修復(fù)方法是將TIMESTAMPYEAR轉(zhuǎn)換為四位年格式或使用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類型
字符串類型指CHAR、VARCHARBINARY、VARBINARY、BLOBTEXTENUMSET。該節(jié)描述了這些類型如何工作以及如何在查詢中使用這些類型。

11.4.1.?CHAR和VARCHAR類型

CHARVARCHAR類型類似,但它們保存和檢索的方式不同。它們的最大長(zhǎng)度和是否尾部空格被保留等方面也不同。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫(xiě)轉(zhuǎn)換。

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

CHAR列的長(zhǎng)度固定為創(chuàng)建表時(shí)聲明的長(zhǎng)度。長(zhǎng)度可以為從0255的任何值。當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫(xiě)轉(zhuǎn)換。

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

CHAR對(duì)比,VARCHAR值保存時(shí)只保存需要的字符數(shù),另加一個(gè)字節(jié)來(lái)記錄長(zhǎng)度(如果列聲明的長(zhǎng)度超過(guò)255,則使用兩個(gè)字節(jié))

VARCHAR值保存時(shí)不進(jìn)行填充。當(dāng)值保存和檢索時(shí)尾部的空格仍保留,符合標(biāo)準(zhǔn)SQL。

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

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

CHAR(4)

存儲(chǔ)需求

VARCHAR(4)

存儲(chǔ)需求

''

'????'

4個(gè)字節(jié)

''

1個(gè)字節(jié)

'ab'

'ab??'

4個(gè)字節(jié)

'ab '

3個(gè)字節(jié)

'abcd'

'abcd'

4個(gè)字節(jié)

'abcd'

5個(gè)字節(jié)

'abcdefgh'

'abcd'

4個(gè)字節(jié)

'abcd'

5個(gè)字節(jié)

請(qǐng)注意上表中最后一行的值只適用不使用嚴(yán)格模式時(shí);如果MySQL運(yùn)行在嚴(yán)格模式,超過(guò)列長(zhǎng)度不的值保存,并且會(huì)出現(xiàn)錯(cuò)誤。

CHAR(4)VARCHAR(4)列檢索的值并不總是相同,因?yàn)闄z索時(shí)從CHAR列刪除了尾部的空格。通過(guò)下面的例子說(shuō)明該差別:

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ù)分配給列的字符集校對(duì)規(guī)則對(duì)CHARVARCHAR列中的值進(jìn)行排序和比較。

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

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)

請(qǐng)注意所有MySQL版本均如此,并且它不受SQL服務(wù)器模式的影響。

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

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

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

11.4.2.?BINARY和VARBINARY類型

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

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

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

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

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

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

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

如果你計(jì)劃使用這些數(shù)據(jù)類型來(lái)保存二進(jìn)制數(shù)據(jù)并且需要檢索的值與保存的值完全相同,應(yīng)考慮前面所述的填充和裁剪特征。下面的例子說(shuō)明了用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)

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

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

11.4.3.?BLOB和TEXT類型

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

4TEXT類型:TINYTEXT、TEXT、MEDIUMTEXTLONGTEXT。這些對(duì)應(yīng)4BLOB類型,有相同的最大長(zhǎng)度和存儲(chǔ)需求。

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

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

TEXTBLOB列的存儲(chǔ)或檢索過(guò)程中,不存在大小寫(xiě)轉(zhuǎn)換。

當(dāng)未運(yùn)行在嚴(yán)格模式時(shí),如果你為BLOBTEXT列分配一個(gè)超過(guò)該列類型的最大長(zhǎng)度的值值,值被截取以保證適合。如果截掉的字符不是空格,將會(huì)產(chǎn)生一條警告。使用嚴(yán)格SQL模式,會(huì)產(chǎn)生錯(cuò)誤,并且值將被拒絕而不是截取并給出警告。參見(jiàn)5.3.2節(jié),“SQL服務(wù)器模式”。

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

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

請(qǐng)注意比較時(shí)將用空格對(duì)TEXT進(jìn)行擴(kuò)充以適合比較的對(duì)象,正如CHARVARCHAR。

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

·???????? BLOBTEXT列不能有 默認(rèn)值。

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

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

由于BLOBTEXT值可能會(huì)非常長(zhǎng),使用它們時(shí)可能遇到一些約束:

·???????? 當(dāng)排序時(shí)只使用該列的前max_sort_length個(gè)字節(jié)。max_sort_length的 默認(rèn)值是1024;該值可以在啟動(dòng)mysqld服務(wù)器時(shí)使用--max_sort_length選項(xiàng)進(jìn)行更改。參見(jiàn)5.3.3節(jié),“服務(wù)器系統(tǒng)變量”。

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

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

當(dāng)你想要使超過(guò)max_sort_length的字節(jié)有意義,對(duì)含長(zhǎng)值的BLOBTEXT列使用GROUP BYORDER BY的另一種方式是將列值轉(zhuǎn)換為固定長(zhǎng)度的對(duì)象。標(biāo)準(zhǔn)方法是使用SUBSTRING函數(shù)。例如,下面的語(yǔ)句對(duì)comment列的2000個(gè)字節(jié)進(jìn)行排序:

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

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

每個(gè)BLOBTEXT值分別由內(nèi)部分配的對(duì)象表示。這與其它列類型形成對(duì)比,后者是當(dāng)打開(kāi)表時(shí)為每1列分配存儲(chǔ)引擎。

11.4.4.?ENUM類型

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

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

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

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

每個(gè)枚舉值有一個(gè)索引:

·???????? 來(lái)自列規(guī)定的允許的值列中的值從1開(kāi)始編號(hào)。

·???????? 空字符串錯(cuò)誤值的索引值是0。這說(shuō)明你可以使用下面的SELECT語(yǔ)句來(lái)找出分配了非法ENUM值的行:

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

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

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

索引

NULL

NULL

''

0

'one'

1

'two'

2

'three'

3

枚舉最多可以有65,535個(gè)元素。

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

當(dāng)檢索時(shí),保存在ENUM列的值使用列定義中所使用的大小寫(xiě)來(lái)顯示。請(qǐng)注意可以為ENUM列分配字符集和 校對(duì)規(guī)則。對(duì)于二進(jìn)制或大小寫(xiě)敏感的校對(duì)規(guī)則,當(dāng)為列分配值時(shí)應(yīng)考慮大小寫(xiě)。

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

mysql> SELECT enum_col+0 FROM tbl_name;

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

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

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

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

11.4.5.?SET類型

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

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

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

SET最多可以有64個(gè)不同的成員。

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

當(dāng)檢索時(shí),保存在SET列的值使用列定義中所使用的大小寫(xiě)來(lái)顯示。請(qǐng)注意可以為SET列分配字符集和 校對(duì)規(guī)則。對(duì)于二進(jìn)制或大小寫(xiě)敏感的校對(duì)規(guī)則,當(dāng)為列分配值時(shí)應(yīng)考慮大小寫(xiě)。

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

mysql> SELECT set_col+0 FROM tbl_name;

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

SET成員

十進(jìn)制值

二進(jìn)制值

'a'

1

0001

'b'

2

0010

'c'

4

0100

'd'

8

1000

?

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

對(duì)于包含多個(gè)SET元素的值,當(dāng)插入值時(shí)元素所列的順序并不重要。在值中一個(gè)給定的元素列了多少次也不重要。當(dāng)以后檢索該值時(shí),值中的每個(gè)元素出現(xiàn)一次,根據(jù)表創(chuàng)建時(shí)指定的順序列出元素。例如,假定某個(gè)列指定為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

當(dāng)檢索時(shí)所有這些值顯示為 '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列設(shè)置為一個(gè)不支持的值,則該值被忽略并發(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個(gè)語(yǔ)句找出SET_col包含value set成員的行。第2個(gè)類似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另一個(gè)SET成員的子字符串中。

下面的語(yǔ)句也是合法的:

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

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

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

11.5.?列類型存儲(chǔ)需求

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

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

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

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

列類型

存儲(chǔ)需求

TINYINT

1個(gè)字節(jié)

SMALLINT

2個(gè)字節(jié)

MEDIUMINT

3個(gè)字節(jié)

INT, INTEGER

4個(gè)字節(jié)

BIGINT

8個(gè)字節(jié)

FLOAT(p)

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

FLOAT

4個(gè)字節(jié)

DOUBLE [PRECISION], item REAL

8個(gè)字節(jié)

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

變長(zhǎng);參見(jiàn)下面的討論

BIT(M)

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

DECIMAL(NUMERIC)的存儲(chǔ)需求與具體版本有關(guān):

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

剩余的

字節(jié)

位數(shù)

數(shù)目

0

0

1

1

2

1

3

2

4

2

5

3

6

3

7

4

8

4

9

4

日期和時(shí)間類型的存儲(chǔ)需求

列類型

存儲(chǔ)需求

DATE

3個(gè)字節(jié)

DATETIME

8個(gè)字節(jié)

TIMESTAMP

4個(gè)字節(jié)

TIME

3個(gè)字節(jié)

YEAR

1個(gè)字節(jié)

字符串類型的存儲(chǔ)需求

列類型

存儲(chǔ)需求

CHAR(M)

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

VARCHAR(M)

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

BINARY(M)

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

VARBINARY(M)

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

TINYBLOB, TINYTEXT

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

BLOB, TEXT

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

MEDIUMBLOB, MEDIUMTEXT

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

LONGBLOB, LONGTEXT

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

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

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

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

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

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

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

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

注釋:VARCHAR列的有效最大長(zhǎng)度為65,532字符。

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

BLOBTEXT類需要 1、2、3或者4個(gè)字節(jié)來(lái)記錄列值的長(zhǎng)度,取決于該類的最大可能的長(zhǎng)度。參見(jiàn)11.4.3節(jié),“BLOB和TEXT類型”。

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

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

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

11.6.?選擇正確的列類型

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

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

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

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

為了使用由其它賣方編寫(xiě)的SQL執(zhí)行代碼,MySQL按照下表所示對(duì)列類型進(jìn)行映射。通過(guò)這些映射,可以很容易地從其它數(shù)據(jù)庫(kù)引擎將表定義導(dǎo)入到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)建表時(shí)對(duì)列類型進(jìn)行映射,然后原來(lái)的類型定義被丟棄。如果你使用其它賣方的類型創(chuàng)建一個(gè)表,然后執(zhí)行DESCRIBE tbl_name語(yǔ)句,MySQL使用等效的MySQL類型來(lái)報(bào)告表的結(jié)構(gòu)。例如:

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

Previous article: Next article: