MySQL 에서 부동 소수점 문자 형 이 발생 할 수 있 는 문제 에 대한 상세 한 설명

머리말
본 고 는 주로 MySQL 에서 부동 소수점 형 문자 형 을 바 꿀 때 발생 하 는 문 제 를 소개 하고 참고 학습 을 제공 합 니 다.다음은 더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 해 보 겠 습 니 다.
문제 설명
오늘 브러시 데이터 에 대한 수 요 는 제품 의 무게(필드 유형 은 float)를 수정 하 는 것 입 니 다.제품 의 무 게 를 수정 한 후에 로그 시트 에 기록 해 야 하 는(필드 유형 은 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='      ';
위 에 세 워 진 표 와 같이 temp170830 표 의 actualweight 와 newactual_weight 필드 각각 logweight 시계의 oldvalue 와 newvalue 필드,SQL 문 구 는 다음 과 같 습 니 다.

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;
여기까지 큰 성 과 를 거 두 었 다 고 생각 했 는데 로그 기록 을 삽입 한 것 뿐 이 었 습 니 다.나중에 간단하게 확인 하기 위해 데이터 가 이상 하 다 는 것 을 알 게 되 었 습 니 다.다음 그림 과 같 습 니 다.
임시 테이블 데이터 캡 처:

로그 테이블 데이터 캡 처:

비 교 를 통 해 알 수 있 듯 이 삽 입 된 로그 기록 데 이 터 는 이유 없 이 뒤에 많은 비트 의 소수 가 많아 졌 습 니 다.어디서 나 왔 는 지 모 르 겠 습 니 다.나중에 생각해 보 니 원래 부동 소수점 형 데 이 터 는 다 제거 할 수 없 는 것 일 수도 있 습 니 다.varchar 로 바 뀌 었 을 때 뒤의 것 도 가 져 왔 습 니 다.아직 확실 하지 않 습 니 다.나중에 확인 한 후에 보충 하 겠 습 니 다.그리고 임시로 varchar 를 돌 리 는 방법 을 찾 았 습 니 다.concat 는 다음 과 같이 조정 합 니 다.

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;
로그 기록 문 제 를 순조롭게 해결 하 다.
총 결 은 다음 과 같다.
1.가격 과 중량 의 숫자 필드 를 기록 할 때 부동 소수점 형 을 사용 하지 마 세 요!!!부동 소수점 구덩이 가 많다.가장 좋 은 것 은 int 정형 을 사용 하 는 것 입 니 다.업무 상 소 수 를 표시 할 때 읽 은 다음 에 해당 하 는 자릿수 로 나 누 는 것 입 니 다.예 를 들 어 99.98 원 은 9998 을 저장 하고 읽 을 때 9998/100 으로 표시 해 야 합 니 다.
2.float 에서 varchar 를 돌 릴 때 먼저 float 를 concat 함수 로 먼저 varchar 로 바 꾼 다음 에 varchar 필드 에 저장 해 야 합 니 다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기