2014-05-14 24 views
1

我正在尝试一个简单的转换 - 一个包含经度值(例如“-1.234”到-1.234)的mysql varchar列以增强优化。MySQL varchar编号

我已阅读并在此阅读并没有什么作品,上次尝试是:

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

会见了:

Error Code: 1366. Incorrect decimal value: '' for column '' at row -1 

目标列,创造了从错误中恢复是:

FLOAT(6,4) 

and null allowed. 

为什么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' 为十进制(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

与选中此格式:

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

现在不返回任何结果并且可以更好地进行优化,因为所有数值都是数值的,而对于经度的数据则完全不重要。

我还建议使用mysql命令窗口,因为大量查询与大量数据一起使用时,大多数应用会超时。

所以基本过程进展[随时查询每个查询之间。如我偷懒,不得不重新开始AS ONE查询是错误的):

-- 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

感谢大家的回复,它似乎doraose是在正确的轨道上,并导致检查是否有任何行存在一个空字符串 - 这似乎是失败时。 – Datadimension

0

我认为在MySQL中转换数字最简单的方法是使用静音转换。也就是说,在算术运算中使用该字符串,并忽略任何转换错误。没有数字的字符串被解释为0

UPDATE latlng_data 
    SET lng_copy = lng + 0.0; 

Here是一些相关的文档。

编辑:

如果您担心只匹配正确的值,然后检查字符串

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

谢谢,但在这种情况下,它会导致有一个缺失的有效经度值。这不幸的是会隐藏一个错误被检测到。 – Datadimension