我不确定这个错误是什么!
#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
这是表格的show create table,结果将进入
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
答案 0 :(得分:95)
此消息表示您正在尝试比较WHERE
或ON
子句中的数字和字符串。在您的查询中,唯一可能发生的地方是ON ac.company_code = ta.company_code
;要么确保它们有类似的声明,要么使用显式CAST
将数字转换为字符串。
如果您关闭strict
模式,错误应该会变成警告。
答案 1 :(得分:5)
我遇到了同样的问题。尝试将varchar(100)列与数字1进行比较。导致1292错误。通过在1(' 1')附近添加单引号来修复。
感谢上面的解释
答案 2 :(得分:4)
我更正了此错误,因为查询中存在语法错误或某些不需要的字符,但MySQL无法捕获它。我在更新期间在多个字段之间使用and
,例如
update user
set token='lamblala',
accessverion='dummy' and
key='somekey'
where user = 'myself'
上述查询中的问题可以通过用逗号(and
)替换,
来解决
答案 3 :(得分:2)
<强> TL; DR 强>
这也可能是因为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)
代替。
答案 4 :(得分:1)
When I received this error I believe it was a bug, however you should keep in mind that if you do a separate query with a SELECT statement and the same WHERE clause, then you can grab the primary ID's from that SELECT: SELECT CONCAT(primary_id, ',')
) statement and insert them into the failed UPDATE query with conditions -> "WHERE [primary_id] IN ([list of comma-separated primary ID's from the SELECT statement)" which allows you to alleviate any issues being caused by the original (failed) query's WHERE clause.
For me, personally, when I was using quotes for the values in the "WHERE ____ IN ([values here])", only 10 of the 300 expected entries were being affected which, in my opinion, seems like a bug.
答案 5 :(得分:0)
在我的情况下,这是一个视图(高度嵌套,视图内)插入导致mysql-5.6中的错误:
CREATE TABLE tablename AS
SELECT * FROM highly_nested_viewname
;
我们最终要做的解决方法是模拟实例化视图(实际上是一个表),并使用存储过程定期插入/更新它。
答案 6 :(得分:0)
在尝试传递.where("order.id IN (:orders)", { orders })
时,ES6和TypeORM出现了此问题,其中orders
是逗号分隔的数字字符串。当我转换为模板文字时,问题已解决。
.where(`order.id IN (${orders})`);
答案 7 :(得分:0)
此错误可能是由于在!=
子句中使用不等于运算符where
导致的,该子句包含多个or
值的列表,例如
where columnName !=('A'||'B')
这可以通过使用
解决。where columnName not in ('A','B')
答案 8 :(得分:0)
如果您已在表上使用 CHECK CONSTRAINT 检查字符串字段的长度
例如:检查用户名长度> = 8
使用:
CHECK (CHAR_LENGTH(username)>=8)
代替
CHECK (username>=8)
如果数据类型比较错误,则修复检查约束
答案 9 :(得分: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”,而不要另存为“带有BOM的TFT8”,因为该服务将不会重新启动。