今回は、SQLのデータ型のうち、CHAR
やVARCHAR
などの「文字列型」について説明します。
文字列型データは、実社会においても頻繁に使われるデータ型のひとつで、日常的に接している情報でもあります。たとえば、Amazonの巨大な商品データベースのうち、商品名やレビューなどが文字列型に該当します。
SQLの文字列型では、CHAR
やVARCHAR
などのほか、TEXT
のような大文字列型も存在しています。
この記事では、SQLの文字列型CHAR
とVARCHAR
の違いと、それぞれの文字列型の使い分けについて解説します。
文字列型の基本
この章では、文字列型とはなにか、SQLの文字列型の種類など、まずは文字列型の基本について説明します。文字列型は日常的に接しているデータベースでもよく使われているデータ型のひとつです。
文字列型とはなにか
文字列型とは、数あるデータ型のうち文字(テキスト)属性を持ったデータのことです。
文字列型は、データを「文字として」扱いますので、四則演算などの計算はできません。文字列型は、Excelでも頻出するデータ型のため、イメージはしやすいでしょう。
たとえば、商品データベースの「商品名」や従業員データベースの「氏名」「住所」などの情報が該当します。
文字列型はSQLのみではなく、Excelや各種プログラミング言語でも使われている基本的なデータ型です。
文字列型の種類
文字列型は、固定長文字列型、可変長文字列型、大文字列型などに細分化されます。
SQLでは、CHAR
(固定長文字列型)、VARCHAR
(可変長文字列型)、TEXT
、CLOB
(大文字列型)など、目的に応じたいくつかの文字列型が存在するため、用途に応じた適切なデータ型を選択する必要があります。
データベースの基本設計を行う際には、各文字列型の特徴、最大格納可能文字数などは把握しておきましょう。
データ型名 | 説明 |
---|---|
CHAR | 固定長の文字列を格納する。1から255文字まで指定可能 |
VARCHAR | 可変長の文字列を格納する。約65,535文字まで指定可能 |
TEXT | 非常に大きな文字列を格納する。約2GBまでのテキストデータを格納可能 |
CLOB | 非常に大きな文字列を格納する。最大2GB以上のテキストデータを格納可能 |
※最大長はデータベースシステムによって異なる
CHARとVARCHARの違い
この章では、インターネットで検索されることが多いCHAR
とVARCHAR
の違いについて説明します。決定的な違いは、CHAR
が固定長文字列であることと、VARCHAR
が可変長文字列であることです。
固定長と可変長
固定長と可変長はデータベースの基本的な概念で、文字列型を使う場合には、真っ先に検討される項目です。
CHAR
は固定長で、格納される文字列の長さをあらかじめ定義しておく必要があります。たとえば国際標準化機構(ISO)の国コードであれば「JP」「US」「GB」のように、2文字で統一されていますので、それを超える文字数は考慮する必要はありません。
CHAR
はこのような文字列の長さが常に一定の場合に最適です。
一方、住所や商品名、前職情報などは文字列の長さをあらかじめ定義できません。VARCHAR
は、このような文字列の長さが不定の場合に使われます。
固定長は空白埋め
固定長文字列型であるCHAR
は、定義された長さより短いデータを格納する際、残りのスペースを空白で埋めます。たとえば、性別の場合、「男性」「女性」「未回答」という3択を想定すると、CHAR
では全角3文字文の長さで定義します。
そして「男性」という文字列が格納された場合、データベースには次のような文字列が格納されます。※□は空白(スペース)
男性□
このように文字列のあとに空白が続いている状態は、なんらかのシステムからcsvデータをエクスポートした際、見かけたことはないでしょうか?この現象は、データベース内で固定長文字列型CHAR
が使用されている場合に起こります。
指定された固定長よりも短い文字列が格納された場合、システムは自動的に残りのスペースを空白で埋めるためです。
CHARとVARCHARの使い分け
この章では、文字列型CHAR
とVARCHAR
の使い分けを最適化するために、データベースのストレージとパフォーマンスへの影響について説明します。
数値型同様、データベースの設計においては「とりあえず余裕を持って」という単純な理由でデータ型を判断することは推奨されません。
ストレージへの影響
文字列型の選択は、ストレージ使用量に対して直接的に影響します。
CHAR
型は固定長であるため、指定された長さに満たないデータに対しては空白で埋められ、ストレージを無駄に消費してしまいます。たとえば、CHAR(100)
として定義されたフィールドに「hello」という5文字のデータを格納すると、残りの95文字分のスペースは空白で埋められ、不要なストレージを使用します。
実際には、たったの5文字でも必ず100文字分のストレージを消費してしまうのです。
一方、VARCHAR
型は可変長であり、実際に格納される文字列の長さに応じてのみストレージを消費します。そのため、文字列の平均的な長さが予測不可能、または大きく変動する場合にはVARCHAR
を使用することで、ストレージの効率的な使用が可能になります。
パフォーマンスへの影響
文字列型の選択は、データベースのパフォーマンスにも影響します。
前節のストレージの観点では、文字列の長さの予測性に関わらず可変長のVARCHAR
を使えば、ストレージを効率的に使えることになりますが、パフォーマンスの観点ではVARCHAR
は必ずしも最適解ではありません。
VARCHAR
型は可変長であるため、データの読み込みや書き込み時に追加の処理が必要となる場合があります。この追加処理は、特に大量のデータを扱うクエリにおいて、パフォーマンスの低下を引き起こす原因になります。
適切な文字列型の選択は、データベースのストレージの効率性とパフォーマンスのバランスを考慮する必要があります。データの性質とアプリケーションの要件に基づいて、CHAR
またはVARCHAR
のどちらを使用するかを慎重に決定することが大切です。
大文字列型TEXT
SQLでは、特に大量のテキストデータを扱う場合にTEXT
型が利用されます。
このデータ型は、非常に長い文章や、ドキュメント、記事の本文など、CHAR
やVARCHAR
で扱える文字数を超えるテキストを保存するのに適しています。TEXT
型は非常に大きなデータ量を格納できるため、ブログの投稿内容や、長い説明文、複数の段落からなる長い文章などに使われます。
ただし、通常、TEXT
型の使用は、非常に大きなデータを扱うときに限られます。これは、大きなテキストデータがデータベースのパフォーマンスに影響を及ぼす可能性があるためです。
可能であれば、VARCHAR
型での対応が推奨されますが、その最大長さ(約65,535文字)を超えるデータを扱う必要がある場合にTEXT
型が使われます。
TEXT
型を使用する際は、データの取り扱いに注意が必要です。特に、検索やソート処理において、大量のテキストデータを扱うことは、システムに負荷をかける可能性があるため、適切なインデックスの設定や、データの取り扱い方針を検討することが必要です。
たとえば、データを外部ファイルに保存してデータベース内ではそのパスを保持するのも有効策です。
実例で学ぶ文字列型の選び方
この章では、ユーザープロフィールデータベース、新聞社データベース、書籍カタログを例に、格納するデータの取り扱いについて例示します。具体的なシナリオを通じて、CHAR
、VARCHAR
、TEXT
の適切な使用例を紹介します。
ユーザープロフィールデータベース
- ユーザー名: ユーザー名は一般的に長さが一定ではないため、
VARCHAR
を使用します。たとえば、VARCHAR(50)
は多くのユーザー名をカバーできるでしょう。 - 電子メールアドレス: 電子メールアドレスも可変長で、
VARCHAR(100)
を使用することが一般的です。 - 性別: 性別は「男」「女」「その他」のように選択肢が限られているため、
CHAR(1)
を使用して「M」「F」「O」などの単一文字で格納することができます。
新聞社データベース
- 記事の本文: 新聞社やオンラインメディアでは、記事の本文が非常に長くなることがあります。また、特集記事やインタビューなどでは、ひとつの記事が数千から数万文字に及ぶことも珍しくありません。このような大量のテキストデータを扱うためには、
TEXT
が最適です。 - 補足_写真やメディアの格納: レビューや記事に写真やメディアファイルを添付する場合は、通常、ファイルのパスを保存するか、
BLOB
(Binary Large Object)型を使用してデータベース内に直接格納します。
書籍カタログ
- 書籍タイトル: 多くの書籍タイトルは比較的短いため、
VARCHAR(100)
で十分な場合が多いです。しかし、非常に長い書籍タイトルも存在するため、適宜VARCHAR
の最大長を調整する必要があります。 - 著者名: 著者名は通常、
VARCHAR
を使用します。VARCHAR(50)
など、著者名を適切に格納できる長さを設定します。 - 出版社: 出版社名は一般的に一定の長さを超えることは少ないため、
VARCHAR(50)
を使用します。