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)
Emanuel
źródło
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
Darin Dimitrov
źródło
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.

Sidra
źródło
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.

codaddict
źródło
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 *

halfpastfour.am
źródło
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.

hrvoj3e
źródło
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;
Adrian Goia
źródło
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';
Adam Winnipass
źródło
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.

Joe Phillips
źródło
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.

Bytech
źródło
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.

thephper
źródło