【问题标题】:MySQL varchar to numberMySQL varchar 到数字
【发布时间】:2014-07-03 01:53:09
【问题描述】:

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

我已经阅读并阅读了此内容,但没有任何效果,最后尝试的是:

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

会见:

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

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

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

这在 mysql cmd 中似乎是必需的,因为 Workbench 超时但使用:

show full processlist;

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

【问题讨论】:

  • CAST('-1.234' AS Decimal(6,4)) 在我这边工作得很好确保 lng_copy 中的所有值都有值并且可以干净地转换为 Decimal(6,4) 看起来其中一个是 ''
  • UPDATE latlng_data SET lng_copy = lng * 1 ...隐藏
  • 如果它无法转换,是否有添加后备 - 这是一个数百万行的数据库,所以如果我可以忽略和资源什么是坏数据,至少我可以在等待时继续开发。
  • 感谢 dognose,这样做的结果值是多少

标签: mysql sql varchar sql-types


【解决方案1】:

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

UPDATE latlng_data
    SET lng_copy = lng + 0.0;

Here 是一些相关文档。

编辑:

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

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

【讨论】:

  • 谢谢,但在这种情况下,它会产生一个有效的经度值,其中缺少一个。不幸的是,这会隐藏错误而不会被检测到。
【解决方案2】:

检查过:

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

【讨论】:

  • 感谢大家的回复,它似乎是在正确的轨道上,并导致检查是否存在任何具有空字符串的行 - 这似乎是它失败的时候。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
相关资源
最近更新 更多