2011-11-19 156 views
0

我知道这里有很多像这样的错误,但是这个查询看起来不同,因为它是插入查询。下面是表card_info模式:Mysql在INSERT查询中截断不正确的DOUBLE值

CREATE TABLE card_info (
card_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
card_name_orig varchar(150) NOT NULL, 
card_name_html varchar(150) NOT NULL, 
card_name_search varchar(150) NOT NULL, 
card_name_page varchar(150) NOT NULL, 
card_cost varchar(50) DEFAULT NULL, 
card_cost_converted tinyint(2) NOT NULL DEFAULT '0', 
card_subtype varchar(75) DEFAULT NULL, 
card_oracle_text_orig text, 
card_oracle_text_html text, 
card_power varchar(10) DEFAULT NULL, 
card_toughness varchar(10) DEFAULT NULL, 
card_loyalty tinyint(1) DEFAULT NULL, 
PRIMARY KEY (card_id), 
KEY card_name_nd (card_name_search), 
KEY card_name_page (card_name_page), 
KEY card_cost_converted (card_cost_converted), 
KEY card_power (card_power), 
KEY card_toughness (card_toughness), 
KEY card_loyalty (card_loyalty), 
FULLTEXT KEY card_oracle_text_orig (card_oracle_text_orig), 
FULLTEXT KEY card_name_search (card_name_search) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 

,这里是我的查询:

INSERT INTO card_info (
card_name_orig, card_name_html, card_name_search, card_name_page, card_cost, 
card_cost_converted, card_subtype, card_oracle_text_orig, card_oracle_text_html, 
card_power, card_toughness, card_loyalty 
) 
SELECT DISTINCT 
d.name_orig, d.name_html, d.name_search, d.name_page, d.cost, 
COALESCE(d.cost_converted, 0), d.type_sub, d.oracle_text_orig, 
d.oracle_text_html, d.`power`, d.toughness, d.loyalty 
FROM card_info_de d 
LEFT OUTER JOIN card_info i ON d.name_search = i.card_name_search 
WHERE i.card_id IS NULL 
AND d.edition_id = 'isd' 
ORDER BY (d.collector_number + 0), d.collector_number; 

如果我执行此查询,我得到这个错误:

1292 - 截断不正确DOUBLE值: '181A'

请注意,该值181A从列​​。 collector_number并且它是一个VARCHAR(5)字段,并且该字段没有被插入到card_info表无论如何,它只是被选择查询的顺序子句中使用。

如果我只从SELECT开始查询,我可以看到正确的结果被选中,但是当我插入时,它给了我上面的错误。请注意,如果我从SELECT查询中删除ORDER BY子句,它会插入正常。我不知道我做错了什么。

在此先感谢。

+0

你可以分享表card_info –

+0

我的模式更新吨他质疑该模式。感谢您的时间。 – voldomazta

回答

0

尝试

ORDER BY(d.collector_number + '0'),d.collector_number;

可怕的是,如果属实,但很有可能。

+0

由于collector_number的两个值是“181b”和“181a”,并且假设有第三个记录具有“180”,我希望它们以我的第一个排序只是数字升序的方式插入“(d.collector_number + 0)ASC“,接下来是排序字母”d.collector_number ASC“。我很抱歉,但我需要这样的订购。 – voldomazta

+0

我没有改变顺序。 180 +'0'是'1800',并且会在'180a'之前。我所做的只是告诉sql'0'是一个字符串而不是数字,看到order by子句是问题,并且您已经告诉它将0添加到一个字符串,并且您的字符串是180a,而不是一个数字.... –

+0

如果需要,您可以将ASC放回原处,但这是默认设置。看看你已经做了什么,我可以看到为什么你可能需要他们,我已经添加到卡表的收集器号码。 –

1

只是自己碰到同样的错误,这有点让人误解。我发现在另一个线程答案:

Error Code 1292 - Truncated incorrect DOUBLE value - Mysql

This message means you're trying to compare a number and a string in a WHERE or ON clause. Either make sure they have similar declarations, or use an explicit CAST to convert the number to a string.

If you turn off strict mode, the error should turn into a warning.

Barmar

所以基本上检查这些列被视为错误的数据类型:

d.name_search i.card_name_search d.edition_id d.collector_number

相关问题