ホームページ > データベース > mysql チュートリアル > 浮動小数点値を定数と比較すると、MySQL SELECT ステートメントが行を返さないのはなぜですか?

浮動小数点値を定数と比較すると、MySQL SELECT ステートメントが行を返さないのはなぜですか?

DDD
リリース: 2024-10-29 10:51:02
オリジナル
505 人が閲覧しました

Why Does My MySQL SELECT Statement Return No Rows When Comparing a Float Value to a Constant?

MySQL 選択における浮動小数点の不一致の解決

浮動小数点値を定数と比較する WHERE 句を含む SELECT ステートメントを実行する場合、ユーザーは予期しない結果に遭遇する可能性があります。たとえば、次のクエリは行を返しません:

<code class="sql">SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31';</code>
ログイン後にコピー

ただし、価格比較条件を削除すると正しい行が得られます:

<code class="sql">SELECT * FROM `table`;</code>
ログイン後にコピー

この矛盾は、MySQL の処理方法に起因すると考えられます。浮動小数点精度。データベースから取得した値は「101.31」と表示されますが、浮動小数点演算の不正確さにより、WHERE 句で使用される実際の定数とは若干異なる場合があります。

解決策: DECIMAL へのキャスト

この問題を解決するには、WHERE 句で価格列を DECIMAL 型にキャストできます。

<code class="sql">SELECT * FROM `table` WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL);</code>
ログイン後にコピー

これにより、データベース値と定数の両方が DECIMAL として表現されるようになります。潜在的な精度の問題を排除します。

代替解決策: 列の型を変更する

代わりに、価格列のデータ型を DECIMAL に直接変更することを検討してください。 DECIMAL を使用すると、通貨値を操作する際の精度とスケールが向上し、SELECT クエリでのキャストの必要がなくなります。

以上が浮動小数点値を定数と比較すると、MySQL SELECT ステートメントが行を返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート