字元集與資料庫
First Chapter
1 Character Set與Collation
任何資訊技術在處理資料的時候,如果只是單純的數值和運算,那就不會有太複雜的問題;如果處理的資料是文字的話,就會面臨世界上各種不同語言的問題。以資料庫來說,它必須正確的儲存各種不同語言的文字,也就是一個資料庫中,有可能同時儲存繁體和簡體中文、法文等不同語言的文字。
電腦在處理文字資料大多是使用一個「編碼」來表示某一個字,對MySQL資料庫來說,為了要處理不同語言的文字,它使用一套編碼來處理一種語言的文字,稱為「字元集、character set」。以英文字母來說,每一個字母都有一個編碼,例如A=65、B=66、C=67。
MySQL可以依照你的需要為資料庫設定不同的字元集:
Collation指的是在一個字元集中,所有字元的大小排序規則。以英文字母來說,我們會依照A到Z的順序當成大小的順序,小寫的字母也是一樣的。這樣的大小順序是依照編碼的大小來決定的,MySQL把它稱為「binary collation」。
可是在真實的世界中,大小順序卻不是這麼單純,有時候你會把大小寫的英文字母當成是一樣的,例如大寫的A和小寫的a。在這種情況下,大寫和小寫的字母會被當成是一樣的大小,然後再依照編碼來決定,例如大寫A的編碼比小寫a的編碼小。MySQL把這樣的方式稱為「case-insensitive collation」。
在決定大小順序的時候,如果只有考慮字母大小寫因素的話,那還不算是太複雜的。如果再考慮各種不同語言特性的話,在決定大小順序的時候就會變得很複雜。以繁體中文來說,它是沒有區分大小寫的,而且一個中文字會包含一個以上的位元組,其它的語言也都會有類似的情況。
1.1 Character Set
MySQL資料庫把各種不同字元集的編碼資料紀錄在系統資料庫中,你可以使用下列的指令查詢MySQL資料庫支援的字元集資訊:
SHOW CHARACTER SET
執行上列的查詢指令後可以得到下列的結果:
1.2 COLLATION
MySQL除了支援各種不同的字元集,讓資料庫可以儲存不同語言的文字外,每一種字元集都可以依照實際需要,搭配不同的Collation設定。你可以使用下列的指令查詢MySQL支援的Collation資訊:
SHOW COLLATION
執行上列的查詢指令後可以得到下列的結果:
你也可以使用類似「WHERE」子句中的條件設定,查詢某一種字元集支援的Collation資訊:
你可以從Collation名稱分辨出排序的準則:
2 資料庫
資料庫(Database)是用來保存各種資料元件的容器,在安裝好MySQL資料庫伺服器軟體後,就可以依照自己的需求建立資料庫,MySQL對於資料庫的數量並沒有限制:
每一個MySQL資料庫伺服器軟體都會使用一個儲存資料的資料夾,稱為「data directory」。在這個資料夾下,每建立一個資料庫,MySQL都會建立一個資料夾,稱為「資料庫資料夾、database directory」,一個資料庫包含的檔案就會放在各自的資料庫資料夾中:
註:使用「SHOW VARIABLES LIKE ‘datadir’」敘述,可以查詢MySQL資料庫伺服器使用的資料庫資料夾。
因為一個資料庫會是檔案系統中的一個資料夾,所以你要特別留意下列的特性:
- 雖然MySQL對於資料庫的數量並沒有限制,可是你要注意MySQL資料庫伺服器軟體所安裝的作業系統,它對於資料夾與檔案大小的限制。
- MySQL使用資料庫名稱作為資料庫資料夾的名稱,所以你要特別注意大小寫的問題。在資料夾名稱不分大小寫的作業系統(例如Windows),資料庫名稱「MyDB」和「mydb」是一樣的;可是在資料夾名稱會區分大小寫的作業系統(例如Linux),資料庫名稱「MyDB」和「mydb」就不一樣了。
- 每一個資料庫資料夾中都有一個特別的檔案,檔案名稱是「db.opt」,這個檔案的內容是資料庫的字元集與collation設定。
註:MySQL把「DATABASE」與「SCHEMA」當成是一樣的,所有你在後續使用的指令,都可以把「DATABASE」換成「SCHEMA」。
2.1 建立資料庫
下列是建立資料庫的語法:
在你執行新增資料庫的指令以後,MySQL會使用你指定的資料庫名稱建立一個資料庫資料夾:
如果你指定的資料庫名稱已經存在了,MySQL會產生一個錯誤訊息:
為了避免上列的錯誤,你可以在建立資料庫的時候加入「IF NOT EXISTS」,如果你指定的資料庫名稱不存在,同樣會建立新的資料庫;如果已經存在,MySQL只會產生警告訊息:
你可以在建立資料庫的時候指定資料庫預設的字元集與collation,如果沒有指定的話,就會使用MySQL伺服器預設的設定:
註:如果沒有修改過MySQL設定的話,預設的字元集是「latin1」,Collation是「latin1_swedish_ci」。
建立資料庫的時候指定字元集與collation會有一些不同的組合,例如下列只有指定字元集的話,MySQL會使用你指定字元集的預設collation:
另外一種是只有使用「COLLATE」指定collation,MySQL會使用你指定collation所屬的字元集:
註:建立資料庫的時候,不管你有沒有指定,資料庫都會有預設的字元集與collation。以後在這個資料庫建立的表格,都會使用資料庫預設的字元集與collation。
2.2 修改資料庫
建立資料庫以後,你唯一能執行的修改是資料庫預設的字元集與collation。下列是修改資料庫設定的語法:
下列的敘述執行修改資料庫預設的字元集與collation。在修改的時候,如果只有指定字元或只有指定collation的話,設定的規則與建立資料庫一樣:
註:修改資料庫的字元集是或Collation,並不會影響原來已經存在的表格。
2.3 刪除資料庫
下列是刪除資料庫的語法:
如果在刪除資料庫的敘述中指定的資料庫名稱不存在,MySQL會產生一個錯誤訊息:
為了避免上列的錯誤,你可以在刪除資料庫的時候,加入「IF EXISTS」指令,如果你指定的資料庫名稱存在,同樣會刪除指定的資料庫;如果不存在,MySQL只會產生警告訊息:
註:執行刪除資料庫的敘述,MySQL不會再跟你確認是否刪除資料庫,而是直接刪除;刪除資料庫以後,表示資料庫資料夾也會從檔案系統中刪除,除非你另外還有這個資料庫的備份,否則原來在資料庫中的所有資料就全部消失了。
2.4 取得資料庫資訊
MySQL提供「SHOW」指定讓你取得跟資料庫相關的資訊,執行下列的指令可以取得MySQL伺服器中所有資料庫的名稱:
你也可以執行下列的指令取得建立資料庫的敘述:
MySQL資料庫伺服器有一個很重要的資料庫,名稱為「information_schema」,這個資料庫通常會把它稱為「系統資料庫」,資料庫中儲存伺服器所有重要的資訊。跟資料庫相關的資訊儲存在「SCHEMATA」表格中,所以你可以使用查詢敘述取得所有資料庫的相關資訊: