【问题标题】:Mysql Truncated incorrect DOUBLE value in INSERT queryMysql 在 INSERT 查询中截断了不正确的 DOUBLE 值
【发布时间】:2011-11-19 14:08:14
【问题描述】:

我知道这里有很多这样的错误,但这个查询似乎有所不同,因为它是一个插入查询。这是表 card_info 的架构:

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 来自 card_info_de.collector_number 列,它是一个 VARCHAR(5) 字段,并且该字段并没有被插入到 card_info 表中,它只是在 select 查询的 order 子句中使用。

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

提前致谢。

【问题讨论】:

  • 你能分享一下表card_info的架构吗
  • 我用架构更新了问题。感谢您的宝贵时间。

标签: mysql insert warnings mysql-error-1292


【解决方案1】:

我自己也遇到了同样的错误,这有点误导。我在另一个帖子中找到了答案:

Error Code 1292 - Truncated incorrect DOUBLE value - Mysql

此消息表示您正在尝试比较 WHEREON 子句中的数字和字符串。要么确保它们具有相似的声明,要么使用显式的CAST 将数字转换为字符串。

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

Barmar

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

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

【讨论】:

    【解决方案2】:

    试试

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

    如果是真的很糟糕,但很有可能。

    【讨论】:

    • 由于collector_number 的两个值是“181b”和“181a”,假设有第三条记录有“180”,我希望它们以我的第一个排序的方式插入数字升序“(d.collector_number + 0)ASC”,接下来是对字母“d.collector_number ASC”进行排序。抱歉,我需要这样订购。
    • 我没有更改订单。 180 + '0' 是 '1800' 并且会在 '180a' 之前。我所做的只是告诉 sql '0' 是一个字符串而不是数字,因为 order by 子句是问题所在,并且您告诉它要在字符串中添加 0,而您的字符串是 180a,这不是数字....
    • 您可以根据需要将 ASC 放回原处,但这是默认设置。看看你所做的,我明白你为什么要按这个顺序排列它们,不过我会在卡片表中添加收藏家编号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    相关资源
    最近更新 更多