型変換は日常の開発でよく遭遇する要件です。最近、浮動小数点型を文字型に変換するときに問題が発生したので、次の記事で主に MySQL について紹介します。浮動小数点型を文字に変換するときに発生する可能性がある問題については、関連情報を参照してください。
はじめに
この記事は主に、MySQL で浮動小数点型を文字型に変換するときに発生する問題を紹介します。以下では多くを述べませんが、参考として共有します。詳しい紹介をご覧ください。
1 問題の説明
今日、製品の重量を変更するというデータを更新する必要がありました (フィールドタイプは浮動小数点です)。製品の重量を変更した後、それを記録する必要があります。ログ テーブル (フィールド タイプは varchar)、テーブル構造は次のとおりです:
一時ブラシ データ テーブル:
CREATE TABLE `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 '创建人', PRIMARY KEY (`id`), KEY `idx_goods_sn` (`goods_sn`) ) ENGINE=InnoDB AUTO_INCREMENT=8192 DEFAULT CHARSET=utf8 COMMENT='临时刷重量表';
ログ テーブル:
CREATE TABLE `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` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录修改时间', PRIMARY KEY (`id`), KEY `idx_goods_sn` (`goods_sn`), KEY `idx_update_user` (`update_user`), KEY `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 ステートメントは次のとおりです。すべて、ログ レコードをいくつか挿入しました。後で、簡単な検証のために、以下の図に示すように、データが少し間違っていることがわかりました。
ログ テーブル データのスクリーンショット:
比較すると、挿入されたログ レコード データの末尾に理由もなく多くの余分なビットがあることがわかります。小数点がどこから来たのかわかりません。その後、考えてみました。元の浮動小数点データをvarcharに変換すると以下のようなものも出てきましたので、確認してから追記します。 varchar を concat に変換する方法を見つけて、次のように調整しました:
INSERT INTO log_weight(goods_sn, which_col, old_value, new_value, update_user) SELECT goods_sn,'actual_weight',actual_weight,new_actual_weight,create_user FROM temp_170830;
ロギングの問題は正常に解決されました。
1 価格と重量の数値フィールドを記録するときは、浮動小数点型を使用しないようにしてください。 ! ! 、浮動小数点数には多くの落とし穴があります (たとえば、浮動小数点型は等しいと判断できない!!!)。ビジネスで小数を表示する必要がある場合は、整数型を使用して読み取って除算するのが最善です。 99.98 元などの対応する桁数が格納されており、読み出すと 9998/100 と表示されます。
2 float を varchar に変換するときは、まず concat 関数を使用して float を varchar に変換してから、それを varchar フィールドに格納する必要があります。
以上がMySQL で浮動小数点型を文字型に変換する際のいくつかの問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。