插入 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 的意思是:
- 当 SELECT 语句 自己执行 时,它没有任何错误地工作 - CAST 成功 空字符串 ('') 变成 0.000000 并反映在查询结果集中。
- 当 SELECT 语句作为包含 INSERT INTO 语句 的一部分执行时 ,CAST 无法 转换那个确切的将相同的空字符串转换为十进制值并发生错误 1366。
这是他正确的称呼 "ambiguous" 因为 CAST 在这两个不同的用例中的工作方式不同,这充其量是令人困惑的。错误消息不包含列名并且该行列为 -1 也很奇怪。
我认为这里可能有一个错误需要解决,因为无论在何种情况下,CAST 都应该以相同的方式工作。
幸运的是,菲利普自己的答案也对我有用,非常感谢,菲利普!
我得到的错误是:
ERROR 1366 (HY000): Incorrect DECIMAL value: '0' for column '' at row -1
我正在尝试 normalize
数据库并确保数据类型正确。将 BASE_TABLE
中的数据插入到名为 Inventors
.
这是我用来插入的查询。如果我从 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 的意思是:
- 当 SELECT 语句 自己执行 时,它没有任何错误地工作 - CAST 成功 空字符串 ('') 变成 0.000000 并反映在查询结果集中。
- 当 SELECT 语句作为包含 INSERT INTO 语句 的一部分执行时 ,CAST 无法 转换那个确切的将相同的空字符串转换为十进制值并发生错误 1366。
这是他正确的称呼 "ambiguous" 因为 CAST 在这两个不同的用例中的工作方式不同,这充其量是令人困惑的。错误消息不包含列名并且该行列为 -1 也很奇怪。
我认为这里可能有一个错误需要解决,因为无论在何种情况下,CAST 都应该以相同的方式工作。
幸运的是,菲利普自己的答案也对我有用,非常感谢,菲利普!