譯者:晏子 (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
mysqld
可以用下列語言發出錯誤消息:捷克語、荷蘭語、英語(內定)、愛沙尼亞語、法語、德語、匈牙利、意大利語、挪威語。
啟動mysqld
使用一種特定的語言,使用一個--language=lang
或-L
lang
選項。例如:
shell> mysqld --language=swedish
或:
shell> mysqld --language=/usr/local/share/swedish
注意,所有語言的名稱用小寫字母指定。
語言文件位於(內定的)'mysql_base_dir/share/LANGUAGE/'。
為了更新錯誤消息文件,你應該編輯“errmsg.txt”文件並且執行下列命令產生“errmsg.sys”文件:
shell> comp_err errmsg.txt errmsg.sys
如果你升級到一個更新的MySQL版本,記得要再次用新的“errmsg.txt”文件進行更新。
內定地,MySQL使用 ISO-8859-1 ( Latin1 ) 字符集。這是在美國和西歐使用的字符集。
字符集決定了在名字中允許什麼字符和如何由SELECT
語句的ORDER
BY
和GROUP BY
子句排序。
通過給configure
以--with-charset=charset
選項,你可以在編譯時改變字符集。見4.7.1 快速安裝概述。
為了把其他字符集加入MySQL,使用下列程序:
MYSET
表示。 ctype_MYSET
、to_lower_MYSET
等等的名字。to_lower[]
和to_upper[]
是簡單的數組,保存字符集每個成員相應的小寫和大寫字符。例如:
to_lower['A'] should contain 'a' to_upper['a'] should contain 'A'
sort_order[]
是一個映射,指出字符為了比較和排序目的應該如何定序。對於許多字符集,這與to_upper[]
一樣(意味著排序將忽略大小寫)。MySQL將基於sort_order[character]
值排序字符。ctype[]
是一個位值的數組,一個元素對應一個字符。(注意,to_lower[]
、to_upper[]
和sort_order[]
按字符定下標,但是ctype[]
按字符值+1定下標。這是一個舊遺產以便能處理EOF)
你能在“m_ctype.h”找到下列bitmask定義:
#define _U 01 /* Upper case */ #define _L 02 /* Lower case */ #define _N 04 /* Numeral (digit) */ #define _S 010 /* Spacing character */ #define _P 020 /* Punctuation */ #define _C 040 /* Control character */ #define _B 0100 /* Blank */ #define _X 0200 /* heXadecimal digit */
每個字符的ctype[]
的入口應該是描述字符的適用的位模(bitmask)值的聯合(union)。例如,'A'
是一個大寫字符(_U
)
,同時是十六進制位(_X
),這樣ctype['A'+1]
應該包含值:
_U + _X = 01 + 0200 = 0201
configure.in
中的CHARSETS_AVAILABLE
表。
如果你正在創建一個多字節字符集,你可以使用_MB
宏。在“include/m_ctype.h.in”,增加:
#define MY_CHARSET_MYSET X #if MY_CHARSET_CURRENT == MY_CHARSET_MYSET #define USE_MB #define USE_MB_IDENT #define ismbchar(p, end) (...) #define ismbhead(c) (...) #define mbcharlen(c) (...) #define MBMAXLEN N #endif
這裡:
MY_CHARSET_MYSET |
一個唯一的字符集值。 |
USE_MB |
這個字符集有多字節字符,由ismbhead() 和mbcharlen() 來處理。 |
USE_MB_IDENT |
(可選 ) 如果定義,你能使用多字節字符的表和列名。 |
ismbchar(p, e) |
如果p 不是一個多字節字符字符串,返回0,否則如果它是,返回字符的大小(字節數)。p 和e 指向字符串的開始和結束。檢查是從(char*)p 到(char*)e-1 。
|
ismbhead(c) |
如果c 是一個多字節字符字符串的第一個字符,返回真。 |
mbcharlen(c) |
如果c 是一個多字節字符串的第一個字符,返回該字符串的大小。 |
MBMAXLEN |
在字符集中最大字符的字節大小。 |
當以--log-update=file_name
選項啟動時,mysqld
將所有更新數據的SQL命令寫入記錄文件中。文件被寫入數據目錄並且有一個名字file_name.#
,這裡#
是一個數字,它在每次執行mysqladmin
refresh
或mysqladmin flush-logs
、FLUSH LOGS
語句、或重啟伺服器時加1。
如果你使用--log
或-l
選項,mysqld
用一個文件名“hostname.log”寫一個通用的記錄文件,並且重啟和更新不會引起一個新的記錄文件產生(盡管它被關閉並且再打開)。內定地,mysql.server
腳本用-l
選項啟動MySQL伺服器,如果當你在生產環境中開始使用MySQL時,你需要好一些的性能,你可以從mysql.server
中刪除-l
選項。
更新記錄很聰明,因為它僅僅記載真正更新數據的語句。因此一個用WHERE
的UPDATE
或DELETE
找不到行,它就不被寫入記錄文件。它甚至跳過將設置一個列為它已經有的值的UPDATE
語句。
如果你想要從更新記錄文件更新一個資料庫,你可以如下做到(假設你的更新記錄有“file_name.#”形式的名字):
shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysql
ls
被用來以正確的次序得到所有的記錄文件。
如果你必須在一個崩潰後恢復到備份文件並且你想要再做發生在備份和崩潰之間的更新,這可以很有用。
當你在其他主機上有一個鏡像資料庫並且你想要複製必須對主資料庫進行的改變時,你也可以使用更新記錄。
MySQL 3.22 在表大小上有一個4G的限制。使用在MySQL 3.23中的新MyISAM 最大的表大小可達8百萬 TB(2^63個字節)。
然而注意,作業系統有其自身文件大小的限制。在Linux上,當前的限制是2G﹔在Solaris 2.5.1上,限制是4G﹔在Solaris 2.6上,限制是1000G。這意味著MySQL表的大小通常由作業系統限制。
內定地,MySQL表最大尺寸大約4G。你可用SHOW TABLE
STATUS
命令或myisamchk -dv table_name
檢查一個表的最大表大小。見7.21 SHOW
句法(得到表、列等的資訊)。
如果你需要大於 4G 的表(並且你的作業系統支援它),你應該在你創建表時設定AVG_ROW_LENGTH
和MAX_ROWS
參數。見7.7 CREATE TABLE
語法。你也能用ALTER
TABLE
在以後設置這些。見7.8
ALTER TABLE
語法。
如果你的大表要變成只讀,你可以使用myisampack
合並並且把許多表壓縮成一個。myisampack
通常壓縮一個表到至少50%,因此你可以有,實際上,更大的表。見12.5 MySQL壓縮的只讀的表產生器。
另一個的解決方案可以是內含包括MERGE庫,它允許你將一個許多相同的表的集合作為一個來處理。(在這種情況下相同意味著所有的表由相同的列資訊創建)目前MERGE只能用於掃描一個表集合,因為它不支援索引。我們在不久的將來將把索引加進去。
用MySQL,目前(版本 3.23.6)你可以在三種基本資料庫表格式間選擇。當你創建一張表時,你可以告訴MySQL它應該對於表使用哪個表類型。MySQL將總是創建一個.frm
文件保存表和列定義。視表類型而定,索引和數據將在其他文件中儲存。
你能用ALTER TABLE
語句在不同類型的表之間變換。見7.8 ALTER TABLE
語法。
MyISAM
MyISAM
是內定表格類型,它是基於ISAM
代碼並且有很多有用的擴展。索引儲存在一個有.MYI
(MYindex)擴展名的文件並且數據儲存在有.MYD
(MYData)擴展名的文件中。你能用myisamchk
實用程式檢查/修復MyISAM
表。見13.4 對崩潰恢復使用myisamchk
。下列幾點在MyISAM
中是全新的:
INSERT
一個新行,在其他執行緒從表刈袗在讀取的同時。
AUTO_INCREMENT
列的內部處理。MyISAM
將自動地在INSERT/UPDATE
時更新它。
AUTO_INCREMENT
值可以用myisamchk
重新設置,這將使得AUTO_INCREMENT
列更快速並且原來的數將不像老的ISAM那樣被重新使用。注意,當一個AUTO_INCREMENT
定義在一個多部鍵值(multi-part-key)的結尾時,老式的行為仍然是存在。
BLOB
和TEXT
列可以被索引。 NULL
值。每個鍵占0-1個字節。 myisamchk
就可以放大到64。
MyISAM
顯示桌子是否正確被關上的文件。這將不久被用於自動的修理在MySQL伺服器。
myisamchk
將標記表為“檢查的”。myisamchk --fast
將僅僅檢查那些沒有這個標記的表。
myisamchk -a
儲存鍵值組成部分的統計(不只是像ISAM
對整個鍵)。
myisampack
能緊縮BLOB
和VARCHAR
列。 MyISAM
也支援下列東西,MySQL在不久的將來將能使用。
VARCHAR
類型﹔一個VARCHAR
列以2各字節儲存的長度開始。
VARCHAR
的表可以式固定或動態的記錄長度。 VARCHAR
和CHAR
可以最大64K字節。所有的關鍵字片斷有其自身的語言定義,這將使得MySQL每列有不同的語言定義。
UNIQUE
﹔這將允許你在一個表中的任何列組合上有UNIQUE
屬性。(然而,你不能搜索一個UNIQUE
計算的索引。)你也可以使用放棄的ISAM桌子類型。這將在不久消失,因為MyISAM
是同一個東西的更好實現。ISAM使用一個B-tree
索引,這個索引儲存在一個有.ISM
擴展名的文件中並且數據儲存在有.ISD
擴展名的文件中,你可用isamchk
實用程式檢查/修復ISAM表。見13.4 使用myisamchk
恢復崩潰。ISAM表不是跨OS/平台二進制可移植的。ISAM
有下列特徵/屬性:
HEAP
HEAP
表格使用一個雜湊(hashed)索引並且儲存在內存中。這使他們更快,但是如果MySQL崩潰,你將失去所有儲存的數據。HEAP
作為臨時表很可用!
CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) as down FROM log_table GROUP BY ip; SELECT COUNT(ip),AVG(down) FROM test; DROP TABLE test;
當你使用HEAP
表時,這裡是你應該考慮的一些事情:
CREATE
語句中指定MAX_ROWS
以保証你有意不使用所有的內存。
=
和<=>
一起使用(但是很快)。
HEAP
表使用一個固定的記錄長度格式。 HEAP
不支援BLOB
/TEXT
列。 HEAP
不支援AUTO_INCREMENT
列。 HEAP
不支援在一個NULL
列上的索引。 HEAP
表中有非唯一鍵(雜湊表一般不這樣)。 HEAP
表格在所有的客戶之間被共享(就像任何其他的表)。 HEAP
表的數據以小塊分配。表是100%動態的(在插入時),無需溢出區和額外的鍵空間。刪除的行放入一個鏈接表並且當你把新數據插入到表時,它將被再次使用。
DELETE FROM heap_table
或DROP
TABLE heap_table
。 max_heap_table_size
大的HEAP
表。