programing

에러 코드 1292 - 잘린 DUBLE 값 - Mysql

yoursource 2022. 12. 11. 10:40
반응형

에러 코드 1292 - 잘린 DUBLE 값 - Mysql

무슨 오류인지 모르겠어요!

#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 테이블이 있습니다.

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또는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몇 가지 디버깅 후 근본 원인을 찾았습니다.뷰에는 다음과 같은 fragment가 포함되어 있습니다.

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)

대신.

이 에러가 발생하는 경우는 몇 가지 있습니다.

1. not equals 연산자를 사용한다.!=에 있어서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);

이 에러가 발생했을 때, 버그라고 생각됩니다만, SELECT 문과 같은 WHERE 절을 사용해 다른 쿼리를 실행하면, 그 SELECT 로부터 프라이머리 ID 를 취득할 수 있는 것에 주의해 주세요.SELECT CONCAT(primary_id, ',') 실패한 에 WHERE 문에서 ID ]) 에 의해,의 ( 구에 하는 문제를 할 수 UPDATE WHERE [ primary _ id ]IN ( [ SELECT 문select(ID ] ) 。이것에 의해, 원래의 (실패한) 쿼리의 WHERE 구에 의해서 발생하는 문제를 경감할 수 있습니다.

개인적으로 WHERE ___IN ([values here])의 값에 대해 따옴표를 사용했을 때 300개의 예상 엔트리 중 10개만 영향을 받고 있었습니다.제 생각에는 버그인 것 같습니다.

내 경우 뷰(높이 중첩된 뷰, 뷰인뷰) 삽입으로 인해 에서 오류가 발생했습니다.

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

이 문제를 해결하려면 구체화된 뷰(실제 표)를 시뮬레이션하고 저장 프로시저를 사용하여 정기적으로 삽입/갱신해야 했습니다.

및 에서 이 하였습니다.ES6의 "TypeORM"을하려고 할 때..where("order.id IN (:orders)", { orders })서, snowledge.orders는 쉼표로 구분된 숫자 문자열입니다.템플릿 리터럴로 변환했더니 문제가 해결되었습니다.

.where(`order.id IN (${orders})`);

문자열 필드 길이에 대해 테이블에서 CHECK RESTRAN을 사용한 경우

예: 사용자 이름 길이 > = 8을 확인하는 방법

용도:

CHECK (CHAR_LENGTH(username)>=8)

대신

CHECK (username>=8)

잘못된 데이터 유형 비교가 있는 경우 검사 제약 조건을 수정합니다.

이중 값 필드 또는 데이터가 없는 경우 sql strict 모드를 비활성화해야 합니다.

이를 수행하려면 MySQL 설치 폴더에 있는 "my.ini" 파일을 편집해야 합니다. "Set the SQL mode to strict" 행을 찾아 다음 행을 변경합니다.

# 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"로 저장하고 "TFT8 with BOM"으로 저장하지 마십시오.

언급URL : https://stackoverflow.com/questions/16068993/error-code-1292-truncated-incorrect-double-value-mysql

반응형