テーブル設計において文字列データのサイズ設定は皆様等しくお悩みでしょうか。
容量ほぼ無制限のTEXTとか使ってしまえばいいんですが、データ量見積もりの都合上上限を設けておいた方が都合が良いこともあり、あまり根拠もなくVARCHAR(64)などとキリの良さ目の数字で文字数制限をかけていることもあるかと思います。
そんなカラムへの値の挿入・代入で忘れがちなこと。
文字数オーバーの文字列の挿入・代入はエラーになります。 切り詰められるだけと思っていた方多いのではないでしょうか。エラーになるのがSQL標準です。
それをアプリケーション側で防止しようとしたときに忘れがちなこと。
文字数の数え方はDB製品とアプリ言語で結構違います。 代表的なのがサロゲートペアを1文字に数えるか2文字に数えるか。まあルールの数は有限なのでがっちり完全な文字数制限処理を書くことも可能なのですが、そうするとDB知識にアプリがべったりですね。結局、設計としてアウトかと思われます。
キャストなら切り詰められる
文字数オーバーでINSERT/UPDATEはエラーになるのですが、TEXTからVARCHAR(n)へのキャストならエラーにならず切り詰めになります。
そこでINSERTならこう書けば安全になります。
INSERT INTO my_table (value) VALUES(CAST(? AS VARCHAR(64)));
無論ですが、挿入した値と取り出した値が切り詰めによって変化している可能性は考慮の上でプログラミングしなければなりません。