MySQL中文參考手冊

1 MySQL 的通常信息

這是MySQL參考手冊;它記載了MySQL版本3.23.7-alpha。php

MySQL 是一個快速、多線程、多用戶和強壯的SQL數據庫服務器。html

對Unix和 OS/2 平臺,MySQL基本上是免費的;但對微軟平臺,你在30 天的試用期後必須得到一個MySQL 許可證。詳見第三節 MySQL許可證和技術支持前端

MySQL 主頁提供有關MySQL的最新信息。java

對於MySQL能力的討論,詳見1.4 MySQL 的主要特徵mysql

對於安裝指南,見4 安裝 MySQL。對於有關移植MySQL到新機器或操做系統的技巧,參見G 對移植到其餘系統的說明linux

有關從 3.21 版升級的信息,詳見4.16.2 從一個 3.21 版本升級到 3.22 ios

MySQL的入門教程,見8 MySQL 教程程序員

SQL和基準信息的例子,見基準目錄(在分發中的'sql-bench'目錄)。web

對於新特徵和錯誤修復一個歷史記錄,見D MySQL的變遷sql

對於當前已知錯誤和功能缺陷的一張列表,見E MySQL已知錯誤和設計缺陷

將來計劃,見咱們想要在將來加入到MySQL 的計劃表( TODO )

這個計劃的全部貢獻者的名單,見C MySQL 的貢獻者

重要:

將臭蟲(錯誤)報告、問提和建議發到郵件列表(原文未提供)。

對源代碼分發,mysqlbug 腳本可在‘scripts’目錄下找到。 對二進制的分發,mysqlbug可在‘bin’目錄下找到。

若是你有任何關於這本手冊的增補或修正的任何建議,請將它們發給手冊小組(docs@mysql.com )。

1.1 什麼是 MySQL?

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

1.2 關於本手冊

目前這本手冊有Texinfo、普通文本、Info、HTML、PostScript和 PDF 等格式的版本。由於它們的長度,PostScript和 PDF 版本沒有包括在主要的MySQL分發中,可是可從http://www.mysql.com 得到單獨的下載。

主要的文檔是Texinfo文件, HTML版本自動地用一個texi2html改進版本生成。普通文本和Info版本用makeinfo生成。 Postscript版本由texi2dvidvips生成。PDF 版本用pdftex生成。

本手冊由David Axmark, Michael (Monty) Widenius, Paul DuBois and Kim Aldale維護。 而其餘的貢獻者,見C MySQL貢獻者

1.2.1 本手冊中使用的約定

這本手冊使用了必定文字格式的約定:

constant / 固定寬度
固定寬度字體用於命令名字和選擇、SQL語句、數據庫、表和列命名、C 和 Perl 代碼、環境變量。例如:「爲了瞭解 mysqladmin如何工做,用 --help選項調用它」。
'文件名'
有包圍引號的固定寬度字體用於文件名和路徑。例如:「發行版本被安裝在 '/usr/local/'目錄下」。
'c'
有包圍引號的固定寬度字體也用於指明字符序列。例如:「要指定一個通配符,使用 '%'字符」。
斜體
斜體的字體被用於強調, like this 
粗體 
粗體用於存取權限名字(例如,「不要輕易受權 process權限」)並表達 特別強調

當命令顯示出準備由一個特定的程序執行時,程序由命令所顯示的提示符指出。例如,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_nametbl_namecol_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}

1.3 MySQL 的歷史

咱們曾經開始打算利用mSQL用咱們本身的快速底層(ISAM)實用程序鏈接咱們的數據庫表,然而,在一些測試之後咱們獲得出結論:mSQL對咱們的需求來講不夠快速和靈活。這致使了一個鏈接咱們數據庫的新SQL接口,但它幾乎有與mSQL相同的應用編程接口。選擇這個應用編程接口以方便第三方的代碼移植。

MySQL名字的由來不是很是清楚。咱們的基目錄和不少的庫和工具具備前綴「my」已超過10年曆史,然而,Monty的女兒(年輕幾歲的)也被命名"my"。所以其中哪個緣由給MySQL起了這個名字仍然是一個謎,甚至對咱們。

1.4 MySQL 的主要特徵

下表描述MySQL一些重要的特徵:

  • 使用核心線程的徹底多線程。這意味着它能很容易地利用多CPU(若是有)。
  • C 、C++、 Eiffel 、 Java、 Perl、 PHP、Python、和 TCL  API。見20 MySQL 客戶工具和 API
  • 可運行在不一樣的平臺上,見4.2 MySQL支持的操做系統
  • 多種列類型:一、 二、 三、四、和 8 字節長度的有符號/無符號整數、FLOATDOUBLECHARVARCHARTEXTBLOBDATETIMEDATETIME、 TIMESTAMPYEARSETENUM類型。 見7.3 列類型
  • 利用一個優化的一遍掃描多重聯結(one-sweep multi-join)很是快速地進行聯結(join)。
  • 在查詢的SELECTWHERE部分支持所有運算符和函數,例如:
    mysql> SELECT CONCAT(first_name, " ", last_name) FROM tbl_name
               WHERE income/dependents > 10000 AND age > 30;
  • 經過一個高度優化的類庫實現SQL函數庫而且像他們能達到的同樣快速,一般在查詢初始化後不該該有任何內存分配。
  • 全面支持SQL的GROUP BYORDER BY子句,支持聚合函數( COUNT()COUNT(DISTINCT)AVG()STD()SUM()、 MAX()MIN() )。
  • 支持ANSI SQL的LEFT OUTER JOIN和ODBC語法
  • 你能夠在同一查詢中混用來自不一樣數據庫的表。(與版本 3.22同樣 )。
  • 一個很是靈活且安全的權限和口令系統,而且它容許基於主機的認證。口令是安全的,由於當與一個服務器鏈接時,全部的口令傳送被加密。
  • ODBC for Windiws 95。全部的 ODBC 2 . 5 函數和其餘許多函數。例如,你能夠用Access鏈接你的 MySQL服務器。見16 MySQL  ODBC 支持
  • 具有索引壓縮的快速B樹磁盤表。
  • 每一個表容許有16個索引。每一個索引能夠由1~16個列或列的一部分組成。最大索引長度是 256 個字節(在編譯MySQL時,它能夠改變)。一個索引可使用一個CHARVARCHAR字段的前綴。
  • 定長和變長記錄。
  • 用做臨時表的內存散列表。
  • 大數據庫處理。咱們正在對某些包含 50,000,000 個記錄的數據庫使用MySQL
  • 全部列都有缺省值,你能夠用INSERT插入一個表列的子集,那些沒用明確給定值的列設置爲他們的缺省值。
  • 爲了可移植性使用 GNU  Automake , Autoconf 和libtool。
  • 用C和C++編寫,並用大量不一樣的編譯器測試。
  • 一個很是快速的基於線程的內存分配系統。
  • 沒有內存漏洞。用一個商用內存漏洞監測程序測試過(purify)。
  • 包括myisamchk,一個檢查、優化和修復數據庫表的快速實用程序,詳見13 維護 MySQL安裝
  • 全面支持ISO-8859-1  Latin1 字符集。例如,斯堪的納維亞的字符 @ringaccent{a}, @"a and @"o 在表和列名字被容許。
  • 全部數據以 ISO-8859-1  Latin1 格式保存。全部正常的字符串比較是忽略大小寫的。
  • 根據 ISO-8859-1  Latin1 字符集進行排序(目前瑞典語的方式)。經過在源代碼中增長排序順序數組能夠改變它。爲了理解一個更高級的排序例子,看一看捷克語的排序代碼。MySQL支持可在編譯時指定的不少不一樣的字符集。
  • 表和列的別名符合 SQL92 標準。
  • DELETEINSERTREPLACEUPDATE 返回有多少行被改變(受影響)。
  • 函數名不會與表或列名衝突。例如ABS是一個有效的列名字。對函數調用的惟一限制是函數名與隨後的「(」不能有空格。詳見7.31 MySQL對保留字很挑剔嗎?
  • 全部MySQL程序能夠用選項--help-?得到聯機幫助。
  • 服務器能爲客戶提供多種語言的出錯消息,詳見9.1 MySQL支持哪些語言?
  • 客戶端使用TCP/IP 鏈接或Unix套接字(socket)或NT下的命名管道鏈接MySQL
  • MySQL特有的SHOW命令可用來檢索數據庫、表和索引的信息,EXPLAIN命令可用來肯定優化器如何解決一個查詢。

 

1.5 MySQL的穩定性?

本小節回答這樣的問題:「MySQL的穩定程度?」和 「我能在本項目中依賴MySQL嗎?」。這裏咱們將試圖澄清一些問題而且回答彷佛不少人關心的更重要的問題。本節已經與從郵件列表(它在報導錯誤是很活躍的)收集了的信息綜合在一塊兒。

對TcX,MySQL在咱們自1996中期開始的計劃中運行沒有發生任何問題。當MySQL被更公開地發佈時,咱們注意到了有一些 「未測試代碼」片段很快地被不一樣於咱們的查詢方式的新用戶發現。每一個新版本比前一個都有更少的可移植性問題(儘管每一個發行有許多新功能),而且咱們但願有可能把下一個版本之一標記爲「穩定」的。

每一個MySQL的發行都是可用的,而且只有當用戶使用從「灰色地帶」來的代碼時纔有問題,固然,不知情的用戶不能知道灰色地帶是什麼;本小節嘗試揭示咱們目前已知的東西。這裏的描述涉及MySQL 3. 22.x 版本。全部已知和報告的錯誤都會在最新的版本被更正,除了在錯誤小節中列出的與「設計n」有關的錯誤。詳見E MySQL已知的錯誤和設計缺陷

MySQL以多層結構和不一樣的獨立模塊編寫,這些模塊列舉在下面以代表它們中的每個是如何很好地被測試過:

ISAM表處理器--穩定
它管理全部在 MySQL 3.22和早期版本中的數據的存儲和檢索。在全部 MySQL版本中,代碼中已經沒有一個單獨(報告的)錯誤。獲得一個損壞的數據庫表的惟一已知方法是在一個更新中途殺死服務器,即便這樣也不大可能破壞任何數據而不能挽救,由於全部數據在每一個查詢之間被倒入(flush)到磁盤,並且歷來沒有一個有關因爲 MySQL中的錯誤而丟失數據的錯誤報告。
MyISAM 表處理器-- Beta 
這是  MySQL 3.23的新功能,它大部分是基於ISAM表代碼但有不少新的有用的功能。
語法處理器和詞法分析器 --穩定
很長時間沒有一個在這個系統中的錯誤報告。
C 客戶代碼--穩定
沒有已知的問題。在早期的 3. 20版本中,在發送/接收緩衝器的大小上有一些限制。 3.21.x後,如今緩衝器的大小是動態的,可到一個24M的缺省值。
標準客戶程序--穩定
這些包括 mysqlmysqladminmysqlshowmysqldumpmysqlimport
基本結構式查詢語言--穩定
基本SQL函數系統、字符串類和動態內存處理,本系統中未見單獨報告的錯誤。
查詢優化程序--穩定
 
範圍優化程序-- Gamma 
 
Join優化器--穩定
 
鎖定-- Gamma 
這是很是依賴於系統的,在某些系統上,用標準操做系統鎖定( fcntl())有很大問題,在這些狀況下,你應該用選項 --skip-locking運行 MySQL守護程序。當使用NFS掛載的文件系統,已知在一些 Linux 系統上和SunOS上出現問題。
Linux 線程-- Gamma 
惟一發現的問題式 fcntl()調用,它經過使用 mysqld--skip-locking選項解決。一些人已經報告了0.5版中的鎖定問題。
Solaris 2.5 + pthreads --穩定
咱們在咱們的開發工做中使用。
MIT-pthreads (其餘系統)-- Gamma 
自從 3.20.15版以來,沒有報告的錯誤,並且從3.20.16開始沒有已知的錯誤。在一些系統上,在一些操做是至關慢時(在每查詢之間有 1/20秒的睡眠 )有一個「功能失效」。固然,MIT-pthreads 可能使任何事情慢一點,可是基於索引 的SELECT語句一般在一個時幀內完成,所以不該該有一個mutex 鎖定/線程的把戲。
其餘線程實現 -- Alpha - Beta 
移植到其餘系統仍然是很新的而且可能有錯誤,多是在 MySQL中,可是最一般的是線程實現自己。
LOAD DATA ... ,INSERT ... SELECT --穩定
一些人已經認爲他們在這裏發現了錯誤,可是這些常常可能是誤解。請在報告問題前檢查手冊!
ALTER TABLE --穩定
在 3.22.12中有小的改變。
DBD --穩定
如今由 Jochen  Wiedmann 維護了。
mysqlaccess --穩定
由 Yves  Carlier 編寫並維護。
GRANT -- Gamma 
MySQL 3.22.12.作了很大改變。
MyODBC (使用 ODBC  SDK 2.5 )-- Gamma 
它與一些程序彷佛工做得很好。

TcX 爲付費客戶提供電子郵件的支持,可是MySQL郵件列表一般提供常見問題的答案,錯誤一般立刻用一個補丁修補,對嚴重的錯誤,幾乎老是有新的版本發行。

1.6 順應2000年(Year 2000 compliance)

MySQL自己己沒有2000年有問題( Y2K ):

  • MySQL使用Unix時間函數而且在2069年前沒有日期問題, 全部2位年份被認爲在1970年到2069年的範圍,這意味着若是在一個year類型的列中存儲的01,MySQL把它看成2001
  • 全部MySQL日期函數存儲在一個文件'sql/time.cc'中,而且很仔細地編碼保證是2000年安全的 。
  • MySQL 3.22 和之後的版本,新的YEAR類型的列能在一個字節中存儲0年和1901年2155年,並用使用2或4位顯示它們。

你能夠用一種不是Y2K-safe的方式使用 MySQL應用程序來深刻該問題。例如,許多老的應用程序使用2位數字(它有二義性)而非4位數字存儲或操做年份,這個問題可能與使用諸如0099做爲「丟失的」值的提示的應用程序混淆起來。

很不幸,這些問題可能很難修復,由於不一樣的應用程序可能由不一樣程序員編寫,其中每個可能使用了不一樣的約定和日期處理函數。

這裏是簡單的示範,顯示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)

這表示DATEDATETIME類型將不會有將來日期的任何問題(它們處理日期到 9999 )。

TIMESTAMP類型被用來存儲當前時間,有一個僅2030-01-01的上限。TIMESTAMP在32位的機器上(有符號值)有一個從19702030的範圍,在64位機器上它處理時間可達2106(無符號值)。

儘管MySQL是順應Y2K的,但提供無二義性的輸入是你的責任。對於MySQL處理二義性日期的輸入(包含2位數字年份)的規則,詳見7.3.6.1 Y2K 問題和日期類型

1.7 SQL通常信息和教程

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 。

1.8 有用的MySQL相關連接

1.8.1 教程

1.8.2 Perl相關連接

1.8.3 MySQL 討論論壇

1.8.4 支持 MySQL 的商業應用

1.8.5 SQL客戶程序

1.8.6 支持MySQL的Web 開發工具

1.8.7 用 MySQL 支持的數據庫設計工具

1.8.8 使用MySQL工具的Web服務器

1.8.9 對其餘程序的擴充

1.8.10 經過其餘程序使用MySQL

1.8.11 ODBC有關的連接

1.8.12 API有關的連接

1.8.13 其它MySQLx有關的連接

1.8.14 SQL和數據庫接口

 1.8.15 使用MySQL的例子

 1.8.16 通常的數據庫連接

也有不少網頁使用 MySQL。詳見A  一些 MySQL 用戶。將任何新增發送到這張表中,並在某處加上 MySQL 標識(在一個「使用工具」的頁面或相似的地方)。

相關文章
相關標籤/搜索