MYSQL 잘린 잘못된 DOUBLE 값


155

아래 SQL 쿼리가 실행될 때 :

UPDATE shop_category 
SET name = 'Secolul XVI - XVIII' 
    AND name_eng = '16th to 18th centuries' 
WHERE category_id = 4768

다음과 같은 오류가 발생합니다.

1292 - Truncated incorrect DOUBLE value: 'Secolul XVI - XVIII'

이 문제를 해결하는 방법?


shop_category 테이블 구조 :

category_id   mediumint(8)
name        varchar(250)
name_eng      varchar(250)

1
어떤 식 으로든이 오류 메시지의 실제 의미가 무엇인지, 어떤 경우에 표시됩니까? DOUBLE 값이 포함되지 않은 컨텍스트에서 발생하기 때문에 다소 오해의 소지가 있습니다.
syck

AND 전에 'Secolul XVI-XVIII'의 BOOLEAN 값을 계산하려고 시도합니다.
Anton Kolyaev

1
"where x = '
x'and

답변:


214

AND키워드 가 필요하지 않습니다 . UPDATE 문의 올바른 구문은 다음과 같습니다 .

UPDATE 
    shop_category 
SET 
    name = 'Secolul XVI - XVIII', 
    name_eng = '16th to 18th centuries' 
WHERE 
    category_id = 4768

12
컴퓨터를 벽에 던지기 전에이 답을 찾았다는 것이 정말 기쁩니다.
rbennell

19
저와 같은 사람들이 그런 실수를 저지르는 것에 대해
어리석은

6
기본적으로 구문 문제가있을 때마다이 쓸모없는 예외 "mysql-truncated-incorrect-double-value"가 발생합니다
heman123

예 .. 나는 인용 부호없이 'where'절에 문자열 리터럴을 사용하려고 할 때도 비슷한 경험을했습니다.
pranay 2019

이 때문에 자살을 시도했습니다. 내 생명을 구 해주셔서 감사합니다. 이 바보 같은 AND 업데이트. 😠🤣
gauravmehla

72

쉼표 대신 AND가 아닌이 예외가 발생했습니다. 실제로 where 절에서 아포스트로피를 사용하지 않았기 때문에이 예외가 발생했습니다.

내 검색어처럼

update table set coulmn1='something' where column2 in (00012121);

where 절을 where column2 in ('00012121');다음으로 변경 하면 쿼리가 제대로 작동했습니다.


2
나에게도 같은 문제! 1을 admin 사용자의 사용자 ID로 사용하고 다른 모든 사용자의 경우 36 개의 문자 guid를 사용하는 crm에서 테이블을 업데이트하려고했습니다. 내 인용 부호없이 user_id를 1로 지정했습니다. 나는 이것이 mysql이 엄격 모드에 있다고 생각합니다.
dmulvi

3
@danny_mulvihill 나는 당신이 올바른 길을 가고 있다고 생각합니다. 나는 한 STRICT_TRANS_TABLES설정 sql_mode과에 숫자 값을 (로 보이는 것)로 제한 필드 업데이트하는 where오류 줬어요 절을. 모드를 변경하면 대신 경고가 발생했지만 여전히 업데이트가 적용되지 않았습니다. 자세히 살펴보면, where 절에 사용 된 열은 정수 값인 것처럼 보이지만 실제로는 다음과 같습니다varchar(20)
Robert Gannon

나에게도 같은 문제. 'id * 6503'에서 'select * from t'는 작동했지만 'update t set a = "foo", id = 6503'으로 인해 오류 1292 (22007)가 발생했습니다. 잘못된 DOUBLE 값이 잘못되었습니다 : '234805557438 #'. id는 정수처럼 보이지만 varchar였습니다. 업데이트 값을 인용하면 문제가 해결되었습니다. 'update t set a = "foo"여기서 id = "6503"'
gaoithe

mysql 콘솔에서는 작동하지만 Pentaho Data Integration 소프트웨어에서는 작동하지 않는 INSERT를 전달할 때도 마찬가지입니다. "name> 1000 및 name <6000"을 "name> '1000'및 name < '6000'"으로 변경하고 매력처럼 작동했습니다.
Sawd

13

를 교체 시도 AND와 함께,

UPDATE shop_category 
SET name = 'Secolul XVI - XVIII', name_eng = '16th to 18th centuries' 
WHERE category_id = 4768

UPDATE 구문 나타낸다 쉼표 세퍼레이터로서 사용되어야한다.


1
나를 위해 +1했습니다 :)
Faisal

12

기본적으로

잘못된 구문은 MySQL이 "DOUBLE"유형의 열 또는 매개 변수로 무언가를 시도한다고 생각하게합니다.

내 실수에서 배운다

필자의 경우 NULL값이 0서있는 테이블 설정 에서 varchar 열을 업데이트했습니다 . 내 업데이트 쿼리는 다음과 같습니다.

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

지금의 실제 유형부터 myValue이다 VARCHAR(255)이 경고를 제공합니다 :

+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'value xyz' |
+---------+------+-----------------------------------------------+

그리고 지금 myTable있기 때문에, 실질적으로 비어 myValue지금 NULL테이블의 모든 행에 대해! 어떻게 이런일이 일어 났습니까?
* 내부 비명 *

30k 개가 넘는 행에 데이터가 누락되었습니다.
* 내부 비명 강화

백업 주셔서 감사합니다. 모든 데이터를 복구 할 수있었습니다.
* 내부 비명 강도가 낮아짐 *

수정 된 쿼리는 다음과 같습니다.

UPDATE myTable SET myValue = NULL WHERE myValue = '0';
                                                  ^^^
                                                  Quotation here!

나는 이것이 단순한 경고 이상이되었으므로 인용문을 잊어 버리는 것이 덜 위험합니다.

* 내부 비명 종료 *


1
경고에 실패하도록 옵션을 설정할 수 있습니다. stackoverflow.com/a/4289242/1488762
Roger Dueck의

5

방금 시간을 낭비 하고이 오류가 발생하는 경우를 추가하고 싶었습니다.

SQL Error (1292): Truncated incorrect DOUBLE value: 'N0003'

테스트 데이터

CREATE TABLE `table1 ` (
    `value1` VARCHAR(50) NOT NULL 
);
INSERT INTO table1 (value1) VALUES ('N0003');

CREATE TABLE `table2 ` (
    `value2` VARCHAR(50) NOT NULL 
);

INSERT INTO table2 (value2)
SELECT value1
FROM table1
WHERE 1
ORDER BY value1+0

문제는 ORDER BY value1+0유형 캐스팅입니다.

질문에 답하지는 않지만 Google 에서이 오류의 첫 번째 결과 이며이 오류가 나타나는 다른 예가 있어야합니다.


4

주로 잘못된 쿼리 문자열이이 경고를 표시합니다.

INSTR함수를 사용할 때 미묘한 구문 오류 (오른쪽 괄호가 잘못됨)로 인해 잘못되었습니다 .

INSERT INTO users (user_name) SELECT name FROM site_users WHERE
INSTR(status, 'active'>0);

옳은:

INSERT INTO users (user_name) SELECT name FROM site_users WHERE
INSTR(status, 'active')>0;

2

mysql이 SELECT 문으로 형식 캐스팅을 정상적으로 처리하는 것 같습니다. shop_id 필드는 varchar 유형이지만 select 문이 작동합니다.

select * from shops where shop_id = 26244317283;

그러나 필드를 업데이트하려고 할 때

update stores set store_url = 'https://test-url.com' where shop_id = 26244317283;

잘못된 잘린 DOUBLE 값 오류 : '1t5hxq9'

필드가 varchar not int 유형이므로 쿼리가 작동하려면 shop_id 26244317283을 따옴표 '26244317283'로 넣어야합니다.

update stores set store_url = 'https://test-url.com' where shop_id = '26244317283';

0

아래 그림과 같은 삽입물 로이 문제가 발생하면 문제 --텍스트와 주석 텍스트 사이에 공백이 없을 수 있습니다 .

insert into myTable (a, b, c)
values (
   123 --something
  ,345 --something else
  ,567 --something something else
);

이것의 문제 --something는 실제로 -- something공백 이 있어야한다는 것 입니다.


0

bindParam을 사용하고 실제로 문자열을 전달하는 PDO :: PARAM_INT를 지정할 때이 오류가 발생했습니다. PDO :: PARAM_STR로 변경하면 오류가 수정되었습니다.


0

하위 쿼리가 실수로 다른 유형 인 2 개의 열과 일치하는 WHERE EXIST를 수행하려고 할 때이 오류가 발생했습니다. 두 테이블은 다른 스토리지 엔진이었습니다.

한 열은 CHAR (90)이고 다른 열은 BIGINT (20)입니다.

한 테이블은 InnoDB이고 다른 테이블은 MEMORY입니다.

쿼리의 일부 :

[...] AND EXISTS (select objectid from temp_objectids where temp_objectids.objectid = items_raw.objectid );

한 열의 열 유형을 BIGINT에서 CHAR로 변경하면 문제가 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.