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 필드 에 저장 해 야 합 니 다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.