発生事象
以下のSQL式で、テーブルの列を直接使って計算した結果が、実際の値を直接記述して計算した場合と異なっていた。
abs((machines.normal_game_count * 250.0 / (machines.difference_ball - machines.total_balls_won)))
↓実際の値を直接記述した場合
abs((621 * 250.0 / (1990 - 6570)))
原因
INTEGER
型として定義していた列に、カンマ(,
)を含む文字列(例: 1,990
)がTEXT
型として保存されていた。
SQLiteは計算時にTEXT
型をINTEGER
型へ暗黙的に変換しようとする。その際、数値として解釈できない文字(今回の場合はカンマ)以降は無視される。そのため、1,990
という文字列は1
として扱われ、意図しない計算結果となっていた。
これは、SQLiteがINTEGER
などで定義した列にもTEXT
型の値を許容してしまう仕様が原因。
参照