LoginSignup
8
10

More than 5 years have passed since last update.

VARCHAR(n) 型カラムにn文字を超える文字列を入れるとき自動切り詰め

Posted at

テーブル設計に文字列長を含める場合

最近私はRDBテーブルを設計するとき、VARCHARに文字列長を付けていません。
長さ無制限でもインデックスだって貼れるし物理ファイル構造はRDBエンジンがなんとかしてくれるし、長さ制限はどちらかというとアプリケーション要件だし、なによりも
アプリケーション側の処理系とSQLで文字列長を数える基準が一致困難 だからです。
サロゲートペア文字、異体字セレクタ、合字の正規化、… いろいろと深まる闇を感じますね。
そして、アプリケーション側では文字数に収まったと判定したのにRDB側では文字数オーバーとなった場合、書き込みで何が起きるか。自動切り詰めではありません。 実行エラーとなる のがSQLの仕様です。

文字列長オーバーで自動切り詰めさせる

しかし以上のような警告にもかかわらず、諸般の事情でどうしてもVARCHARに最大長を設定することを強いられて次のようなテーブルを作らざるを得なかった場合。

カラム オプション
id INTEGER PRIMARY KEY NOT NULL
name VARCHAR(10) NOT NULL

せめてINSERTやUPDATEが実行時にこけないよう、自動切り詰めをさせましょう。

INSERT INTO items (name) VALUES (?);

と書く代わりに

INSERT INTO items (name) VALUES (CAST(? AS VARCHAR(10)));

です。最大長つきVARCHARへのキャストは切り詰めでありエラーにはならないのです。

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10