插入 MySQL 时 DECIMAL 值不正确

Incorrect DECIMAL value when inserting MySQL

我得到的错误是:

ERROR 1366 (HY000): Incorrect DECIMAL value: '0' for column '' at row -1

我正在尝试 normalize 数据库并确保数据类型正确。将 BASE_TABLE 中的数据插入到名为 Inventors.

的新 table 中

这是我用来插入的查询。如果我从 select 查询中 手动 获取一行,它可以正确插入 Inventors table.

然而,运行像这样的查询我立即得到上面的错误。

INSERT INTO
    Inventors(ID,Firstname,Middlename,Lastname,Country,Latitude,Longitude)
SELECT DISTINCT
    Inventor_ID as ID,
    Firstname,
    Middlename,
    Lastname,
    Country,
    cast(Latitude as decimal(11,6)) as Latitude,
    cast(Longitude as decimal(11,6)) as Longitude
FROM
    BASE_TABLE

这是在 select 查询中插入失败的行:

ID          Firstname   Middlename  Lastname    Country     Latitude    Longitude
04308666-3  RICHARD     RICHARD     JUNG                    0.000000    0.000000

Inventors 创建查询:

CREATE TABLE `Inventors` (
  `ID` varchar(55) NOT NULL DEFAULT '',
  `Firstname` varchar(255) DEFAULT NULL,
  `Middlename` varchar(255) DEFAULT NULL,
  `Lastname` varchar(255) DEFAULT NULL,
  `Country` varchar(255) DEFAULT NULL,
  `Latitude` decimal(11,8) DEFAULT NULL,
  `Longitude` decimal(11,8) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

BASE_TABLE 创建查询:

CREATE TABLE `BASE_TABLE` (
  `Firstname` varchar(255) DEFAULT NULL,
  `Middlename` varchar(255) DEFAULT NULL,
  `Lastname` varchar(255) DEFAULT NULL,
  `Country` varchar(255) DEFAULT NULL,
  `Zipcode` varchar(255) DEFAULT NULL,
  `Latitude` varchar(255) DEFAULT NULL,
  `Longitude` varchar(255) DEFAULT NULL,
  `InvSeq` int(11) DEFAULT NULL,
  `Patent` varchar(255) DEFAULT NULL,
  `AppYear` year(4) DEFAULT NULL,
  `ApplyYear` year(4) DEFAULT NULL,
  `PubYear` year(4) NOT NULL,
  `AppDate` varchar(255) DEFAULT NULL,
  `Assignee` varchar(255) DEFAULT NULL,
  `AsgNum` varchar(255) DEFAULT NULL,
  `Class` varchar(255) DEFAULT NULL,
  `Coauthor` varchar(255) DEFAULT NULL,
  `Invnum` varchar(255) DEFAULT NULL,
  `Invnum_N` varchar(255) DEFAULT NULL,
  `Record_ID` varchar(255) NOT NULL,
  `Inventor_ID` varchar(255) DEFAULT NULL,
  `Match_Level` tinyint(4) DEFAULT NULL,
  `Company_ID` varchar(255) DEFAULT NULL,
  `Classification` varchar(255) DEFAULT NULL,
  `Citing` mediumint(9) DEFAULT NULL,
  `Cited` mediumint(9) DEFAULT NULL,
  PRIMARY KEY (`Record_ID`),
  KEY `Inventor_ID` (`Inventor_ID`),
  KEY `Patent` (`Patent`),
  KEY `Patent_2` (`Patent`,`Inventor_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

谁能帮我解决这个问题?

我发现了问题。 BASE_TABLE 中的 Latitude (VARCHAR)Longitude (VARCHAR) 的值为空字符串 ''。由于某种原因,这导致 MySQL 转换为不正确的值。

我通过在 select 查询中用 NULL 替换空字符串解决了这个问题(见下文)。

INSERT INTO
    Inventors
SELECT DISTINCT
    Inventor_ID as ID,
    Firstname,
    Middlename,
    Lastname,
    Country,
    IF(Latitude='',NULL,CAST(Latitude as decimal(11,6))) as Latitude,
    IF(Longitude='',NULL,CAST(Longitude as decimal(11,6))) as Longitude
FROM
    BASE_TABLE

我本来可以将此添加为评论,但没有所需的代表,因此我深表歉意。

我 运行 遇到了与 Philip 完全相同的问题和行为。

为了回答 philipxy(现年 1.75 岁)的问题,Philip 的意思是:

  1. 当 SELECT 语句 自己执行 时,它没有任何错误地工作 - CAST 成功 空字符串 ('') 变成 0.000000 并反映在查询结果集中。
  2. 当 SELECT 语句作为包含 INSERT INTO 语句 的一部分执行时 ,CAST 无法 转换那个确切的将相同的空字符串转换为十进制值并发生错误 1366。

这是他正确的称呼 "ambiguous" 因为 CAST 在这两个不同的用例中的工作方式不同,这充其量是令人困惑的。错误消息不包含列名并且该行列为 -1 也很奇怪。

我认为这里可能有一个错误需要解决,因为无论在何种情况下,CAST 都应该以相同的方式工作。

幸运的是,菲利普自己的答案也对我有用,非常感谢,菲利普!