char型 VS varchar型 【MySQL超個人的備忘録シリーズ】

difference-between-char-and-varchar-in-mysql-top

ども、dice(@dice_dDtea)です。
今回はデータベースの話。

MySQLで文字列を扱う時
char型 とか varchar型 とあります。
今まではよく分からなかったんで、

とりま、可変長の varchar(255)で!

こういうのってまずいですよね。
なるべくブラックボックス部分を減らさないとトラブルに見舞われたとき迷宮界入りしてしまいます。

実は似ていますが、当然大きな違いがありました。
違いが微妙によく分かっていなかったんで自分なりにメモ的にまとめて備忘録としてみた。
まだ diceはDB初心者なんで間違っていたらご指摘いただけるととても助かります!

スポンサード リンク

char型

固定長の文字列です。
指定する数字はバイト数ですが実質文字数です。
0~255が設定可能です。

固定長ということは

例えば、
char(4) なら4文字格納できます、
というか常に4文字です!

4文字ジャストなら4文字です

‘abcd’ なら ‘abcd’

4文字より多くても4文字しか持ちません

‘abcdefgh’ なら ‘abcd’

4文字に満たない場合は右側にスペースで埋めて4文字に

(この例では便宜上「スペース」を「アンダーバー“_”」で表記します!)

‘ab’ なら ‘ab__’

” なら ‘____’

文字が多かろうが少なかろうが

char(4) なら、
必要な記憶容量は「4バイト」です。

char型のメリット・デメリット

カッチリ決まっていて変動しないんで、その分余計な動作はしない。
よって処理が早くなり軽いというメリットがあります。

しかし、char(255)としたら255文字だろうが空っぽの0文字だろうが、
一律 255バイト 使ってしまうんでメモリが切迫している状況では不利です。

キッチリ大きさがFIXしているならchar型

会員番号だとか、
バーコードだとか、
暗号化すると必ず32バイトになるとか・・・、
キッチリ大きさがFIXしているのであればcharを使うべきです。

ものによって変動幅が大きいならvarcharが有利です。

乗り物とかレストランの席予約みたいですね。
使おうが使いまいが、予約したのは4席。
4バイト支払って、4文字分確保します。

varchar型

chara型と違い、
固定長ではなく可変長の文字列です。

指定はバイト数を指定しますが、「=文字数」というわけにはいきません。
varchara型はchara型と違い文字だけでなく長さも記録します、
なので長さを記録する分 1バイト必要です。

0~65,535が設定可能です。
char型より大きな文字列を格納できます。
とはいえ長い文章は text型 や longtext型 にすべきですね。

可変と言うのは

最大で使う数は決めるけど、
それ未満なら大きさに合わせて変化しますよ!
ってこと。

使う文字数がまちまちで、
メモリに余裕が無いんでキッチリ大きさを確保したくない場合は可変長ですね。

例えば、varchar(4) なら最大4バイトの文字列を格納できます。

4文字ジャストならもちろん4文字

‘abcd’ なら ‘abcd’ 必要バイト数は 5バイト

4文字より多くても4文字まで

‘abcdefgh’ なら ‘abcd’ 必要バイト数は 5バイト

4文字に満たない場合は可変モード

‘ab’ なら ‘ab’ 必要バイト数は 3バイト

” なら ” 必要バイト数は 1バイト

可変長のよくある勘違い

使う文字数決まってないから

とりま、可変長の varchar型で!

指定数もテキトーに「255」あたりで!

可変なんだから文字数多くても勝手に容量が増えて格納できるんでしょ?

違います!
最大数は指定した数より増えませんorz

可変なのは、
指定した数字未満でも勝手にスペースで埋まったりして一律同じバイト数になるわけではなく、
少なければ少なくしますよ!という所が可変なだけです。

 

ノンプログラマに幸多かれ\(^o^)/
それでは~


コメント

Facebookコメント

※コメントしたけど表示されてない方へ

パーマリンクを変えてしまったおかげで表示されなくなってしまいました。
折角コメントいただいたのにスイマセンm(__)m
パーマリンク変更しても何とか表示できる方法を現在模索中です。

“Facebookコメント”じゃないコメントを残す

このコメント欄は一時的に且つ試験的に復活させ実装させています。スパムが増加すると廃止します。なのでできるだけFacebookのコメントでコメントをお願いします。m(__)m
なお、メールアドレスは公開されることはありません。

コメントを残す