1

最近、私にとって少し奇妙なバグがあります。FLOAT(8、3)の列を持つテーブルがあると考えてみましょう。また、Webブラウザからアクセスできる検証済みのテーブルエディタがあると考えてみましょう。テーブルエディタは、すべての列のクライアント側の検証をサポートし、単純なJavaScript正規表現を使用して列タイプで指定された範囲内にないfloatを配置することはできません。

var rx = new RegExp("^\\d{1," + (total - precision) + "}(\\.\\d{1," + precision + "})?$");

簡単に表す:

^\d{1,5}(\.\d{1,3})?$

FLOAT(8、3)の場合。ユーザーはそのセルに99999.999を簡単に入力でき、変更を保存すると、セルに100000を取得します。これは、テーブルの列の制約に対して無効な精度が失われた値です。バリデーターの正規表現を拡張して100000を渡そうとしましたが、この値をDBに保存できません。うわー... 「行Nの列'COLUMN'の範囲外の値」が原因で予想されましたが、MySQLコンソール(警告が表示されない)とSQLyog(警告が表示される)で許可されるとは思っていませんでした。次のUPDATEクエリ:

UPDATE TABLE SET COLUMN = 100000; /* No matter it's out of range for FLOAT(8, 3), it's trimmed but not via JDBC MySQL driver*/

明らかに、これはMySQLコネクタ固有の問題です。これはMySQLコネクタのバグですか(現在私は使用していますmysql-connector-java-5.1.12-bin.jar)?または、JDBCドライバーによって100000(理想的には最大値)をトリミングまたは調整できるようにする簡単な回避策はありますか?

前もって感謝します。

4

1 に答える 1

1

丸めることでやけどを負っているように聞こえます。

テーブルの列を 8,3 ではなく 9,3 または 10,3 にするとどうなりますか? 検証コードは変更しないでください。列の定義のみを変更してください。

小数点を想定した整数列を使用できますか? つまり、1 は 1000 として保存されます。3.221 は 3221 として保存されます。数値を表示する前に、1000 で割ることを知っておく必要があります。

ここでは、MySQL Float の問題について説明します。

于 2010-09-24T20:23:12.900 に答える