2011-11-19 4 views
0

여기에 이런 버그가 많이 있지만이 쿼리는 삽입 쿼리와 다르게 보입니다. 여기INSERT 쿼리에서 Mysql 잘린 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 

그리고 내 쿼리입니다 : 다음은 테이블 card_info에 대한 스키마는

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 절을 제거하면 올바르게 삽입됩니다. 나는 내가 뭘 잘못하고 있는지 모른다.

미리 감사드립니다.

+0

당신은 테이블 card_info에 대한 스키마를 공유 할 수 있습니까 –

+0

나는 T를 업데이 트했습니다 그는 스키마에 의문을 제기한다. 시간 내 주셔서 감사합니다. – voldomazta

답변

0

, d.collector_number을 ('0'+ d.collector_number)에 의해

ORDER를보십시오;

끔찍한 사실이라면 가능합니다.

+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