今回は、DB設計をする上で毎回text型とvarchar型の違いや引数について調べることが多かったので今回まとめるようにしました。
「とりあえずメッセージだからtext型にしとこっと」とか、「varchar型とかtext型で最大文字数って変わってくるんかいな?」みたいなところも毎回調べて、正しいのか?とか精査するのが面倒なので、今回は調べてできるだけ正しい情報になるようにまとめていこうかと思っているのでいこうと思います!
ちなみにDBによっては色々制限が変わってくるので今回はMySQLを前提として調査していきます〜
Table of Contents
記事で伝えたいこと
今回の記事で伝えたいことと、ゴールはvarchar型とtext型の違いとどんな時にどちらを使えば良さそうか?
というのがわかるようになるのが目標です!
varchar型の解説
まず、varchar型です。これが個人的にいつも調べているんよ。
ではいきます!
引数の意味
varchar()の中に入る引数は0~65535を入れることが可能です。あ、でも0が入ることはあり得ないので1からか!
ではこの引数の意味は何でしょうか?byteですか?文字数ですか?
これは文字数を表します! なのでここにはvarchar型で入力する文字列の最大文字列を入れるようにします。
最大文字数
では、varchar型の最大文字数は幾つでしょうか?
……
……
varchar型には最大で65,535文字を格納することができるんですーーーーー!!!!
おお、これは結構多いな。っと思いますが、一つ注意があります!!!!
それは、65,535文字というのはシングルバイトの想定でマルチバイトになると最大文字は以下のようになります。
例えば、utf8mb4は4byte文字を扱う文字セットなので、65,533を4で割って切り捨てた16,383が最大文字数になるようです。
よってutf8mb4の場合は最大文字数はvarchar(16383)が格納できるようなんです。
それでも思っていたよりも結構多い…
https://dev.mysql.com/doc/refman/8.0/en/char.html
VARCHAR
カラム内の値は可変長の文字列です。長さは 0 から 65,535 までの値で指定できます。VARCHAR
カラムの有効な最大長は、最大行サイズ (65,535 バイト、すべてのカラムで共有される) と使用される文字セットによって決まります。
char型とvarchar型
ちなみにvarchar型は格納された文字のサイズの領域を確保します。しかしchar型の場合は引数として指定した文字数の領域を固定的に確保するようです。
これを「固定長のデータ型」というそうです。
そして、保存された文字サイズに応じてサイズ領域が変わるvarchar型は「可変長のデータ型」というそうですって。
ほえー、char型ってそんなふうになってるねんな~
varchar(255)とvarchar(256)って何が違うのか
ではよくsqlを作る時にvarchar255とvarchar256が出てくるように感じるのですが、結局どっちが良いのでしょうか?
どっちが良いとかはないのですが、違いがあるようですね
varchar(255)は文字数を保持する領域が1byteで済みます。しかし、varchar(256)だと2byte必要なんですね。
256以上になると長さの記録が1byte増えるっぽいので、特に理由が内容だったら255でいいんじゃないかなあと思いますね。
ネットで調べても、特に256にする意味がないなら255で良いよっぽい記事ばっかりでしたし…
結局varchar(256)にすると2byte必要になるので余分にかける必要がない限りはvarcahr(255)で良いってことでしょう
引数 | 文字数カウント | 文字列格納 | 最大容量 |
varchar(255) | 1byte | 255byte | 256byte |
varchar(256) | 2byte | 256byte | 258byte |
1byteと2byteとの分かれ目は255→256
2byteと3byteとの分かれ値は65,535→65,536
なんですって。
この辺は進数関連なので10進数の255に対応する2進数を確認してみてください〜↓↓↓
text型の解説
text型ってすごくvarcha型と似ていますよね。なのでその比較や、最大文字数を調べてみましょう。
最大文字数
text型の最大長は65,535byteです。
半角→65,535字
全角→32,767字
また、絵文字とか入ってくるような場合など想定して、UTF-8の最大文字サイズ3byteを考えると、最大21,845字が入力できるようになります。
ちな、4byte文字の場合は、16,383字が入力できるっぽい。
byteサイズで65535を超えない値まで保存が可能です。
varcharとの違い
- text型はテーブル作成時に格納できるデータサイズの指定はしない
- 格納方法が違う
- varchar→文字列がDBに直接保存される
- text→DBとは別に保存されて、DBにはそのポインターのみが保存される
- 処理速度が違う
- varchar型はDBに直接保存される分、短い文字列ならvarcharの方が早くなる….?
速度の比較について検証されていたブログがあったので共有します。
結局速度はそんなに変わらないのかなあ…
varcharとtextどっちを使う?
簡単にいうと、varcharは64kbよりも長い文字列を格納できないのでそれ以上のサイズを格納することがあるならtext(mediumtext, longtext)を使うと良さそう。
まとめ
varchaとtextの違いがなんとなくわかるようになったのではないでしょうか?
自分でも調べるようなことがたくさんあって、これを調べるとあれが分からないからそれを調べる。
みたいな調べたら分からないことがあって、それを調べたら分からないことがあって……
みたいなのがたくさんあったのでなんとかまとめられてよかったかと思います。
もっとDB設計に関しても知識つけていかないといけないなあ