序文 この記事は主に、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 をご愛顧いただきありがとうございます。 |
>>: Linuxはjoin -a1を使用して2つのファイルを結合します
序文この実験では、デバッグ用に2つの仮想マシン(CentOs6とRed Hat 6)を準備します。 ...
最近、社内文書の整理とファイルサーバーの構成を予定しています。以前はサーバー2003を使い慣れていま...
この記事では、参考までにMySQL 8.0.13のインストールグラフィックチュートリアルを紹介します...
目次1. 概要2. Django プロジェクト3. Vueプロジェクト1. 概要プロジェクトで、ダウ...
序文: Vue3.0はechartsの3次元縦棒グラフを実装します結果: 実装手順: 1. echa...
目次1. プロセスの基本的な概要2. プロセスの構成要素3. プロセス環境4. プロセスステータス5...
もう2020年です。飢えた人間は単純なテキストでは満足できなくなり、さまざまなスタイルの派手なテキス...
序文ほとんどの方がMySQLとインデックスを使用したことがあると思いますが、適切なインデックスを作成...
この記事では主に、MySQL 8.0 ドライバーと Alibaba Druid バージョン間の互換性...
序文この記事では主に、MySQL ストレージ テーブル エラー「java.sql.SQLExcept...
最近、新しいプロジェクトでは springcloud と docker が使用されています。この 2...
目次まず、値の一部と一致させるために使用される特殊文字であるワイルドカードについて簡単に紹介します。...
HTTP ステータス コードステータス コードは 3 桁の数字と理由フレーズ (最も一般的なもの: ...
面接官から「NodeJS で複数のプロセスを開始する方法を教えてください」と尋ねられることがあります...
昨日、円形のプログレスバー (Vue 円形プログレスバーを参照してください) についてブログを書きま...