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つのファイルを結合します

推薦する

このリファレンスとJavaScriptのカスタムプロパティの詳細な説明

目次1. このキーワード2. カスタム属性3. 包括的なケース1:タブの実装付録要約する1. このキ...

史上最もシンプルな MySQL データのバックアップと復元のチュートリアル (パート 1) (パート 35)

データのバックアップと復元に関する最初の記事を皆さんに共有します。具体的な内容は次のとおりです。基本...

Vue を通じて QR コードスキャン機能を実装する

ヒントこのプラグインは https プロトコルでのみアクセスできます。http プロトコルはうまく機...

「いいね!」機能では MySQL と Redis のどちらを使用すればよいでしょうか?

目次1. 初心者が陥りがちな間違い2. Iteratorのremove()メソッドを使用する3. f...

非常に詳細な Vue-Router のステップバイステップのチュートリアル

目次1. ルータビュー2. ルータリンク3. リダイレクト4. ルーティングエイリアス5. ルーティ...

HTMLでは、全体的なスタイルとレイアウトを崩さずに、部分的に強制スクロールバーを使用できます。

まずはエフェクト画像を投稿します:全体的なスタイルとレイアウトが崩れないように、スクロール バーがロ...

k8sとDockerの関係についての簡単な説明

最近、プロジェクトでは kubernetes (以下、k8s と表記、k と s の間には 8 つの...

Dockerコンテナ同士を接続する3つの方法の詳しい説明

Docker コンテナ間の相互接続と通信には 3 つの方法があります。 Docker 内部ネットワー...

VMware 仮想マシンの NAT モードを構成する方法

この記事では、VMware仮想マシンのNAT構成プロセスを詳しく説明します。具体的な内容は次のとおり...

Linuxはバイナリモードを使用してmysqlをインストールします

この記事では、LinuxにバイナリモードでMySQLをインストールする具体的な手順を参考までに紹介し...

nginxの基礎を学ぶ

目次1. nginx とは何ですか? 2. nginx で何ができるのか? 2.1 フォワードプロキ...

Windows での MySQL 5.7.18 インストール チュートリアル

この記事では、圧縮パッケージから MySQL をインストールする方法について説明します。 1. My...

Vueフロントエンドの効率的な開発のためのレンダリング手順をリストします

v-for ディレクティブリストといえば、ループについても触れなければなりません。v-for 命令は...

Ubuntuサーバーの一般的なコマンドの概要

以下のコマンドのほとんどは、コンソール/ターミナル/シェルで入力する必要があります。 'su...

Linux ファイルとユーザー管理の実践

1. /etc ディレクトリ内の、文字以外の文字で始まり、その後に文字と任意の長さのその他の文字が続...