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

推薦する

Linux ファイアウォール設定の詳細な手順 (yum ウェアハウス設定に基づく)

序文この実験では、デバッグ用に2つの仮想マシン(CentOs6とRed Hat 6)を準備します。 ...

Winows Server 2019 アクティベーション コードとボリューム ライセンス エディション KMS インストール キー GVLK

最近、社内文書の整理とファイルサーバーの構成を予定しています。以前はサーバー2003を使い慣れていま...

Windows での MySQL 8.0.13 解凍バージョンのインストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.13のインストールグラフィックチュートリアルを紹介します...

vue+django でファイルをダウンロードする例

目次1. 概要2. Django プロジェクト3. Vueプロジェクト1. 概要プロジェクトで、ダウ...

vue3.0+echarts は 3 次元の縦棒グラフを実現します

序文: Vue3.0はechartsの3次元縦棒グラフを実装します結果: 実装手順: 1. echa...

Linuxの運用と保守の基本プロセス管理と環境構成分析

目次1. プロセスの基本的な概要2. プロセスの構成要素3. プロセス環境4. プロセスステータス5...

Quill エディタでカスタム HTML レコードを挿入する詳細な例

もう2020年です。飢えた人間は単純なテキストでは満足できなくなり、さまざまなスタイルの派手なテキス...

MySQL インデックスの効率的な使用ガイド

序文ほとんどの方がMySQLとインデックスを使用したことがあると思いますが、適切なインデックスを作成...

MySQL 8.0ドライバとAlibaba Druidバージョン間の互換性の問題を解決

この記事では主に、MySQL 8.0 ドライバーと Alibaba Druid バージョン間の互換性...

docker と docker-compose による eureka の高可用性の実現の詳細な説明

最近、新しいプロジェクトでは springcloud と docker が使用されています。この 2...

mysql ワイルドカード (sql 高度なフィルタリング)

目次まず、値の一部と一致させるために使用される特殊文字であるワイルドカードについて簡単に紹介します。...

サーバーから返される14の一般的なHTTPステータスコードの詳細な説明

HTTP ステータス コードステータス コードは 3 桁の数字と理由フレーズ (最も一般的なもの: ...

Nodejs-cluster モジュールの知識ポイントの概要と使用例

面接官から「NodeJS で複数のプロセスを開始する方法を教えてください」と尋ねられることがあります...

Vueはechartsを使用して組織図を描画します

昨日、円形のプログレスバー (Vue 円形プログレスバーを参照してください) についてブログを書きま...