我正在尝试一个简单的转换 - 一个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。
答案 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);