2014-05-14 4 views
1

나는 단순 변환을 시도하고있다 - 최적화를 향상시키기 위해 경도 값 (예 : "-1.234"에서 -1.234)이 포함 된 mysql varchar 열.MySQL의 varchar를 숫자로

Error Code: 1366. Incorrect decimal value: '' for column '' at row -1 
오류를 복구하기 위해 만들어

대상 열이된다 :

FLOAT(6,4) 

and null allowed. 

UPDATE latlng_data SET lng_copy = CAST(lng AS DECIMAL(6,4)); 

가 만났다 :

나는 마지막 시도 읽고이를 읽고 아무것도 작동했다

왜 mysql 오류 메시지는 쓸모가 없습니다.

에 이어 'dognose'조언 (아래) 내가 사용하고 있습니다 :

UPDATE latlng_data SET lng='999.9999' where lng='';-- to give invalid lng in this case 

후 다음 (가 원본보다 실적이 이름을 목표로) 및 복사 데이터 필드를 증가 :

UPDATE latlng_data SET lng_copy = CAST(lng AS DECIMAL(7,4)); 

이 나타납니다 mysql cmd에서 Workbench 시간 초과로 필요하지만 다음을 사용 :

show full processlist; 

은 여전히 ​​실행 중임을 보여줍니다. 가장 좋은 모니터는 cmd입니다.

+1

'CAST를 ('- 1.234'AS 진수 (6,4))' lng_copy의 모든 값에 값이 있는지 확인하고 십진수 (6,4)로 변환 할 수 있습니다. 그 중 하나처럼 보이게됩니다. @JasonSec은 – JasonSec

+0

입니다. 참조 : http://dev.mysql.com/doc/refman/5.6/en/cast-functions.html 가능한 속담 : http://stackoverflow.com/questions/18705119/mysql-how-to-convert-varchar- 위도 - 경도 - 십진수 필드 –

+0

'UPDATE latlng_data SET lng_copy = lng * 1' * ...* – dognose

답변

0

과 함께이 검사 문자열의 형식을 확인 모든 데이터가 숫자이며, 잘못된 데이터는 경도에 대해 충분히 평가되므로 더 최적화 할 수 있습니다.

또한이 큰 데이터로 광범위한 쿼리를 사용할 때 대부분의 앱 시간 제한으로 mysql 명령 창을 사용하는 것이 좋습니다. 내가 게으른 GOT AND) 하나 개의 쿼리가 잘못 다시 AS 시작하는이 없었

그래서 기본적으로 프로세스는 항상 각 쿼리 사이를 점검 [갔다 :

-- convert all mostly read only tables to myisam: 
-- dropped old lat and lng after checking same data by 

SELECT count(*) FROM latlng_postcode where CAST(lat AS DECIMAL(7,4))!=latcopy; 
SELECT count(*) FROM latlng_postcode where CAST(lng AS DECIMAL(7,4))!=lngcopy; 

ALTER TABLE `latlng_postcode` 
CHANGE COLUMN `latcopy` `lat` FLOAT(7,4) NULL DEFAULT NULL, 
CHANGE COLUMN `lngcopy` `lng` FLOAT(7,4) NULL DEFAULT NULL; 

-- then index (are these the best settings ?? 
ALTER TABLE `latlng_postcode` 
DROP INDEX `pcode` , 
ADD INDEX `pcode` USING BTREE (`postcode`(5) ASC), 
ADD INDEX `lat` USING BTREE (`lat`(4) ASC), 
ADD INDEX `lng` USING BTREE (`lng`(4) ASC); 
+0

답장을 보내 주신 모든 분들께 감사 드리며, 그 dognose가 제대로 된 것 같아요. 빈 문자열이있는 행이 있는지 확인하는 것으로 이어집니다. – Datadimension

0

MySQL에서 숫자를 변환하는 가장 쉬운 방법은 자동 변환을 사용하는 것입니다. 즉, 산술 연산에서 문자열을 사용하면 모든 변환 오류가 무시됩니다. 어떤 숫자 문자열 0로 해석됩니다 :

UPDATE latlng_data 
    SET lng_copy = lng + 0.0; 

Here는 몇 가지 관련 문서입니다.

편집 : 지금 어떤 결과를 반환하지

SELECT * FROM t31data_happyenergy.latlng_data where lng_copy <> CAST(lng AS DECIMAL(7,4)); 

:

만 정확한 값을 일치 우려되는 경우

, 다음

WHERE lng rlike '[0-9]+[.]?[0-9]*' 
+0

고마워,하지만이 경우 하나가 누락되었습니다 유효한 경도 값이 발생합니다. 이 불행히도 오류가 발견되는 것을 숨길 수 있습니다. – Datadimension

관련 문제