【初心者向け】SQLのデータ型とは?文字列・数値・日付型など使い分けをわかりやすく解説!

データベース・SQL

SQLでテーブルを作成するとき、こんな記述を見たことがあるかもしれません:

CREATE TABLE users (
  id INT,
  name VARCHAR(50),
  created_at DATE
);

この「INT」「VARCHAR(50)」「DATE」の部分が、SQLにおける「データ型」です。

データ型は、「このカラムにはどんな種類のデータが入るか」を決める非常に重要な設定です。

誤ったデータ型を使うと、検索や計算が正しくできなかったり、パフォーマンスに悪影響が出たりすることも…。

この記事では、SQL初心者向けに主要なデータ型の種類・用途・注意点をわかりやすくまとめます。

「これからテーブル設計を始めたい」「データ型の違いがよくわからない」という方におすすめです!

スポンサーリンク

データ型とは何か?SQLでの役割

データ型の基本的な目的

データ型は、データベースで以下の役割を果たします:

  • データの種類を明確化 数値なのか、文字列なのか、日付なのかを区別します
  • 無効な値を防ぐ 「誕生日」カラムに文字列が入らないように制限をかけます
  • パフォーマンスの最適化 適切な型で効率的な検索や保存を実現します
  • メモリ使用量の最適化 必要最小限のメモリでデータを保存します

なぜデータ型が重要なのか?

例えば、年齢を文字列型で保存すると:

  • 「30歳以上」の検索ができない
  • 平均年齢の計算ができない
  • ソート順がおかしくなる(”9″ > “10”になってしまう)

ポイント: データ型は「どんなデータが入るか」をルールとして定めるもの。

数値型(INT・FLOAT・DECIMALなど)

INT(整数型)

age INT,
quantity INT,
user_id INT

使用場面: 年齢、個数、IDなど小数点のない数値

特徴:

  • 範囲:約-21億〜+21億
  • メモリ効率が良い
  • 計算が高速

BIGINT(大きな整数)

user_count BIGINT,
total_sales BIGINT

使用場面: INTでは足りない大きな数値

特徴:

  • 範囲:約-922京〜+922京
  • INTより多くのメモリを使用

FLOAT / DOUBLE(浮動小数点数)

temperature FLOAT,
distance DOUBLE

使用場面: 科学計算、測定値など

注意点: 金額計算には不向き(誤差が生じる可能性)

例:

-- 0.1 + 0.2 が 0.3 にならない場合がある
SELECT 0.1 + 0.2; -- 結果: 0.30000000000000004

DECIMAL(p, s)(固定小数点数)

price DECIMAL(10, 2),  -- 最大8桁.小数点以下2桁
salary DECIMAL(8, 0)   -- 整数8桁

使用場面: 金額、正確な計算が必要な数値

特徴:

  • 誤差が生じない
  • p:全体の桁数、s:小数点以下の桁数

覚えておこう: 整数はINT、金額など精度が大事な場合はDECIMALがベスト。

文字列型(CHAR・VARCHAR・TEXTなど)

CHAR(n)(固定長文字列)

country_code CHAR(2),   -- "JP", "US"など
postal_code CHAR(7)     -- "1234567"

使用場面: 文字数が決まっているデータ

特徴:

  • 常にn文字で固定(足りない場合はスペースで埋める)
  • 検索が高速
  • メモリを無駄に使う可能性

VARCHAR(n)(可変長文字列)

name VARCHAR(50),
email VARCHAR(100),
address VARCHAR(200)

使用場面: 一般的な文字列データ

特徴:

  • 最大n文字まで保存可能
  • 実際の文字数分だけメモリを使用
  • 最も よく使われる型

TEXT(長文)

description TEXT,
blog_content TEXT,
notes TEXT

使用場面: ブログ記事、商品説明、備考欄など

注意点:

  • データベースによってはインデックスが制限される
  • 大量のデータがある場合はパフォーマンスに影響

テクニック: 短文ならVARCHAR、長文や自由記述欄にはTEXT。桁数が決まっているならCHARも選択肢です。

日付・時間型(DATE・DATETIME・TIMESTAMPなど)

DATE(年月日)

birth_date DATE,
registration_date DATE

形式: YYYY-MM-DD(例:2024-12-25)

使用場面: 誕生日、登録日など時間が不要な日付

DATETIME(年月日時分秒)

created_at DATETIME,
updated_at DATETIME

形式: YYYY-MM-DD HH:MM:SS(例:2024-12-25 14:30:00)

使用場面: 作成日時、更新日時など正確な時刻が必要な場合

TIME(時分秒)

opening_time TIME,
work_hours TIME

形式: HH:MM:SS(例:09:30:00)

使用場面: 営業時間、作業時間など

TIMESTAMP(タイムスタンプ)

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

特徴:

  • DATETIMEと似ているが、タイムゾーンを考慮
  • デフォルトで現在時刻を自動設定可能
  • 自動更新機能あり

実用例:

CREATE TABLE posts (
  id INT AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(100),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

覚えておこう: 日付だけならDATE、時間も必要ならDATETIME。自動記録ならTIMESTAMPが便利です。

その他のデータ型(BOOLEAN・BLOBなど)

BOOLEAN(真偽値)

is_active BOOLEAN,
is_deleted BOOLEAN,
is_published BOOLEAN

値: TRUE(1) / FALSE(0)

使用場面: フラグ、状態管理

実用例:

-- アクティブなユーザーのみを取得
SELECT * FROM users WHERE is_active = TRUE;

BLOB(バイナリラージオブジェクト)

profile_image BLOB,
document_file BLOB

使用場面: 画像、PDF、音声ファイルなど

注意点:

  • データベースのサイズが大きくなる
  • バックアップ時間が長くなる
  • 通常はファイルサーバーを使うことが推奨される

JSON型(MySQL 5.7以降、PostgreSQL 9.2以降)

user_preferences JSON,
product_attributes JSON

使用場面: 柔軟な構造のデータ

実用例:

INSERT INTO users (name, preferences) 
VALUES ('田中', '{"theme": "dark", "language": "ja"}');

まとめ: フラグにはBOOLEAN、ファイルを保存したいときはBLOB。ただし用途に注意が必要です。

データ型を選ぶときのコツと注意点

選び方のポイント

データの性質をよく考える

  • 金額 → DECIMAL
  • 名前 → VARCHAR
  • 登録日 → DATEまたはTIMESTAMP

適切なサイズを選ぶ

  • 不要に大きな型を使わない
  • 将来の拡張も考慮する

NULL値を許可するかを決める

CREATE TABLE users (
  id INT NOT NULL,           -- 必須項目
  name VARCHAR(50) NOT NULL, -- 必須項目
  phone VARCHAR(15)          -- 任意項目(NULLを許可)
);

よくあるミスと対策

ミスの例問題点正しい選択
金額にFLOATを使う計算誤差が出るDECIMAL(10,2)
生年月日にVARCHARソート・比較ができないDATE
全項目にTEXTを使うメモリ無駄遣い、性能低下適切なサイズのVARCHAR
IDにVARCHAR数値計算ができないINT AUTO_INCREMENT

パフォーマンスを考慮した設計

インデックスを考慮する

-- 検索によく使うカラムは適切な型を選ぶ
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_order_date ON orders(order_date);

メモリ使用量を最適化する

-- 良い例:必要最小限のサイズ
name VARCHAR(50),
age TINYINT,        -- 0-255(年齢には十分)
status CHAR(1)      -- 'A'ctive, 'I'nactive

-- 悪い例:過剰なサイズ
name VARCHAR(1000),
age BIGINT,
status VARCHAR(255)

実践的なテーブル設計例

ユーザー管理テーブル

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  email VARCHAR(100) NOT NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL,
  birth_date DATE,
  is_active BOOLEAN DEFAULT TRUE,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

商品管理テーブル

CREATE TABLE products (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  description TEXT,
  price DECIMAL(10,2) NOT NULL,
  stock_quantity INT DEFAULT 0,
  category_id INT,
  is_available BOOLEAN DEFAULT TRUE,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

よくある質問と答え

Q: VARCHARの長さはどう決めればいいですか?
A: 実際のデータを調査して、最大値の1.2〜1.5倍程度を目安にしましょう。

Q: NULLを許可するかどうかの判断基準は?
A: ビジネス上必須のデータかどうかで判断します。必須ならNOT NULLを設定しましょう。

Q: INTとBIGINTはどう使い分けますか?
A: 一般的なIDや数量ならINTで十分です。将来21億を超える可能性がある場合のみBIGINTを使用しましょう。

まとめ:SQLのデータ型を理解して、設計ミスを防ごう!

重要ポイントまとめ:

  • データ型は「何が入るか」を定義する重要な情報
  • 数値・文字列・日付・論理値など、目的に合った型を選ぼう
  • 間違った型は、検索・計算・パフォーマンスに悪影響
  • 将来の拡張性も考慮した設計が大切

コメント

タイトルとURLをコピーしました