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 初心者のための二分探索木アルゴリズムのチュートリアル

目次バイナリ検索木 (BST) とは何ですか?バイナリツリーの基本的な走査(インオーダー、ポストオー...

MongoDB データベースの状態を監視する Zabbix3.4 メソッド

Mongodb には db.serverStatus() コマンドがあり、これを使用して Mongo...

LinuxでIPアドレスが表示されない問題の解決方法

目次序文解決:ステップ1ステップ2序文環境: VMware Workstation 上に Linux...

W3C組織はHTML4のスタイルに関する推奨事項を提供しています

これは、W3C 組織が HTML4 に対して提示したスタイル推奨事項です。残念ながら、ブラウザが独自...

ウェブページでグレーまたはブラックモードを実現するための CSS3 フィルターコード

フロントエンドcss3 フィルターは、Web ページのグレー効果を実現できるだけでなく、ナイト モー...

Nginx リバース プロキシから go-fastdfs へのケースの説明

背景go-fastdfs は、http プロトコルをサポートする分散ファイルシステムです。一般的なプ...

MySQLプリコンパイル機能の詳細な説明

この記事では、MySQLのプリコンパイル機能について紹介します。具体的な内容は以下のとおりです。 1...

wgetはウェブサイト全体(サブディレクトリ全体)または特定のディレクトリをダウンロードします

wgetコマンドを使用して、親ディレクトリの下のサブディレクトリ全体をダウンロードします。親ディレク...

CSS でハートを描く 3 つの方法

以下では、CSS を使用してハートの形を描く 3 つの方法を紹介します。実装プロセスは非常にシンプル...

MySQL 8.0.26 のインストールとアンインストールの完全なステップバイステップの記録

目次序文1. インストール1.公式サイトからダウンロード2. 構成を作成する3. MySQLを初期化...

Ubuntu サーバーで MySQL を設定し、リモート接続を実装する方法

サーバー: Ubuntu Server 16.04 LSSクライアント: Ubuntu 16.04 ...

WeChatミニプログラムページとコンポーネント間の情報伝達と機能呼び出し

今回は、私自身の開発経験を踏まえて、以下の観点で関連内容を解説します。ページからコンポーネントにデー...

Centos7 構成 fastdfs および nginx 分散ファイル ストレージ システムの実装プロセス分析

1. libfastcommon-1.0.43 をインストールします。インストール パッケージは h...

MySQLはイベントを使用してスケジュールされたタスクを完了します

イベントでは、SQL コードを 1 回または一定の間隔で実行することを指定できます。通常、複雑な S...

CSS で 2 つの固定列と 1 つの適応列を実装するいくつかの方法

この記事では、CSS で 2 つの固定列と 1 つのアダプティブ列を実装するいくつかの方法を紹介し、...