MySQL中文參考手冊譯者:晏子 (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
mSQL這一節由MySQL開發者編寫,因此應該理智地閱讀它,但是沒有我們聽說的事實錯誤。
對於所有支援的限制、函數和類型的一個列表,看crash-me網頁。
mSQL應該在下列方面更快些:INSERT操作。 CREATE TABLE和DROP TABLE。 SELECT。(一個表掃描是很容易的。)因為這些操作是如此簡單,當你有更高的啟動開銷時,很難在這些方面變得更好。在連接被建立以後,MySQL應該性能好一些。在另一方面,MySQL比mSQL(以及大多數其他的SQL實現)在下列方面更好些:
SELECT操作。 VARCHAR列上索引。SELECT。 SELECT。 mSQL中,一旦一個連接被建立了,所有其它執行緒必須等到第一個執行緒完成,不管連接正在運行的查詢是短的或是長的。當第一個連接終止時,下一個才能工作,而此時所有其它執行緒再次等待,等等。SELECT中的表的順序,mSQL可能變得異常地慢。在效能套件中,比MySQL要慢超過15000倍的時間。這是由於mSQL缺乏一個聯結最佳化器以便以最佳的順序排定表。然而,如果你把表按完全正確的順序放在mSQL2中並且WHERE是很簡單的並使用索引列,聯結將相對快些!見10.8 使用你自己的效能。ORDER BY和GROUP BY。DISTINCT。TEXT或BLOB列。GROUP BY和HAVING。mSQL根本不支援GROUP
BY。MySQL支援一個有兩個HAVING和下列函數:
COUNT()、AVG()、MIN()、MAX()、SUM()和STD()的完整的GROUP
BY。如果SELECT從一張表中檢索,沒有其他列被檢索並且沒有WHERE子句,COUNT(*)被最佳化以很快地返回。
MIN()和MAX()可以取字符串參數。 INSERT和UPDATE。MySQL能在一個INSERT或UPDATE中做計算。例如:mysql> UPDATE SET x=x*10+y WHERE x<20;
SELECT。MySQL有很多函數(太多不能在這裡列出﹔見7.4 用在SELECT和WHERE子句中的函數)。MEDIUMINT,它是3個字節長。如果你有100,000,000個記錄,每個記錄節省甚至一個字節也是很重要的。mSQL2有一個較有限的列類型集合,因此更難於使表更小。mSQL穩定性的經驗,因此我們對此不能說任何東西。mSQL更靈活的使用授權,並且也不比mSQL昂貴。無論你選擇使用哪個產品,記得要至少考慮支付一個使用授權或電子郵件支援的費用。(當然如果你把你出售的一個產品包括在MySQL中,你將被要求獲得一個使用授權。)mSQL基本相同Perl介面,當有一些增加的功能。推薦的驅動程式是twz或mm驅動程式。兩者均被報導工作出色。我們知道mSQL有一個
JDBC 驅動程式,但是我們對它有太少的經驗不能進行比較。
GROUP
BY等在mSQL中仍未實現,它有很多追趕工作要做。要想得到關於它的一些前景,你可以查看mSQL最後一年的
“HISTIRY”文件,並將它與MySQL參考書手冊的新功能小節比較(見D MySQL變遷歷史)。哪個快開發得最快應該是相當明顯的。mSQL和MySQL都有許多有趣的第三方工具。因為向上移植(從mSQL到MySQL)是很容易的,幾乎所有mSQL可用的有趣的應用程式也可被MySQL使用。MySQL帶有一個簡單的msql2mysql程式修正在mSQL和MySQL使用的大多數C
API函數之間拼寫差別。例如,它將msqlConnect()實例改變為mysql_connect()。變換一個客戶程式從mSQL到MySQL通常花幾分鐘時間。mSQL的工具轉換到MySQL根據我們的經驗,轉換諸如使用mSQL C API的msql-tcl和msqljava工具將只花不大一小時時間,使得他們用MySQL
C API工作。
轉換程序是:
msql2mysql。這需要replace程式,它與MySQL一起散發。mSQL C API與MySQL C API 之間差別是:
MYSQL結構作為一種連接類型(mSQL使用一個int)。mysql_connect()取一個指向一個MYSQL結構的指針作為一個參數。很容易定義全局性定義一個或使用malloc()獲得一個。mysql_connect()也取兩個參數指定用戶和密碼。你可以為了內定使用將這些設置為NULL,NULL。mysql_error()取MYSQL結構作為一個參數。如果你正在移植老的代碼,只是把參數加到你的老的msql_error()編碼中。
mSQL僅返回一條文字錯誤消息。
mSQL和MySQL的客戶機/伺服器通訊協議有何不同有足夠的差別使得不可能(或至少不容易)支援兩者。
它MySQL協議不同於mSQL協議的最重要的方面列在下面:
mSQL
2.0的SQL句法與MySQL有何不同列類型
MySQL CREATE TABLE句法): 、ENUM類型。SET類型。 BIGINT類型。UNSIGNED選項。ZEROFILL選項。PRIMARY KEY的整數列的AUTO_INCREMENT選項。見20.4.29 mysql_insert_id()。DEFAULT值。 mSQL2 mSQL列類型對應於MySQL類型顯示在下面:mSQL類型 |
相應的MySQL類型 |
CHAR(len) |
CHAR(len) |
TEXT(len) |
TEXT(len),len是最大長度。並且LIKE可運用。 |
INT |
INT,有很多的選項! |
REAL |
REAL,或FLOAT。有4和8字節版本。 |
UINT |
INT UNSIGNED |
DATE |
DATE,使用 ANSI SQL 格式而非mSQL自己的。 |
TIME |
TIME |
MONEY |
DECIMAL(12,2),有2個小數位的定點值。 |
索引創建
MySQL CREATE TABLE語句指定。 mSQL CREATE INDEX語句。把一個唯一標識符插入到一張表中
MySQL AUTO_INCREMENT作為列類型修飾符。見20.4.29 mysql_insert_id()。mSQL SEQUENCE並且選擇_seq列。為行獲得一個唯一標識符
MySQL PRIMARY KEY或UNIQUE鍵。 mSQL _rowid列。注意_rowid可以將來改變,取決於很多因素。得到列最後被修改的時間
MySQL TIMESTAMP列。如果你不給出列值或如果你給它一個NULL值,該列自動為INSERT或UPDATE語句設置為當前的日期和時間。mSQL _timestamp列。NULL值的比較
MySQL NULL的比較總是NULL。mSQL mSQL中,NULL = NULL是TRUE(真)。當從mSQL到MySQL移植老的代碼時,你必須將=NULL改委IS
NULL,並將<>NULL改為IS NOT NULL。字符串的比較
MySQL BINARY屬性,它使得比較根據用在MySQL伺服器主機上的ASCII順序進行。mSQL 大小寫不敏感的搜索
MySQL LIKE是一個大小寫不敏感或大小寫敏感的運算符,這取決於涉及的列。如果LIKE參數不以一個通配符字符開始,如有可能,MySQL則使用索引。mSQL CLIKE。尾部空格的處理
MySQL CHAR和VARCHAR列尾部的空格。如果不希望這種行為,使用一個TEXT行列。mSQL WHERE子句
MySQL AND在OR前計算)。要想在MySQL裡得到mSQL的行為,使用括號(如下所示)。mSQL mSQL查詢:mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
為了使MySQL像mSQL那樣計算它,你必須增加括號:
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
存取控制
MySQL mSQL PostgreSQL有一些更高級的功能如定義用戶類型、觸發器、規則和一些事務支援。然而,PostgreSQL
缺乏很多來自 ANSI SQL和ODBC的很多標準類型和函數。對於一個完整的限制列表及其支援或不支援哪一個類型和函數,見crash-me網頁。
通常,PostgreSQL是比MySQL慢很多。見10.8 使用你自己的效能。這大部分是由於他們的事務系統。如果你確實需要事務或PostgreSQL提供的豐富的類型體系並且你能承受速度的損失,你應該看看
PostgreSQL。