Mysql charとvarrharの違い
4360 ワード
http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#char
11.4.1.CHARとVRCHARRタイプ
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モードで値の挿入を無効にします.5.3.2節「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列から末尾のスペースが削除されたからだ.以下の例でその違いを説明する.
すべてのMySQL校正規則はPADSPACE類に属することに注意してください.これは、MySQLの中のすべてのCHARとVRCHARR値を比較する際に、任意の末尾スペースを考慮する必要がないことを示しています.
最後の塗りつぶし文字が切り取られたり比較されたりして無視されている場合、列の索引に一意の値が必要であれば、列の中に塗りつぶした文字の数だけ異なる値を挿入すると、コピーキーのエラーが発生します.
CHAR BYTEはCHAR BINARYの別名です.互換性を保証するためです.
ASCII属性はCHAR列にlatin 1文字セットを割り当てます.UNICODE属性はucs 2文字セットを割り当てます.
11.4.1.CHARとVRCHARRタイプ
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モードで値の挿入を無効にします.5.3.2節「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列から末尾のスペースが削除されたからだ.以下の例でその違いを説明する.
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文字セットを割り当てます.