MySQLにおけるCHARとVRCHARタイプの発展と詳細
進化:MySQLデータベースのvarrharタイプは5.0.3以下のバージョンの中で最大長さは255で、そのデータ範囲は0~255であることができます。MySQL 5.0.3および以上のバージョンでは、varrharデータタイプの長さは65535にサポートされています。つまり、65532バイトのデータを保存することができます。開始ビットと終了ビットは3バイトを占めています。つまり、5.0.3以下のバージョンでは固定TEXTまたはBLOBフォーマットを使用して保存する必要があります。これにより、データベースファイルのサイズを減らすことができます。varrharに設定した長さより大きいものを書き込むと、デフォルトでは後ろの部分をカットします。二、詳細解(MySQL 5.1):CHARとVRCHARRのタイプは似ていますが、保存と検索の方式は違います。それらの最大長さと末尾のスペースが保存されているかどうかなどの点でも違います。保存または検索中は、大文字小文字変換は行いません。CHARとVRCHARRタイプの声明の長さは、あなたが保持したい最大文字数を表しています。例えば、CHAR(30)は30文字を占有することができる。CHAR列の長さは表作成時に宣言された長さに固定されています。長さは0から255までの任意の値でありうる。CHAR値を保存すると、その右側にスペースを詰めて指定の長さにします。CHAR値を検索すると、末尾のスペースが削除されます。保存または検索中は、大文字小文字変換は行いません。VRCHAR列の値は可変長文字列です。長さは0から65、535までの値を指定できます。VRCHARの最大有効長さは、最大行サイズと使用文字セットで決定されます。全体の最大長さは65,532バイト)です。CHARとは対照的に、VRCHARR値は保存時に必要な文字数だけ保存し、もう1バイトを追加して長さを記録します(列宣言の長さが255を超える場合は、2バイトを使用します)。VRCHAR値は保存時に充填しません。値を保存して検索する時には、末尾のスペースはまだ保存されています。標準SQLに適合しています。CHARまたはVRCHARR列に割り当てられた値が列の最大長さを超える場合、値をトリミングして適切にする。カットされた文字がスペースでないと警告が発生します。スペースではない文字を裁断すると警告ではなくエラーが発生します。厳密なSQLモードで値を無効にして挿入します。以下の表は、CHAR(4)とVRCHARR(4)列に各種文字列値を保存した結果を示しており、CHARとVRCHARRの違いを説明している。
値
CHAR(4)
デマンド
VRCHAR(4)
デマンド
''
' '
4バイト
''
1バイト
ab
ab '
4バイト
ab
3バイト
'abcd'
'abcd'
4バイト
'abcd'
5バイト
'abc defgh'
'abcd'
4バイト
'abcd'
5バイトを注意してください。前の表の最後の行の値は厳格なモードを使用しない場合のみ適用されます。MySQLが厳密なモードで動作すると、列の長さを超えた値が保存されず、エラーが発生します。CHAR(4)とVRCHARR(4)列から検索した値は常に同じではない。検索時にCHAR列から末尾のスペースが削除されたからだ。この違いを以下の例で説明します。
値
CHAR(4)
デマンド
VRCHAR(4)
デマンド
''
' '
4バイト
''
1バイト
ab
ab '
4バイト
ab
3バイト
'abcd'
'abcd'
4バイト
'abcd'
5バイト
'abc defgh'
'abcd'
4バイト
'abcd'
5バイトを注意してください。前の表の最後の行の値は厳格なモードを使用しない場合のみ適用されます。MySQLが厳密なモードで動作すると、列の長さを超えた値が保存されず、エラーが発生します。CHAR(4)とVRCHARR(4)列から検索した値は常に同じではない。検索時にCHAR列から末尾のスペースが削除されたからだ。この違いを以下の例で説明します。
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
+----------------+----------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+----------------+
| ab + | ab+ |
+----------------+----------------+
1 row in set (0.00 sec)
は、列に割り当てられた文字セット校正規則に基づいて、CHARとVRCHARR列の値を並べ替えて比較します。すべてのMySQL校正規則はPADSPACE類に属します。これは、MySQLのすべてのCHARとVRCHARR値を比較する際に、任意の尾部スペースを考慮する必要がないことを示している。例えば、
mysql> CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10));
Query OK, 0 rows affected (0.09 sec)
mysql> INSERT INTO names VALUES ('Monty ', 'Monty ');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT myname = 'Monty ', yourname = 'Monty ' FROM names;
+-----------------------------+-------------------------------+
| myname = 'Monty ' | yourname = 'Monty ' |
+-----------------------------+-------------------------------+
| 1 | 1 |
+-----------------------------+-------------------------------+
1 row in set (0.00 sec)
は、すべてのMySQLバージョンが同じであり、SQLサーバモードの影響を受けないことに注意してください。最後の塗りつぶし文字が切り取られたり比較されたりして無視されている場合、列の索引に一意の値が必要であれば、列の中に塗りつぶした文字の数だけ異なる値を挿入すると、コピーキーのエラーが発生します。CHAR BYTEはCHAR BINARYの別名である。これは互換性を保証するためです。ASCII属性は、CHAR列にlatin 1文字セットを割り当てます。UNICODE属性割付ucs 2文字セットです。