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

คิดว่ามันพยายามที่จะคำนวณค่าบูลีนของ 'Secolul XVI - XVIII' ก่อนและ
Anton Kolyaev

1
หากคุณมี "โดยที่ x = 'x' และ y" คุณจะได้รับข้อผิดพลาดที่เข้าใจผิดและคลุมเครือนี้
Johan Snowgoose

คำตอบ:


214

คุณไม่ต้องการANDคำหลัก นี่คือไวยากรณ์ที่ถูกต้องของคำสั่ง UPDATE :

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

12
ดีใจจริง ๆ ที่ฉันพบคำตอบนี้ก่อนที่จะส่งคอมพิวเตอร์ไปที่กำแพง
rbennell

19
ดังนั้นแน่นอนโง่เขลาในส่วนของคนอย่างฉันทำผิดพลาดว่า แต่ 'ถูกตัดไม่ถูกต้องค่า DOUBLE' เป็นข้อความเตือนสวยไร้ประโยชน์ ...
rbennell

6
โดยทั่วไปเมื่อใดก็ตามที่มีปัญหาเกี่ยวกับไวยากรณ์มันจะโยนข้อยกเว้นที่ไร้ประโยชน์นี้ "mysql-truncated
-alid

ใช่ .. ฉันก็มีประสบการณ์ที่คล้ายกันในขณะที่พยายามใช้สตริงตามตัวอักษรใน 'where' โดยไม่ต้องใช้เครื่องหมายคำพูด
pranay

ฉันกำลังจะฆ่าตัวตายด้วยเหตุนี้ ขอบคุณพระเจ้าที่ช่วยชีวิตฉันไว้ โง่และในการปรับปรุงนี้ 😠🤣
gauravmehla

72

ฉันได้รับข้อยกเว้นนี้ไม่ใช่เพราะและแทนที่จะเป็นเครื่องหมายจุลภาคในความเป็นจริงฉันมีข้อยกเว้นนี้เพียงเพราะฉันไม่ได้ใช้เครื่องหมายอะโพสโทรฟีในส่วนคำสั่ง

เช่นเดียวกับคำค้นหาของฉันคือ

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

เมื่อฉันเปลี่ยนที่ส่วนคำสั่ง where column2 in ('00012121');จากนั้นแบบสอบถามทำงานได้ดีสำหรับฉัน


2
ปัญหาเดียวกันสำหรับฉัน! ฉันพยายามอัปเดตตารางใน crm ที่ใช้ 1 เป็น id ผู้ใช้ของผู้ใช้ที่เป็น admin และ 36 char guids สำหรับผู้ใช้อื่น ๆ ฉันอยู่ที่ไหนระบุ user_id เป็น 1 โดยไม่มีเครื่องหมายคำพูด ฉันคิดว่านี่เกี่ยวข้องกับ mysql ที่อยู่ในโหมดเข้มงวด
dmulvi

3
@danny_mulvihill ฉันเชื่อว่าคุณอยู่ในเส้นทางที่ถูกต้อง ฉันได้STRICT_TRANS_TABLESตั้งค่าsql_modeและพยายามอัปเดตฟิลด์ที่ จำกัด ด้วยค่าที่เป็นตัวเลขในส่วนwhereข้อผิดพลาด การเปลี่ยนโหมดจะเป็นการเตือนแทน แต่ก็ยังไม่ได้ใช้การอัพเดท เมื่อตรวจสอบอย่างใกล้ชิดคอลัมน์ที่ใช้ในส่วนคำสั่งแม้จะมีเพียงสิ่งที่ดูเหมือนจะเป็นค่าจำนวนเต็มจริง ๆ แล้วvarchar(20)
Robert Gannon

ปัญหาเดียวกันสำหรับฉัน A 'select * from t โดยที่ id = 6503' ใช้งานได้ แต่ 'update t set = "foo" โดยที่ id = 6503' ส่งผลให้เกิดข้อผิดพลาด 1292 (22007): ค่า DOUBLE ที่ไม่ถูกต้องถูกตัดทอน: '234805557438 #' id ดูเหมือนว่าเป็นจำนวนเต็ม แต่เป็น varchar การอ้างอิงค่าในการปรับปรุงแก้ไขปัญหาได้ 'update t set a = "foo" โดยที่ id = "6503"'
gaoithe

ปัญหาเดียวกันสำหรับฉันเมื่อผ่าน INSERT ที่ทำงานในคอนโซล mysql แต่ไม่ได้ทำงานในซอฟต์แวร์ Pentaho Data Integration เปลี่ยน "ชื่อ> 1,000 และชื่อ <6000" เป็น "ชื่อ> '1000' และชื่อ <'6000'" และทำงานเหมือนเครื่องราง
เลื่อย

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" ไม่ถูกต้อง

เรียนรู้จากความผิดพลาดของฉัน

ในกรณีของฉันฉันปรับปรุงคอลัมน์ 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สำหรับทุกแถวในตาราง! มันเกิดขึ้นได้อย่างไร?
* กรีดร้องภายใน *

ตอนนี้แถวมากกว่า 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'

คุณต้องใส่ shop_id 26244317283 ในเครื่องหมายคำพูด '26244317283' เพื่อให้เคียวรีทำงานเนื่องจากฟิลด์เป็นประเภท varchar ไม่ 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 และอีกอันคือ 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.