Maison  >  Article  >  base de données  >  Résoudre certains problèmes de conversion du type à virgule flottante en type de caractère dans MySQL

Résoudre certains problèmes de conversion du type à virgule flottante en type de caractère dans MySQL

黄舟
黄舟original
2017-09-14 11:55:131847parcourir

La conversion de type est une exigence que nous rencontrons souvent dans le développement quotidien. Récemment, nous avons rencontré un problème lors de la conversion du type à virgule flottante en type de caractère, je vais donc le partager en résumé. L'article suivant vous le présente principalement dans Friends. besoin peut se référer aux informations pertinentes sur les problèmes qui peuvent être rencontrés lors de la conversion de virgule flottante en caractère dans MySQL.

Avant-propos

Cet article vous présente principalement un problème rencontré lors de la conversion de virgule flottante en caractère dans MySQL Share Il est fourni pour référence de chacun. et étudier. Je n'en dirai pas beaucoup plus ci-dessous. Jetons un coup d'œil à l'introduction détaillée.

Une description du problème

Aujourd'hui j'ai rencontré un besoin de rafraîchir les données, qui est de modifier le poids du produit (type de champ est float), modifié Après le poids du produit, il doit être enregistré dans la table de journal (le type de champ est varchar) La structure de la table est la suivante :

Actualiser temporairement le. tableau de données :


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='临时刷重量表';

Tableau de journal :


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='重量修改日志';

Comme le montre le tableau construit ci-dessus, je dois Les champs actual_weight et new_actual_weight de la table temp_170830 sont respectivement vidés dans les champs old_value et new_value de la table log_weight. L'instruction SQL est la suivante :


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;
Je pensais avoir terminé ici, après tout, j'ai juste inséré quelques enregistrements de journal. Plus tard, pour une simple vérification, j'ai découvert que quelque chose n'allait pas avec les données, comme le montre la figure ci-dessous :


Capture d'écran des données de la table temporaire :

Capture d'écran des données de la table de journal :

La comparaison montre que les données d'enregistrement du journal insérées comportent de nombreux bits supplémentaires à la fin sans raison. Je ne sais pas d'où viennent les décimales. Ensuite, j'y ai pensé, peut-être. c'est parce que les données originales à virgule flottante ne peuvent pas être divisées. Lors de la conversion en varchar, les suivantes ont également été affichées. Ce n'est pas très bon pour le moment. Confirmé, je l'ajouterai plus tard après confirmation, puis je l'ai temporairement trouvé. une méthode pour convertir varchar en concat, et l'a ajusté comme suit :


INSERT INTO log_weight(goods_sn, which_col, old_value, new_value, update_user)
SELECT goods_sn,'actual_weight',concat(actual_weight,''),concat(new_actual_weight,''),create_user FROM temp_170830;
Résolution réussie du problème de journalisation.

Le résumé est le suivant :

1 Lorsque vous enregistrez les champs numériques de prix et de poids, essayez de ne pas utiliser de types à virgule flottante ! ! ! , il existe de nombreux pièges dans les nombres à virgule flottante (par exemple, les types à virgule flottante ne peuvent pas être jugés égaux !!!), il est préférable d'utiliser le type entier int. Lorsque les décimales doivent être affichées en entreprise, lisez-les et divisez par. le nombre de chiffres correspondant, tel que 99,98 yuans 9998, doit être stocké et une fois lu, il sera affiché comme 9998/100.


2 Lors de la conversion de float en varchar, vous devez d'abord convertir float en varchar à l'aide de la fonction concat, puis le stocker dans le champ varchar.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn