導入
データベースの運用において、カラムの定義型と「実際に格納されている値の型」が食い違っていることは珍しくありません。特にSQLiteのような動的型付けを採用しているDBでは、意図しない型でデータが混入すると、後続の集計処理やアプリケーション側での型変換エラーを引き起こす原因となります。本記事では、格納値のデータ型を正確に調査できる「typeof関数」の使い方を解説します。
基礎知識
SQLiteは「Manifest Typing」という仕組みを採用しており、カラム定義はあくまでヒントに過ぎず、値そのものが型情報を持っています。そのため、例えば整数型(INTEGER)で定義したカラムに文字列(TEXT)を挿入してもエラーにはならず、そのまま格納されます。
typeof関数は、指定した値やカラム内のデータが現在「SQLite内部でどの型として扱われているか」を判定し、以下のいずれかの文字列を返します。
・integer:整数
・real:浮動小数点数
・text:文字列
・blob:バイナリデータ
・null:NULL値
実装/解決策
データ調査の際は、SELECT文で対象カラムとtypeof(カラム名)を並べて出力するのが基本です。これにより、意図したデータ型で格納されているか、あるいは意図しない型変換が発生していないかを一目で確認できます。特に、外部システムからのインポートデータや、型指定が緩いテーブルを調査する際の診断ツールとして非常に強力です。
サンプルプログラム
以下のコードは、データ型の混在を確認するための検証スクリプトです。お手元のSQLite環境で実行して、出力結果を確認してみてください。
— テキスト型として検証用テーブルを作成
CREATE TABLE inventory (id INTEGER, item_code TEXT);
— あえて異なる型(数値、文字列、NULL)を混在させて挿入
INSERT INTO inventory VALUES (1, 1001); — 数値として挿入
INSERT INTO inventory VALUES (2, ‘1002’); — 文字列として挿入
INSERT INTO inventory VALUES (3, NULL); — NULL値
INSERT INTO inventory VALUES (4, x’0102′); — BLOBデータ
— typeof関数を使用して格納実態を調査
SELECT
item_code,
typeof(item_code) AS actual_type
FROM inventory;
— 解説: 実行結果により、item_codeカラムに数値やBLOBが混在していることが判明します。
— アプリケーション側でキャストエラーが出る場合は、この結果を元に更新処理を行います。
応用・注意点
現場での運用において、typeof関数の結果をWHERE句に含めることで、「特定の型だけを抽出する」というフィルタリングも可能です。例えば、数値型として扱われるべきカラムにTEXTが紛れ込んでいないかを確認するには「WHERE typeof(col) = ‘text’」と記述します。
注意点として、typeof関数はあくまで「格納されている値の型」を返します。カラム定義がINTEGERであっても、値が’123’(文字列)として格納されていれば結果はtextになります。型整合性を担保したい場合は、この関数で異常値を特定した後に、CAST関数などを用いてデータクレンジングを行う運用を推奨します。

コメント