MySQL varchar到数字

时间:2014-05-14 20:16:49

标签: mysql sql varchar sql-types

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

我已阅读并阅读此内容并且没有任何效果,最后一次尝试是:

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

见到了:

  

错误代码:1366。十进制值不正确:''对于第-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

然后增加复制数据字段(目的是将其重命名为orig),然后:

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

这似乎在mysql cmd中需要Workbench超时但使用:

show full processlist;

仍然显示它正在运行 - 所以这里最好的显示器是cmd。

2 个答案:

答案 0 :(得分:0)

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

UPDATE latlng_data
    SET lng_copy = lng + 0.0;

Here是一些相关文档。

编辑:

如果您担心只匹配正确的值,请检查字符串的格式

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

答案 1 :(得分:0)

用以下方式检查:

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

现在没有返回任何结果,并且可以更好地进行优化,因为所有数据都是数字的,坏数据完全被估算为经度。

我还建议使用mysql命令窗口,因为当对这些大数据使用大量查询时,大多数应用程序会超时。

所以基本上这个过程已经过去了[总是检查每一个问题,因为我觉得懒惰而且不得不重新开始,因为一个错误的错误):

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