106

我不确定这是什么错误!

#1292 - Truncated incorrect DOUBLE value: 

我没有双值字段或数据!

我浪费了整整一个小时试图弄清楚这一点!

这是我的查询

INSERT INTO call_managment_system.contact_numbers 
    (account_id, contact_number, contact_extension, main_number, created_by)
SELECT
    ac.account_id,
    REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') AS Phone,
    IFNULL(ta.ext, '') AS extention,
    '1' AS MainNumber,
    '2' AS created_by
FROM 
    cvsnumbers AS ta
    INNER JOIN accounts AS ac ON ac.company_code = ta.company_code
WHERE 
    LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') ) = 10

这是我为结果要进入的表创建表

CREATE TABLE `contact_numbers` (  
    `number_id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
    `account_id` int(10) unsigned NOT NULL DEFAULT '0',  
    `person_id` int(11) NOT NULL DEFAULT '0',  
    `contact_number` char(15) NOT NULL,  
    `contact_extension` char(10) NOT NULL DEFAULT '',  
    `contact_type` enum('Primary','Direct','Cell','Fax','Home','Reception','Office','TollFree') NOT NULL DEFAULT 'Primary',  
    `contact_link` enum('Account','PDM','Other') NOT NULL DEFAULT 'Account',  
    `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 = inactive, 1=active', 
    `main_number` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = main phone number',  
    `created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  
    `created_by` int(11) NOT NULL,  
    `modified_on` datetime DEFAULT NULL,  
    `modified_by` int(11) NOT NULL DEFAULT '0',  
    PRIMARY KEY (`number_id`),  
    KEY `account_id` (`account_id`),  
    KEY `person_id` (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=534 DEFAULT CHARSET=utf8
4

10 回答 10

189

此消息表示您正在尝试比较WHEREorON子句中的数字和字符串。在您的查询中,唯一可能发生这种情况的地方是ON ac.company_code = ta.company_code;要么确保它们具有相似的声明,要么使用显式CAST将数字转换为字符串。

如果关闭strict模式,错误应该会变成警告。

于 2013-04-17T20:16:39.327 回答
30

我更正了这个错误,因为查询中有语法错误或一些不需要的字符,但 MySQL 无法捕获它。我and在更新期间在多个字段之间使用,例如

update user 
set token='lamblala', 
    accessverion='dummy' and 
    key='somekey' 
where user = 'myself'

上述查询中的问题可以通过替换and为逗号( ,)来解决

于 2016-06-30T06:32:17.113 回答
11

我面临着同样的问题。尝试将 varchar(100) 列与数字 1 进行比较。导致 1292 错误。通过在 1 ('1') 周围添加单引号来修复。

谢谢楼上的解释

于 2015-01-14T09:48:24.993 回答
5

TL; 博士

这也可能是由应用于OR字符串列/文字引起的。

完整版本

INSERT对于涉及视图的简单语句,我收到了相同的错误消息:

insert into t1 select * from v1

尽管所有源列和目标列都是VARCHAR. 经过一番调试,我找到了根本原因;该视图包含此片段:

string_col1 OR '_' OR string_col2 OR '_' OR string_col3

这可能是 Oracle 自动转换以下代码段的结果:

string_col1 || '_' || string_col2 || '_' || string_col3

||是 Oracle 中的字符串连接)。解决方案是使用

concat(string_col1, '_', string_col2, '_', string_col3)

反而。

于 2018-01-22T14:11:12.017 回答
2

我见过几个发生此错误的情况:

1. 在包含多个值列表!=的子句中使用不等于运算符whereor

如:

where columnName !=('A'||'B')

这可以通过使用解决

where columnName not in ('A','B')

2. 函数中缺少比较运算符if()

select if(col1,col1,col2);

为了选择其中的值(col1如果存在),否则在col2...中显示该值,这会引发错误;可以使用以下方法解决:

select if(col1!='',col1,col2);
于 2019-10-01T19:06:29.530 回答
1

当我收到此错误时,我认为这是一个错误,但是您应该记住,如果您使用 SELECT 语句和相同的 WHERE 子句执行单独的查询,那么您可以从该 SELECTSELECT CONCAT(primary_id, ',')语句中获取主 ID 并插入将它们放入带有条件的失败 UPDATE 查询 -> "WHERE [primary_id] IN ([list of comma-separated primary ID's from the SELECT statement)" 这使您可以缓解由原始(失败)查询的 WHERE 子句引起的任何问题。

就我个人而言,当我对“WHERE ____ IN ([values here])”中的值使用引号时,300 个预期条目中只有 10 个受到影响,在我看来,这似乎是一个错误。

于 2016-04-04T16:42:06.680 回答
0

在我的情况下,这是一个视图(高度嵌套,视图中的视图)插入导致中的错误:

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

我们最终做的解决方法是模拟物化视图(实际上是一个表)并使用存储过程定期插入/更新它。

于 2019-02-04T15:24:48.803 回答
0

在尝试传递时遇到了 ES6 和 TypeORM 的问题,逗号分隔的数字字符串.where("order.id IN (:orders)", { orders })在哪里。orders当我转换为模板文字时,问题就解决了。

.where(`order.id IN (${orders})`);
于 2019-09-06T15:27:59.803 回答
0

如果您在表上使用了CHECK CONSTRAINT来获取字符串字段长度

例如:检查用户名长度 >= 8

利用:

CHECK (CHAR_LENGTH(username)>=8)

代替

CHECK (username>=8)

如果有错误的数据类型比较,则修复检查约束

于 2020-02-04T08:05:46.500 回答
0

如果您没有双值字段或数据,也许您应该尝试禁用 sql 严格模式。

为此,您必须编辑位于 MySQL 安装文件夹中的“ my.ini ”文件,找到“将 SQL 模式设置为严格”行并更改以下行:

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

为此,删除“STRICT_TRANS_TABLES”

# Set the SQL mode to strict
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

之后,您必须重新启动 MySQL 服务才能启用此更改。

要检查更改,请打开编辑器并执行以下 sql 语句:

SHOW VARIABLES LIKE 'sql_mode';

非常重要:请注意保存后的文件格式。将其保存为“UTF8”,不要保存为“TFT8 with BOM”,因为服务不会重新启动。

于 2020-06-25T19:31:47.857 回答