2012年8月18日土曜日

MySQL5:CHARとVARCHAR型




<meta charset="utf-8">
http://dev.mysql.com/doc/refman/5.0/en/char.html
CHARは固定型であり、VARCHARは、可変型と呼ばれるほどの知識だけ持って、データベースを扱う韓国語圏のユーザーのために、MySQLリファレンスマニュアルの内容を翻訳してみた。

CHAR型は固定型。最大長は255。
VARCHAR型は可変型。最大長は255、MySQL 5.0.3以降では65,535まで可能。
VARCHAR型は255文字以下に1バイト、それ以上は2バイトの領域を必要とする。
4.1以降ではCHAR(n)、VARCHAR(n)でnは、バイトではなく、文字の数を意味します。つまり、キャラクタセットの影響を受ける。
文字列の後に続く空白は列の型/バージョン/ SQLモードに応じて異なる処理ができる。
任意のバイト配列を保存する場合、BLOBを選択してください。
CHAR / VARCHAR型の比較や並べ替えをする際に後続の空白は無視される。インデックスも同様。
VARCHAR型を含む列を削除/更新する場合には、テーブルに使用されていない小さな破片が飛び散ることができる。このような可変長の行型のテーブルは、時々OPTIMIZE TABLE [tablename]を使用して破片を除去してディスク容量を節約(表スペースを使っていない)と読み取り速度の向上を図ることができる。


10.4.1。 CHARとVARCHAR型
CHARとVARCHAR型は似ていますが、保存して読み込む部分は異なっている。 MySQL 5.0.3以降では最大の長さと残りの領域の保管状況についても変わった。

CHARとVARCHAR型は保存したい文字列の最大長を含めて宣言することになる。たとえば、CHAR(30)は、30文字まで保存できる。

CHAR列の長さは、テーブルを作成する際に指定した長で固定され、長さは0から255まで可能である。 CHAR値を格納するときは、文字列の右側に空白を入れて、指定した長さに合わせることになる。値を読み込む際には、スペースを削除して読む。

VARCHAR列の値は可変長文字列です。指定できる長さは0から255までで、MySQL 5.0.3以降では、0から65,535まで指定できます。 MySQL 5.0.3以降のバージョンでVARCHAR有効最大長は、最大行サイズ(最大65,535バイト)と文字セットの使用に影響を受ける。

CHAR型とは異なり、VARCHAR型は1バイトまたは2バイトの値を前に保存し、これは値の大きさが何バイトかを示します。 255文字以下の場合は1バイト、それ以上であれば2バイトを占めている。

厳格なSQLモード(strict SQL mode)が有効になっていない状態で、列の最大長を超えて値を保存すると、値を短く保持し、警告を発生させる。厳格なSQLモードを有効にすると、空白以外の文字列を文字際に警告ではなくエラーを発生させ、値を追加できないようにすることができます。詳細については、次のリンクをご参照ください。 Section 5.1.6、 "Server SQL Modes"。

VARCHAR列、列の長さを超えているスペースはSQLモードに関係なく、切り捨てられた保存され、警告を発生させる。 CHAR列の場合は、同様に動作しますが、警告が発生しない。

VARCHAR値は格納する際に空白が追加されません。後ろが空白の処理は、バージョンによって異なります。 MySQL 5.0.3以降では、標準SQLとの互換性のために後ろが空白を削除せずに保管し、読み込むことも保存してくれる。 MySQL 5.0.3以前では、格納する際に後続の空白は削除され、これは値を読み込む際にも削除されたままイルヒムウルを意味する。

MySQL 5.0.3以前の後ろが空白を維持するためには、BLOBやTEXT型選択した。また、暗号化された値の圧縮機能を使用して得られた任意のバイト型の値を保管するときはCHARやVARCHAR型ではなくBLOBを選択することが、データの変換をもたらす空白の削除による潜在的な問題から回避することが可能になります。

次の表は、文字列をCHAR(4)とVARCHAR(4)列収納のための結果を使用してCHARとVARCHAR型の違いを示す。 (すべての列はlatin1のような1バイト文字セットを使用することを前提とする。)

値CHAR(4)必要な記憶領域のサイズVARCHAR(4)必要な記憶領域のサイズ
'' '"4 bytes'' 1 byte
"ab"、 "ab" 4 bytes 'ab' 3 bytes
"abcd" "abcd" 4 bytes "abcd" 5 bytes
"abcdefgh" "abcd" 4 bytes "abcd" 5 bytes
最後の行の値は、厳密なSQLモードを使用していない場合にのみ適用される。もし厳密なSQLモードでMySQLが動作する場合、長さを超える値が格納されず、エラーを発生させる。

CHAR列の値を読み取るときに、後ろの空白を除去するため、CHAR(4)とVARCHAR(4)に指定された値と読んだときに得られた値は常に同じではない。以下は、この違いを示す例です。



CHARとVARCHARの列に書かれた値をソートしたり比較する際に、その列を持っているキャラクターセット - コレレーション(collat​​ion)の影響を受ける。すべてのMySQLのコレレーションはPADSPACEである。これは、MySQLのCHARとVARCHARの値の後ろが空白の影響なしに比較することがあることを意味します。

VARCHAR列の値を保存する前に、空白を削除するMySQLのバージョンを使用していても、SQLモードの有効または無効になっていても関係がなく、すべてのMySQLのバージョンに対応する。

通知
MySQLの文字セットとコレレーションは、以下を参照します。 Section 9.1、 "Character Set Support"。

このような場合に後続の空白は削除されたり比較時に無視されるため、この列に唯一のインデックス(unique index)を必要とする場合に、後続の空白の数だけ違って内容が同じ文字列を入力すると、ジュンボクキエラーを発生させる。たとえば、テーブルが 'a'を持っている状態で、 'a'を格納しようとすると、ジュンボクキエラーが発生します。

0 件のコメント:

コメントを投稿