이 오류가 무엇인지 잘 모르겠습니다!
#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
답변
이 메시지는 WHERE
or ON
절 에서 숫자와 문자열을 비교하려고 함을 의미합니다 . 귀하의 쿼리에서 발생할 수있는 유일한 잠재적 인 장소는 ON ac.company_code = ta.company_code
; 유사한 선언이 있는지 확인하거나 명시 적을 사용 CAST
하여 숫자를 문자열로 변환하십시오.
strict
모드 를 끄면 오류가 경고로 바뀝니다.
답변
쿼리에 구문 오류 또는 원치 않는 문자가 있었기 때문에이 오류를 수정했지만 MySQL은이를 잡을 수 없었습니다. and
업데이트하는 동안 여러 필드 사이 에서 사용 했습니다.
update user
set token='lamblala',
accessverion='dummy' and
key='somekey'
where user = 'myself'
위 쿼리의 문제는 and
쉼표 ( ,
) 로 대체 하여 해결할 수 있습니다.
답변
나는 같은 문제에 직면했다. varchar (100) 열을 숫자 1과 비교하려고합니다. 1292 오류가 발생했습니다. 1 ( ‘1’) 주위에 작은 따옴표를 추가하여 수정되었습니다.
위의 설명에 감사드립니다
답변
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)
대신.
답변
나는이 오류를 받았을 때 나는 그러나 당신이 SELECT 문과 같은과 별도의 쿼리를 할 경우 WHERE 절 다음에서 기본 ID의를 잡을 수 있다는 것을 명심해야한다, 그것은 버그였다 믿는 SELECT : SELECT CONCAT(primary_id, ',')
) 문 및 삽입 조건-> “WHERE [primary_id] IN ([SELECT 문에서 쉼표로 구분 된 기본 ID 목록)”을 사용하여 실패한 UPDATE 쿼리에 삽입하면 원래 (실패한) 쿼리의 WHERE 절로 인해 발생하는 문제를 완화 할 수 있습니다.
개인적으로 “WHERE ____ IN ([values here])”의 값에 따옴표를 사용했을 때 300 개의 예상 항목 중 10 개만 영향을 받았으며 제 생각에는 버그처럼 보입니다.
답변
이 오류가 발생하는 몇 가지 경우를 보았습니다.
1. 여러 값 목록이 !=
있는 where
절 에서 같지 않음 연산자 사용or
예 :
where columnName !=('A'||'B')
이것은 다음을 사용하여 해결할 수 있습니다.
where columnName not in ('A','B')
2. if()
함수 에서 비교 연산자 누락 :
select if(col1,col1,col2);
col1
존재하는 경우 값을 선택 하고 그렇지 않으면 col2
… 의 값을 표시 하려면 오류가 발생합니다. 다음을 사용하여 해결할 수 있습니다.
select if(col1!='',col1,col2);
답변
제 경우에는 뷰 (높은 중첩, 뷰 인 뷰) 삽입으로 오류가 발생했습니다. mysql-5.6:
CREATE TABLE tablename AS
SELECT * FROM highly_nested_viewname
;
우리가 수행 한 해결 방법은 구체화 된 뷰 (실제로는 테이블)를 시뮬레이션하고 저장 프로 시저를 사용하여 주기적으로 삽입 / 업데이트하는 것이 었습니다.