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

Здогадайтесь, він намагається обчислити значення BOOLEAN 'Секолул XVI - XVIII' до І.
Антон Коляєв

1
Якщо у вас "де x = 'x' і y", ви отримаєте цю погано задуману і незрозумілу помилку
Йохан Снігуз

Відповіді:


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-усічений-неправильний-подвійне значення"
heman123

Так ... я теж мав подібний досвід під час спроби використовувати рядковий літерал у пункті «де» без використання лапок.
пранай

Я збирався покінчити життя самогубством через це. Слава Богу, що ти врятував мені життя. Це дурне І в оновленні. 😠🤣
gauravmehla

72

Я отримував цей виняток не через ІЗ, а не через коми, насправді у мене був такий виняток лише тому, що я не використовував апострофи в пункті де.

Наче мій запит був

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

коли я змінив де-пункт, where column2 in ('00012121');то запит працював для мене добре.


2
Те саме питання для мене! Я намагався оновити таблицю в crm, яка використовує 1 як ідентифікатор користувача адміністратора та 36 посібників для всіх інших користувачів. Мій де вказував user_id як 1, без лапок. Я думаю, це пов'язано з тим, що mysql перебуває в суворому режимі.
dmulvi

3
@danny_mulvihill Я вважаю, що ви на правильному шляху. Я STRICT_TRANS_TABLESвстановив sql_modeі намагався оновити поле, обмежене (яке, здавалося б, числовим значенням у whereпункті, призвело до помилки. Змінюючи режими, він накинув натомість попередження, але оновлення не застосував. При більш детальному огляді стовпець, що використовується в пункті де, незважаючи на те, що, здавалося, цілими значеннями, був насправді аvarchar(20)
Роберт Геннон

Те саме питання для мене. "Вибрати * з t, де id = 6503" працювало нормально, але "оновлення t встановило a =" foo ", де id = 6503" призвело до помилки 1292 (22007): усічене неправильне значення DOUBLE: '234805557438 #'. id схожий на ціле число, але був варчаром. Цитування значення в оновленні вирішило проблему. 'update t set a = "foo", де id = "6503"'
gaoithe

Та сама проблема для мене при передачі INSERT, який працював на консолі mysql, але не працював у програмному забезпеченні інтеграції даних Pentaho. Змінено "ім'я> 1000 та ім'я <6000" на "ім'я>" 1000 "та ім'я <" 6000 "" і працює як шарм.
Пиляв


12

Що це в основному

Неправильний синтаксис змушує MySQL думати, що ви намагаєтесь зробити щось зі стовпцем або параметром, який має неправильний тип "DOUBLE".

Вчіться на моїй помилці

У моєму випадку я оновив стовпчик varchar у налаштуваннях таблиці, NULLде 0стояло значення . Мій запит на оновлення виглядав так:

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ЗА ВСЕ РЯДО в таблиці! Як це сталося?
* внутрішній крик *

Зараз понад 30 тис. Рядків відсутні дані.
* внутрішній крик посилюється *

Дякую добру за резервні копії. Мені вдалося відновити всі дані.
* внутрішня інтенсивність крику знижується *

Виправлений запит такий:

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 * from shops where shop_id = 26244317283;

Але при спробі оновлення полів

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

Він не вдається з помилкою Усечене неправильне значення DOUBLE: '1t5hxq9'

Потрібно помістити shop_id 26244317283 в лапки "26244317283", щоб запит працював, оскільки поле типу varchar not int

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

Я відчув цю помилку, коли спробував зробити WHERE EXIST, де підзапит збігався з 2 стовпцями, які невпинно мали різні типи. Дві таблиці також були різними двигунами зберігання.

Один стовпець був CHAR (90), а другий - BIGINT (20).

Одна таблиця була InnoDB, а інша - ПАМ’ЯТОК.

Частина запиту:

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

Зміна типу стовпця для одного стовпця з BIGINT на CHAR вирішила проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.