データベースVARCHAR制限:文字数 vs バイト数
PostgreSQL、MySQL、SQLiteでVARCHAR(255)がどのように異なる解釈をされるか、制限が文字数かバイト数のどちらをカウントするかを理解します。
Platform Limits
詳細な説明
データベース間のVARCHAR制限
VARCHAR(255)の意味はデータベースシステムによって大きく異なります。文字をカウントするものもあれば、バイトをカウントするものもあり、この区別は国際テキストに大きな影響を与えます。
PostgreSQL
PostgreSQLのVARCHAR(n)は文字(コードポイント)をカウントします:
-- PostgreSQL
CREATE TABLE t (name VARCHAR(5));
INSERT INTO t VALUES ('東京都渋谷'); -- 5 CJK文字: OK
INSERT INTO t VALUES ('東京都渋谷区'); -- 6 CJK文字: エラー
5つのCJK文字は15 UTF-8バイトですが、文字数が制限内であるためPostgreSQLは許可します。
MySQL
MySQLの動作はキャラクタセットに依存します:
utf8mb4の場合(推奨):
VARCHAR(n)は文字をカウントします。内部的にはutf8mb4の文字あたり最大4バイトを予約します。
行サイズの制限:
MySQLは最大行サイズが約65,535バイトです。utf8mb4では各VARCHAR文字が最大4バイトを使用するため、VARCHAR(255)は最悪の場合1020バイトを予約します。
TEXT型はバイトをカウント:
TINYTEXT: 255バイト
TEXT: 65,535バイト
MEDIUMTEXT: 16,777,215バイト
LONGTEXT: 4,294,967,295バイト
SQLite
SQLiteのVARCHAR(n)は基本的に無視されます — SQLiteはTEXTカラムに長さの強制はありません。
実用的なサイジングガイド
| コンテンツタイプ | 推奨サイズ | 理由 |
|---|---|---|
| メールアドレス | VARCHAR(320) | RFC 5321の最大値 |
| 人名 | VARCHAR(100) | ほとんどの文化に対応 |
| URL | VARCHAR(2048) | 実用的なブラウザ制限 |
| ツイートテキスト | VARCHAR(560) | 280文字 × CJKの2倍ウェイト |
| ファイルパス | VARCHAR(4096) | Linux PATH_MAX |
重要なポイント
- MySQLでは常にutf8mb4を使用する(utf8ではなく、3バイトのみ対応)
- 特定のカラムタイプに対してDBが文字数かバイト数のどちらをカウントするか確認する
- ストレージ推定時にマルチバイト文字を考慮する
- カラムサイズ設定前に文字数とバイト数の両方を文字列長さ計算ツールで確認する
ユースケース
国際的なアプリケーション用のデータベーススキーマを設計する際、使用しているデータベースでのVARCHAR制限の動作を理解することで、マルチバイト文字セット(UTF-8など)でのデータ切り詰め、挿入エラー、およびストレージの非効率性を防止できます。