テーブル設計に文字列長を含める場合
最近私は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へのキャストは切り詰めでありエラーにはならないのです。