MySQL で浮動小数点データを文字データに変換するときに起こりうる問題の詳細な説明

MySQL で浮動小数点データを文字データに変換するときに起こりうる問題の詳細な説明

序文

この記事は主に、MySQL で浮動小数点型を文字型に変換するときに発生する問題を紹介します。これは、皆さんの参考と学習のために共有されています。さっそく、詳細な紹介を見てみましょう。

1. 問題の説明

今日、データ更新の要件に遭遇しました。それは、製品の重量を変更することです (フィールド タイプは float)。製品の重量が変更された後、ログ テーブルに記録する必要があります (フィールド タイプは varchar)。テーブル構造は次のとおりです。

一時更新データテーブル:

テーブル `temp_170830` を作成します (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主キーID',
 `goods_sn` varchar(255) NOT NULL DEFAULT '' COMMENT '製品コード',
 `goods_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '製品重量',
 `actual_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '実際の重量',
 `new_actual_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '新しい実際の重量',
 `create_user` varchar(30) NOT NULL DEFAULT '' COMMENT '作成者',
 主キー (`id`)、
 キー `idx_goods_sn` (`goods_sn`)
) ENGINE=InnoDB AUTO_INCREMENT=8192 DEFAULT CHARSET=utf8 COMMENT='一時更新重みテーブル';

ログテーブル:

テーブル `log_weight` を作成します (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主キーID',
 `goods_sn` varchar(50) NOT NULL DEFAULT '' COMMENT '製品コード',
 `which_col` varchar(100) NOT NULL DEFAULT '' COMMENT 'フィールドの変更',
 `old_value` varchar(50) NOT NULL DEFAULT '0.00' COMMENT '更新前の値',
 `new_value` varchar(50) NOT NULL DEFAULT '0.00' COMMENT '更新された値',
 `update_user` varchar(100) NOT NULL DEFAULT '' COMMENT '作成者',
 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、
 `wh_update_time` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'レコード変更時刻',
 主キー (`id`)、
 キー `idx_goods_sn` (`goods_sn`)、
 キー `idx_update_user` (`update_user`)、
 キー `wh_update_time` (`wh_update_time`)
) ENGINE=InnoDB AUTO_INCREMENT=14601620 DEFAULT CHARSET=utf8 COMMENT='重み変更ログ';

上記で作成したテーブルに示されているように、temp_170830 テーブルのactual_weight フィールドと new_actual_weight フィールドをそれぞれ log_weight テーブルの old_value フィールドと new_value フィールドにフラッシュする必要があります。SQL ステートメントは次のとおりです。

log_weight(goods_sn、which_col、old_value、new_value、update_user) に INSERT します。
temp_170830 から goods_sn、'actual_weight'、actual_weight、new_actual_weight、create_user を選択します。

結局、ログ レコードをいくつか挿入しただけなので、ここで終了だと思いました。後で簡単なチェックをしたところ、次の図に示すように、データが少し間違っていることがわかりました。

一時テーブルデータのスクリーンショット:

ログ テーブル データのスクリーンショット:

比較すると、挿入されたログレコードデータは、理由もなく末尾の小数点以下の桁数が多くなっていることがわかります。これがどこから来るのかはわかりません。後で、浮動小数点データが割り切れないからかもしれないと思いました。varcharに変換すると、末尾の小数点以下の桁数も出てきます。今のところはわかりません。確認したらさらに追加します。その後、varcharに変換して連結する方法を見つけ、次のように調整しました。

log_weight(goods_sn、which_col、old_value、new_value、update_user) に INSERT します。
SELECT goods_sn、'actual_weight'、concat(actual_weight、'')、concat(new_actual_weight、'')、create_user FROM temp_170830;

ログ記録の問題を正常に解決しました。

要約すると:

1 価格と重量の数値フィールドを記録するときは、浮動小数点型を使用しないようにしてください。 ! !浮動小数点数には多くの落とし穴があります(たとえば、浮動小数点型は等しいと判断できません!!!)ので、int整数型を使用することをお勧めします。ビジネスで小数点を表示する必要がある場合は、それを読み取って対応する桁数で割ります。たとえば、99.98元は9998として保存し、読み取るときに9998/100を使用して表示します。

2 float を varchar に変換する場合は、まず concat 関数を使用して float を varchar に変換し、次に varchar フィールドに格納する必要があります。

さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただきありがとうございます。

<<:  Vue3のサンドボックスの仕組みの詳しい説明

>>:  Linuxはjoin -a1を使用して2つのファイルを結合します

推薦する

MySQL 5.7.27 のダウンロード、インストール、設定に関する詳細なチュートリアル

目次1. ダウンロード手順2. 環境変数を設定する3. my.iniファイルを設定する4. MySQ...

IDEA に基づいて Tomcat サーバーを展開するための詳細な手順

目次導入ステップ1ステップ2: アイデアで動的Webプロジェクトを作成するステップ3: Tomcat...

JavaScript バブルソートの例

目次1. バブルソートとは何か2. 例を挙げるラウンド1:第2ラウンド:第3ラウンド:第4ラウンド:...

Element UI を使用してページにページング ナビゲーション バーを追加する方法

必要ページング バーを追加します。これにより、ページにジャンプしたり、ページ番号に従って特定のページ...

MyBatisインターセプターのページング機能を実装する方法

MyBatisインターセプターのページング機能を実装する方法序文:まず、実装原則についてお話しします...

nginx と keepalived を組み合わせて高可用性を実現するための手順を完了する

序文システムの高可用性を満たすためには、通常、クラスターを構築する必要があります。ホストがクラッシュ...

CSS3 のフレックスレイアウト幅の無効性の解決策

2 列レイアウトはプロジェクトでよく使用されます。この効果を実現する方法はたくさんあります。 しかし...

MySQL GRANT ユーザー認証の実装

承認とは、ユーザーに特定の権限を付与することです。たとえば、新しく作成したユーザーに、すべてのデータ...

Vueは物流タイムライン効果を実現します

この記事では、物流タイムライン効果を実現するためのVueの具体的なコードを例として紹介します。具体的...

Intelli Idea で Tomcat 設定が見つからない問題の解決方法

2日前に新しい会社に入社しました。その会社ではIntelli Ideaを使っています。Eclipse...

IIS7 IIS8 http は自動的に HTTPS にジャンプします (ポート 80 はポート 443 にジャンプします)

IIS7 では、「URL REWRITE2」疑似静的モジュールがインストールされているかどうかを確...

Nginx の負荷分散アルゴリズムとフェイルオーバー分析

概要Nginx ロード バランシングは、アップストリーム サーバー (実際のビジネス ロジックによっ...

Vue カプセル化 TabBar コンポーネントの完全なステップ記録

目次実装のアイデア:ステップ 1: TabBar と TabBarItem のコンポーネント カプセ...

Linux resolv.conf の簡単な分析

1. はじめにresolv.conf は、さまざまなオペレーティング システムのドメイン ネーム シ...

ウェブページの読み込み進捗状況バーの詳細な説明(推奨)

(Web ページの読み込み中に、コンテンツが多すぎて読み込みと待機が続くことがあります。このとき、...