字元集與資料庫

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」表格中,所以你可以使用查詢敘述取得所有資料庫的相關資訊:

results matching ""

    No results matching ""