mysql-logo.gif (3082 bytes)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


第一章, 前一章, 下一章, 最後一章目錄.


9 MySQL伺服器功能

9.1 MySQL支援哪些語言?

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”文件進行更新。

9.1.1 用於數據和排序的字符集

內定地,MySQL使用 ISO-8859-1 ( Latin1 ) 字符集。這是在美國和西歐使用的字符集。

字符集決定了在名字中允許什麼字符和如何由SELECT語句的ORDER BYGROUP BY子句排序。

通過給configure--with-charset=charset選項,你可以在編譯時改變字符集。見4.7.1 快速安裝概述

為了把其他字符集加入MySQL,使用下列程序:

9.1.2 增加一個新的字符集

  1. 為字符集選擇一個名字,下面用MYSET表示。
  2. MySQL原始碼版本中創造文件“strings/ctype-MYSET.c”
  3. 研究一個現有的“ctype-*.c'文件,看需要定義什麼。注意,你文件中的數組必須有類似於ctype_MYSETto_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
    
  4. 為你的字符集增加一個唯一的編號到“include/m_ctype.h.in”
  5. 把字符集名字加到在configure.in中的CHARSETS_AVAILABLE表。
  6. 重新配置,重新編譯並且測試。

9.1.3 多字節字符支援

如果你正在創建一個多字節字符集,你可以使用_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,否則如果它是,返回字符的大小(字節數)。pe指向字符串的開始和結束。檢查是從(char*)p(char*)e-1
ismbhead(c) 如果c是一個多字節字符字符串的第一個字符,返回真。
mbcharlen(c) 如果c是一個多字節字符串的第一個字符,返回該字符串的大小。
MBMAXLEN 在字符集中最大字符的字節大小。

9.2 更新日誌

當以--log-update=file_name選項啟動時,mysqld將所有更新數據的SQL命令寫入記錄文件中。文件被寫入數據目錄並且有一個名字file_name.#,這裡#是一個數字,它在每次執行mysqladmin refreshmysqladmin flush-logsFLUSH LOGS語句、或重啟伺服器時加1。

如果你使用--log-l選項,mysqld用一個文件名“hostname.log”寫一個通用的記錄文件,並且重啟和更新不會引起一個新的記錄文件產生(盡管它被關閉並且再打開)。內定地,mysql.server腳本用-l選項啟動MySQL伺服器,如果當你在生產環境中開始使用MySQL時,你需要好一些的性能,你可以從mysql.server中刪除-l選項。

更新記錄很聰明,因為它僅僅記載真正更新數據的語句。因此一個用WHEREUPDATEDELETE找不到行,它就不被寫入記錄文件。它甚至跳過將設置一個列為它已經有的值的UPDATE語句。

如果你想要從更新記錄文件更新一個資料庫,你可以如下做到(假設你的更新記錄有“file_name.#”形式的名字):

shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysql

ls被用來以正確的次序得到所有的記錄文件。

如果你必須在一個崩潰後恢復到備份文件並且你想要再做發生在備份和崩潰之間的更新,這可以很有用。

當你在其他主機上有一個鏡像資料庫並且你想要複製必須對主資料庫進行的改變時,你也可以使用更新記錄。

9.3 MySQL資料庫表可以有多大?

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_LENGTHMAX_ROWS參數。見7.7 CREATE TABLE語法。你也能用ALTER TABLE在以後設置這些。見7.8 ALTER TABLE語法

如果你的大表要變成只讀,你可以使用myisampack合並並且把許多表壓縮成一個。myisampack通常壓縮一個表到至少50%,因此你可以有,實際上,更大的表。見12.5 MySQL壓縮的只讀的表產生器

另一個的解決方案可以是內含包括MERGE庫,它允許你將一個許多相同的表的集合作為一個來處理。(在這種情況下相同意味著所有的表由相同的列資訊創建)目前MERGE只能用於掃描一個表集合,因為它不支援索引。我們在不久的將來將把索引加進去。

9.4 MySQL資料庫表類型

用MySQL,目前(版本 3.23.6)你可以在三種基本資料庫表格式間選擇。當你創建一張表時,你可以告訴MySQL它應該對於表使用哪個表類型。MySQL將總是創建一個.frm文件保存表和列定義。視表類型而定,索引和數據將在其他文件中儲存。

你能用ALTER TABLE語句在不同類型的表之間變換。見7.8 ALTER TABLE語法

MyISAM
MySQL 3.23中,MyISAM是內定表格類型,它是基於ISAM代碼並且有很多有用的擴展。索引儲存在一個有.MYI(MYindex)擴展名的文件並且數據儲存在有.MYD(MYData)擴展名的文件中。你能用myisamchk實用程式檢查/修復MyISAM表。見13.4 對崩潰恢復使用myisamchk。下列幾點在MyISAM中是全新的:

MyISAM也支援下列東西,MySQL在不久的將來將能使用。

你也可以使用放棄的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表時,這裡是你應該考慮的一些事情:


第一章, 前一章, 下一章, 最後一章目錄.