MYSQL Obcięto niepoprawną wartość DOUBLE


155

Po wykonaniu poniższego zapytania SQL:

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

Pojawia się następujący błąd:

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

Jak to naprawić?


shop_category struktura tabeli:

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

1
Czy można w jakikolwiek sposób określić, jakie jest prawdziwe znaczenie tego komunikatu o błędzie i w jakich przypadkach się on pojawia? Ponieważ występuje w kontekstach, w których nie występuje PODWÓJNA wartość, wydaje się nieco mylący.
— syck

Chyba próbuje obliczyć wartość BOOLEAN „Secolul XVI - XVIII” przed operatorem AND.
— Anton Kolyaev

1
Jeśli masz „gdzie x = 'x' i y”, otrzymasz ten źle pomyślany i niejasny błąd
— Johan Snowgoose

Odpowiedzi:


214

Nie potrzebujesz ANDsłowa kluczowego. Oto poprawna składnia instrukcji UPDATE :

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

12
Naprawdę się cieszę, że znalazłem tę odpowiedź przed rzuceniem komputera na ścianę
— rbennell

19
więc na pewno głupota ze strony ludzi jak ja tworzących ten błąd, jednak „Okrojona nieprawidłowa wartość DOUBLE” jest całkiem bezużyteczny komunikat ostrzegawczy ...
— rbennell

6
Zasadniczo za każdym razem, gdy występuje jakiś problem ze
— składnią,

Tak… ja też miałem podobne doświadczenie, próbując użyć literału ciągu w klauzuli „where” bez używania cudzysłowów.
— pranay

Miałem z tego powodu popełnić samobójstwo. Dzięki Bogu, uratowałeś mi życie. To głupie i w aktualizacji. 😠🤣
— gauravmehla

72

Dostawałem ten wyjątek nie z powodu AND zamiast przecinka, w rzeczywistości miałem ten wyjątek tylko dlatego, że nie użyłem apostrofów w klauzuli where.

Tak jak moje zapytanie

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

kiedy zmieniłem klauzulę gdzie na where column2 in ('00012121');to zapytanie działało dobrze.


2
Dla mnie ten sam problem! Próbowałem zaktualizować tabelę w CRM, która używa 1 jako identyfikatora użytkownika administratora i 36 znaków guidów dla wszystkich innych użytkowników. My where określało user_id jako 1, bez cudzysłowów. Myślę, że jest to związane z działaniem mysql w trybie ścisłym.
— dmulvi

3
@danny_mulvihill Uważam, że jesteś na dobrej drodze. Miałem STRICT_TRANS_TABLESustawione w sql_modei próbuje zaktualizować pola ograniczone (co wydawało się być) wartość liczbową w whereklauzuli wyrzucił błędu. Zmieniając tryby, zamiast tego wyrzucił ostrzeżenie, ale nadal nie zastosował aktualizacji. Po bliższym przyjrzeniu się, kolumna użyta w klauzuli where, pomimo tego, że miała tylko to, co wydawało się być liczbami całkowitymi, była w rzeczywistości avarchar(20)
— Robert Gannon

Dla mnie ten sam problem. A 'select * from t gdzie id = 6503' działało dobrze, ale 'update t set a = "foo" gdzie id = 6503' spowodowało ERROR 1292 (22007): Obcięta niepoprawna wartość DOUBLE: '234805557438 #'. id wygląda jak liczba całkowita, ale jest varchar. Podanie wartości w aktualizacji rozwiązało problem. 'update t set a = "foo" gdzie id = "6503"'
— gaoithe

Ten sam problem dotyczy mnie podczas przekazywania INSERT, który działał w konsoli mysql, ale nie działał w oprogramowaniu Pentaho Data Integration. Zmieniono „name> 1000 i name <6000” na „name>„ 1000 ”i nazwę <„ 6000 ”” i działało jak marzenie.
— Sawd

13

Spróbuj wymienić ANDz,

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

UPDATE Składnia przedstawia przecinek stosować jako przekładki.


1
Pracowało dla mnie +1 za to :)
— Faisal

12

Co to w zasadzie jest

To nieprawidłowa składnia powoduje, że MySQL myśli, że próbujesz zrobić coś z kolumną lub parametrem, który ma nieprawidłowy typ „DOUBLE”.

Ucz się na moim błędzie

W moim przypadku zaktualizowałem kolumnę varchar w ustawieniu tabeli, w NULLktórym 0stała wartość . Moje zapytanie o aktualizację wyglądało tak:

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

Teraz, ponieważ rzeczywisty typ myValuejest VARCHAR(255)ostrzeżeniem:

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

A teraz myTablejest praktycznie pusty, ponieważ myValuejest teraz NULLdla KAŻDEGO RZĘDU w tabeli! Jak to się stało?
* wewnętrzny krzyk *

Brakuje teraz danych w ponad 30 tys. Wierszy.
* wewnętrzny krzyk nasila się *

Dzięki Bogu za kopie zapasowe. Udało mi się odzyskać wszystkie dane.
* wewnętrzna intensywność krzyków obniża się *

Poprawione zapytanie jest następujące:

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

Chciałbym, żeby to było coś więcej niż tylko ostrzeżenie, więc zapomnienie tych cytatów jest mniej niebezpieczne.

* Koniec z wewnętrznym krzykiem *


1
Możesz ustawić opcję niepowodzenia ostrzeżeń - patrz stackoverflow.com/a/4289242/1488762
— Roger Dueck

5

Po prostu zmarnowałem na to czas i chciałem dodać dodatkowy przypadek, w którym ten błąd się pojawia.

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

Dane testowe

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

Problem w tym ORDER BY value1+0- rzutowanie typu.

Wiem, że nie odpowiada na pytanie, ale to pierwszy wynik w Google dla tego błędu i powinien mieć inne przykłady, gdzie ten błąd się pojawia.


4

To ostrzeżenie będzie generować głównie nieprawidłowe ciągi zapytań.

Błąd z powodu subtelnego błędu składniowego (niewłaściwy nawias) podczas korzystania z INSTRfunkcji:

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

Poprawny:

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

2

Wygląda na to, że mysql z wdziękiem radzi sobie z rzutowaniem typów za pomocą instrukcji SELECT. Pole shop_id jest typu varchar, ale instrukcje select działają

select * from shops where shop_id = 26244317283;

Ale kiedy spróbujesz zaktualizować pola

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

Niepowodzenie z błędem Obcięto niepoprawną DOUBLE wartość: „1t5hxq9”

Musisz umieścić shop_id 26244317283 w cudzysłowie '26244317283', aby zapytanie działało, ponieważ pole jest typu varchar not int

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

0

Jeśli masz ten problem z wstawką, która wygląda jak ta poniżej, problemem może być po prostu brak spacji między --tekstem komentarza a tekstem komentarza:

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

Problem polega na tym, że --somethingfaktycznie powinno być -- somethingspacja.


0

Wystąpił ten błąd podczas korzystania z bindParam i określając PDO :: PARAM_INT, gdzie faktycznie przekazywałem ciąg. Zmiana na PDO :: PARAM_STR naprawiła błąd.


0

Wystąpił ten błąd, gdy próbowałem wykonać GDZIE ISTNIEJE, w którym podzapytanie pasowało do 2 kolumn, które przypadkowo były różnych typów. Te dwie tabele były również różnymi silnikami przechowywania.

Jedna kolumna to CHAR (90), a druga to BIGINT (20).

Jeden stół to InnoDB, a drugi MEMORY.

Część zapytania:

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

Zmiana typu kolumny w jednej kolumnie z BIGINT na CHAR rozwiązała problem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.