MYSQLでcharとvarrharの違い


CHARはVRCHARRタイプと似ていますが、違いは主に格納されています。
CHARとVRCHARRは同じです。CHARとVRCHARRは文字長を指定しています。例えば、char(30)とvarhar(30)の表現は、全部で30文字保存できる。一つの注意点は、utf 8 mb 4符号化において、各文字が4つのノードを占めることである。utf 8では、各文字が3バイトを占める。格納する文字がCHAR/VRCHARRで指定した最大長さを超える場合。sql modeが開いていないときは、保存する文字列を切り捨てて、上位30桁のみを保存します。
CHAR列の値は固定長の文字列です。長さは、0から255文字(例えば、utf 8 mb 4:0-255*4バイト)の間の値をCHAR記憶文字を使用する場合、CHAR(30)を例にとると、30文字未満はスペースで右に塗りつぶしられます。CHAR値を検索する場合、sql mode:PAD_を有効にしない限り、CHAR.TOFLL-LIENGTH SQLモードでないと末尾のスペースが削除されます。
VRCHAR列の値は可変長の文字列です。長さは0から65535バイトの間の値として指定できます。VRCHARの有効な最大長さは、最大行サイズ(65535バイト、すべての列の間で共有)と使用する文字セットに依存します。
CHARとは異なり、VRCHARRはデータを格納する際に、1バイトから2バイト(例えば、varhar(4)を追加的に記憶し、この1バイトの長さはこの4文字の長さには算入されず、切り捨てが心配されない)、この1バイトはデータ文字の長さを記録するために使用される。データ文字の長さが255以下の場合、1バイトでデータ長を記録します。大きい場合は2バイトを使います。CHARはデータ自体のみを格納する。下図のように。
(エラー:varrharは照会時にcharより遅いのは、varharのバイト長(X)を計算するからです。
latin 1符号化では、Latin 1は中国語で保存できません。英字は1バイトです。
Value
CHAR(4)
Strage Required
VRCHAR(4)
Strage Required
''
''
4 bytes
''
1 byte
ab
ab
4 bytes
ab
3 byte
'abcd'
'abcd'
4 bytes
'abcd'
5 byte
'abc defgh'
'abcd'
4 bytes
'abcd'
5 byte
注意したいのは、VRCHAR値は格納時にスペースを充填しないことです。値を格納して検索する場合、末尾のスペースは標準SQLと一致して保持されます。CHARは逆に、CHARは格納時にスペースを充填し、検索時には末尾のスペースは削除されます。この末尾のスペースは自動的に充填されているか、それともデータ自体のかに関わらず。例を挙げます

mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 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.06 sec)<br><br><br>
三つの実験をする。

mysql> show create table vc;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                   |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| vc | CREATE TABLE `vc` (
 `v` varchar(4) DEFAULT NULL,
 `c` char(4) DEFAULT NULL,
 UNIQUE KEY `v_UNIQUE` (`v`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
1.クエリ文whereフィールド='ab'

mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc where v='    ab';
Empty set (0.00 sec)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc where c='     ab';
Empty set (0.00 sec)
2.クエリ文whereフィールド='ab'

mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc where v='ab    ';
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab )    | (ab)    |
+--------------------+--------------------+
1 row in set (0.00 sec)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc where c='ab    ';
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab )    | (ab)    |
+--------------------+--------------------+
1 row in set (0.00 sec)<br><br><br>          ,   varchar,text,char           ,  like  ,like              <br><br>

mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc where c like 'ab'; (     )
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab ) | (ab) |
| ( ab ) | (ab) |
+--------------------+--------------------+
2 rows in set (0.00 sec)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc where c like 'ab '; (     )
Empty set (0.00 sec)
 
 
 
CHAR         ,           ,                     。                   
 
 
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc where v like 'ab '; (     )
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab ) | (ab) |
+--------------------+--------------------+
1 row in set (0.01 sec)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc where v like 'ab'; (     )
Empty set (0.00 sec)
3.varrharにuniqueインデックス観測'ab'と'ab'が同時に存在できるかどうかを設定します。

mysql> insert into vc (v,c)values('ab  ', 'ab  ')
 -> ;
ERROR 1062 (23000): Duplicate entry 'ab ' for key 'v_UNIQUE'
mysql> insert into vc (v,c)values(' ab  ', 'ab  ')
 -> ;
Query OK, 1 row affected, 1 warning (0.00 sec)<br>    varchar         ,             。  varchar     ,                      Duplicate key
バイト制限という問題についても、注意したいです。インデックスの長さにも制限があります。
innodbエンジンの各インデックス列長は767バイト(bytes)に制限され、すべてのインデックス列を構成する長さと3072バイトを超えてはいけない。バイトであり、varrhar(256)は、異なる符号化バイトで計算される。例えば、utf 8 mb 4では、1文字が4バイト、256文字=1024バイトを占める。インデックスカバーの効果には達しません。1つのプレフィックスインデックスのみを作成した場合に相当します。(非常に重要です。プレフィックスインデックスは、メインキーテーブルに戻る必要があります。二次クエリ)
innodbエンジンはinnodb_を配置することによりlargeprefix=on(グローバルパラメータ、動的効果)は、1つのインデックス列の長さ制限を3072バイトまで上昇させる。
  • MySQL 5.7でデフォルトinnodb_largeprefix=1は767 bytesの長さ制限を解除しましたが、シングル列のインデックス長は最大でも3072 bytes
  • を超えてはいけません。
  • MySQL 5.6でデフォルトinnodb_largeprefix=0は、シングル列のインデックス長を制限します。767 bytesを超えてはいけません。innodb_の設定が必要ですlargeprefix=ON、innodb_file_format=barracudia、innodb_file_perテーブル=ON、Innodbテーブルの格納フォーマットがDYNAMICまたはCOMPRESSEDである場合、プレフィックスインデックスは最大3072バイト
  • を含むことができる。
    以上がMYSQLにおけるcharとvarrharの違いの詳細です。MYSQL charとvarrharに関する資料は他の関連記事に注目してください。