譯者:晏子 (clyan@sohu.com)
GB 碼主頁:http://linuxdb.yeah.net
Big5 轉碼者:statue
(statue@bbs.yzu.edu.tw)
詞彙轉換:彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁:
http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站:
http://php.wilson.gs/mysqldoc/big5/manual_toc.html
這是MySQL參考手冊﹔它記載了MySQL版本3.23.7-alpha。
MySQL 是一個快速、多執行緒、多使用者和強壯的SQL資料庫伺服器。
對Unix和 OS/2 平台,MySQL基本上是免費的﹔但對微軟平台,你在30 天的試用期後必須獲得一個MySQL 使用授權。詳見第三節 MySQL使用授權和技術支援。
MySQL 主頁提供有關MySQL的最新資訊。
對於MySQL能力的討論,詳見1.4 MySQL 的主要特徵。
對於安裝指南,見4 安裝 MySQL。對於有關移植MySQL到新機器或作業系統的技巧,參見G 對移植到其他系統的說明。
有關從 3.21 版升級的資訊,詳見4.16.2 從一個 3.21 版本升級到 3.22 。
MySQL的入門教學課程,見8 MySQL 教學課程。
SQL和效能資訊的例子,見效能目錄(在分發中的'sql-bench'目錄)。
對於新特徵和錯誤修復一個歷史記錄,見D MySQL的變遷。
對於當前已知錯誤和功能缺陷的一張列表,見E MySQL已知錯誤和設計缺陷。
未來計劃,見F 我們想要在未來加入到MySQL 的計劃表( TODO )。
這個計劃的所有貢獻者的名單,見C MySQL 的貢獻者。
重要:
將臭虫(錯誤)報告、問題和建議發到郵件列表(原文未提供)。
對原始碼版本,mysqlbug
腳本可在‘scripts’目錄下找到。
對可執行檔版本,mysqlbug
可在‘bin’目錄下找到。
如果你有任何關於這本手冊的增補或修正的任何建議,請將它們發給手冊小組(docs@mysql.com )。
MySQL是一個真正的多使用者、多執行緒SQL資料庫伺服器。SQL(結構化查詢語言)是世界上最流行的和標準化的資料庫語言。MySQL是以一個客戶機/伺服器結構的實現,它由一個伺服器背景執行程式mysqld
和很多不同的客戶程式和庫組成。
SQL是一種標準化的語言,它使得儲存、更新和存取資訊更容易。例如,你能用SQL語言為一個網站檢索產品資訊及儲存顧客資訊,同時MySQL也足夠快和靈活以允許你儲存記錄文件和圖像。
MySQL 主要目標是快速、健壯和易用。最初是因為我們需要這樣一個SQL伺服器,它能處理與任何可不昂貴硬件平台上提供資料庫的廠家在一個數量級上的大型資料庫,但速度更快,MySQL就開發出來。自1996年以來,我們一直都在使用MySQL,其環境有超過 40 個資料庫,包含 10,000個表,其中500多個表超過7百萬行,這大約有100 個吉字節(GB)的關鍵應用數據。
MySQL建立的基礎是業已用在高要求的生產環境多年的一套實用例程。盡管MySQL仍在開發中,但它已經提供一個豐富和極其有用的功能集。
MySQL的官方發音是“My Ess Que Ell”(不是 MY-SEQUEL )。
目前這本手冊有Texinfo、純文字版、Info、HTML、PostScript和 PDF 等格式的版本。因為它們的長度,PostScript和 PDF 版本沒有包括在主要的MySQL分發中,但是可從http://www.mysql.com 獲得單獨的下載。
主要的文檔是Texinfo文件, HTML版本自動地用一個texi2html
改進版本產生。純文字版和Info版本用makeinfo
產生。
Postscript版本由texi2dvi
和dvips
產生。PDF 版本用pdftex
產生。
本手冊由David Axmark, Michael (Monty) Widenius, Paul DuBois and Kim Aldale維護。 而其他的貢獻者,見C MySQL貢獻者。
這本手冊使用了一定文字格式的約定:
constant / 固定寬度
mysqladmin
如何工作,用--help
選項調用它”。當命令顯示出準備由一個特定的程式執行時,程式由命令所顯示的提示符指出。例如,shell>
表明你從你的殼程式執行一個命令,而mysql>
表明你從mysql
客戶執行命令:
shell> 在這鍵入一個shell命令 mysql> 在這裡鍵入一個mysql命令
shell命令用 Bourne shell語法顯示。如果你正在使用csh
風格的外殼,你可能需要用略微不同的方式發出命令。例如,設置一個環境變數和運行一個命令的序列在 Bourne shell語法看起來像這樣:
shell> VARNAME=value some_command
對於csh
,你將執行這樣的序列:
shell> setenv VARNAME value shell> some_command
資料庫、表和列名字經常必須被代入命令中。為表明這種代入是必要的,本手冊使用db_name
、tbl_name
和col_name
。例如,你可能看到像這樣的語句:
mysql> SELECT col_name FROM db_name.tbl_name;
這意味著如果你想輸入類似的語句,你將提供你自己資料庫、表和列的名字,也許像這樣:
mysql> SELECT author_name FROM biblio_db.author_list;
SQL語句可以寫成大寫或小寫的。當本手冊顯示SQL語句時,如果討論這些關鍵字,大寫被用於特定的關鍵字(強調它們)而小寫被用於語句的其他部分。因此你可能在討論SELECT語句時看到如下顯示:
mysql> SELECT count(*) FROM tbl_name;
另一方面,在討論COUNT()
函數時,語句將寫成這樣:
mysql> select COUNT(*) from tbl_name;
如果不有意地特別強調,所有的關鍵字一律寫成大寫。
在句法描述中,方括號('['和']')被用來表示任選的詞或子句:
DROP TABLE [IF EXISTS] tbl_name
當一個語法元素由很多選擇組成時,各選擇用垂直線分開('|')。當可能從一組選擇中選擇一個成員時,選擇在方括號內被列出。當必須從一組選擇中選擇一個成員時,選擇在花括號內被列出('{'和'}'):
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) {DESCRIBE | DESC} tbl_name {col_name | wild}
我們曾經開始打算利用mSQL
用我們自己的快速底層(ISAM)實用程式連接我們的資料庫表,然而,在一些測試以後我們得到出結論:mSQL
對我們的需求來說不夠快速和靈活。這導致了一個連接我們資料庫的新SQL介面,但它幾乎有與mSQL
相同的應用編程介面。選擇這個應用編程介面以方便第三方的代碼移植。
MySQL名字的由來不是非常清楚。我們的基目錄和很多的庫和工具具有前綴“my”已超過10年歷史,然而,Monty的女兒(年輕幾歲的)也被命名"my"。因此其中哪一個原因給MySQL起了這個名字仍然是一個謎,甚至對我們。
下表描述MySQL一些重要的特徵:
FLOAT
、DOUBLE
、CHAR
、VARCHAR
、TEXT
、BLOB
、DATE
、TIME
、DATETIME、
TIMESTAMP
、YEAR
、SET
和ENUM
類型。
見7.3 列類型。 SELECT
和WHERE部分
支援全部運算符和函數,例如:mysql> SELECT CONCAT(first_name, " ", last_name) FROM tbl_name WHERE income/dependents > 10000 AND age > 30;
GROUP BY
和ORDER BY
子句,支援聚合函數(
COUNT()
、COUNT(DISTINCT)
、AVG()
、STD()
、SUM()
、
MAX()
和MIN()
)。LEFT OUTER JOIN
和ODBC語法。
CHAR
或VARCHAR
字段的前綴。INSERT
插入一個表列的子集,那些沒用明確給定值的列設置為他們的內定值。libtool。
purify
)。myisamchk
,一個檢查、最佳化和修復資料庫表的快速實用程式,詳見13 維護 MySQL安裝。 DELETE
、INSERT
、REPLACE
和UPDATE
返回有多少行被改變(受影響)。ABS
是一個有效的列名字。對函數調用的唯一限制是函數名與隨後的“(”不能有空格。詳見7.31 MySQL對保留字很挑剔嗎?。 --help
或-?
獲得聯機幫助。SHOW
命令可用來檢索資料庫、表和索引的資訊,EXPLAIN
命令可用來確定最佳化器如何解決一個查詢。
本小節回答這樣的問題:“MySQL的穩定程度?”和 “我能在本項目中依賴MySQL嗎?”。這裡我們將試圖澄清一些問題並且回答似乎很多人關心的更重要的問題。本節已經與從郵件列表(它在報導錯誤是很活躍的)收集了的資訊綜合在一起。
對TcX,MySQL在我們自1996中期開始的計劃中運行沒有發生任何問題。當MySQL被更公開地發布時,我們注意到了有一些 “未測試代碼”片斷很快地被不同於我們的查詢方式的新用戶發現。每個新版本比前一個都有更少的可移植性問題(盡管每個發行有許多新功能),並且我們希望有可能把下一個版本之一標記為“穩定”的。
每個MySQL的發行都是可用的,並且只有當用戶使用從“灰色地帶”來的代碼時才有問題,當然,不知情的用戶不能知道灰色地帶是什麼﹔本小節嘗試揭示我們目前已知的東西。這裡的描述涉及MySQL 3. 22.x 版本。所有已知和報告的錯誤都會在最新的版本被更正,除了在錯誤小節中列出的與“設計n”有關的錯誤。詳見E MySQL已知的錯誤和設計缺陷。
MySQL以多層結構和不同的獨立模組編寫,這些模組列舉在下面以表明它們中的每一個是如何很好地被測試過:
mysql
、mysqladmin
和mysqlshow
、mysqldump
及mysqlimport
。
fcntl()
)有很大問題,在這些情況下,你應該用選項--skip-locking
運行MySQL背景執行程式。當使用NFS挂載的文件系統,已知在一些 Linux 系統上和SunOS上出現問題。fcntl()
調用,它通過使用mysqld
的--skip-locking
選項解決。一些人已經報告了0.5版中的鎖定問題。的SELECT
語句通常在一個時幀內完成,因此不應該有一個mutex 鎖定/執行緒的把戲。LOAD DATA ...
,INSERT ... SELECT
--穩定ALTER TABLE
--穩定mysqlaccess
--穩定GRANT
-- Gamma TcX 為付費客戶提供電子郵件的支援,但是MySQL郵件列表通常提供常見問題的答案,錯誤通常馬上用一個修補修補,對嚴重的錯誤,幾乎總是有新的版本發行。
MySQL本身己沒有2000年有問題( Y2K ):
2069
年前沒有日期問題,
所有2位年份被認為在1970
年到2069
年的範圍,這意味著如果在一個year
類型的列中儲存的01,MySQL把它當作2001
。
YEAR
類型的列能在一個字節中儲存0年和1901年
到2155年
,並用使用2或4位顯示它們。你可以用一種不是Y2K-safe的方式使用 MySQL應用程式來深入該問題。例如,許多老的應用程式使用2位數字(它有二義性)而非4位數字儲存或操作年份,這個問題可能與使用諸如00
或99
作為“丟失的”值的提示的應用程式混淆起來。
很不幸,這些問題可能很難修復,因為不同的應用程式可能由不同程式員編寫,其中每一個可能使用了不同的約定和日期處理函數。
這裡是簡單的示範,顯示MySQL在 2030 年之前沒有任何日期問題。
mysql> DROP TABLE IF EXISTS y2k; mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp); mysql> INSERT INTO y2k VALUES ("1998-12-31","1998-12-31 23:59:59",19981231235959); mysql> INSERT INTO y2k VALUES ("1999-01-01","1999-01-01 00:00:00",19990101000000); mysql> INSERT INTO y2k VALUES ("1999-09-09","1999-09-09 23:59:59",19990909235959); mysql> INSERT INTO y2k VALUES ("2000-01-01","2000-01-01 00:00:00",20000101000000); mysql> INSERT INTO y2k VALUES ("2000-02-28","2000-02-28 00:00:00",20000228000000); mysql> INSERT INTO y2k VALUES ("2000-02-29","2000-02-29 00:00:00",20000229000000); mysql> INSERT INTO y2k VALUES ("2000-03-01","2000-03-01 00:00:00",20000301000000); mysql> INSERT INTO y2k VALUES ("2000-12-31","2000-12-31 23:59:59",20001231235959); mysql> INSERT INTO y2k VALUES ("2001-01-01","2001-01-01 00:00:00",20010101000000); mysql> INSERT INTO y2k VALUES ("2004-12-31","2004-12-31 23:59:59",20041231235959); mysql> INSERT INTO y2k VALUES ("2005-01-01","2005-01-01 00:00:00",20050101000000); mysql> INSERT INTO y2k VALUES ("2030-01-01","2030-01-01 00:00:00",20300101000000); mysql> INSERT INTO y2k VALUES ("2050-01-01","2050-01-01 00:00:00",20500101000000); mysql> SELECT * FROM y2k; +------------+---------------------+----------------+ | date | date_time | time_stamp | +------------+---------------------+----------------+ | 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 | | 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 | | 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 | | 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 | | 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 | | 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 | | 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 | | 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 | | 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 | | 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 | | 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 | | 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 | | 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 | +------------+---------------------+----------------+ 13 rows in set (0.00 sec)
這表示DATE
和DATETIME
類型將不會有未來日期的任何問題(它們處理日期到 9999 )。
TIMESTAMP
類型被用來儲存當前時間,有一個僅2030-01-01
的上限。TIMESTAMP
在32位的機器上(有符號值)有一個從1970
到2030
的範圍,在64位機器上它處理時間可達2106
(無符號值)。
盡管MySQL是順應Y2K的,但提供無二義性的輸入是你的責任。對於MySQL處理二義性日期的輸入(包含2位數字年份)的規則,詳見7.3.6.1 Y2K 問題和日期類型。
在MySQL郵件列表上,這本書被多人推薦:
Judith S. Bowman, Sandra L. Emerson and Marcy Darnovsky The Practical SQL Handbook: Using Structured Query Language Second Edition Addison-Wesley ISBN 0-201-62623-3 http://www.awl.com
這本書也接受了 MySQL 用戶的一些建議:
Martin Gruber Understanding SQL ISBN 0-89588-644-8 Publisher Sybex 510 523 8233 Alameda, CA USA
一本SQL語言教學課程可在 http://www.geocities.com/SiliconValley/Vista/2207/sql1.html 找到。
SQL in 21 Tagen (用德語寫的網上書籍) http://www.mut.de/leseecke/buecher/sql/inhalt.htm 。
MySQL
mSQL
mSQL
TCL 修補 DBI
/DBD
.
DBI
/DBD
modules homepage 也有很多網頁使用 MySQL。詳見A 一些 MySQL 用戶。將任何新增發送到這張表中,並在某處加上 MySQL 標識(在一個“使用工具”的頁面或類似的地方)。