MYSQL Rút ngắn giá trị NHÂN ĐÔI


155

Khi truy vấn SQL bên dưới được thực thi:

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

Các lỗi sau đây được nêu ra:

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

Làm thế nào để khắc phục điều này?


shop_category cấu trúc bảng:

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

1
Có phải trong bất kỳ cách nào có thể xác định được ý nghĩa thực sự của thông báo lỗi này là gì, và trong trường hợp nào nó xuất hiện? Vì nó xảy ra trong các bối cảnh không liên quan đến giá trị NHÂN ĐÔI, nên có vẻ hơi sai lệch.
syck

Đoán nó cố gắng tính giá trị BOOLESE của 'Secolul XVI - XVIII' trước AND.
Anton Kolyaev

1
Nếu bạn có "where x = 'x' và y", bạn sẽ nhận được lỗi khó hiểu và tối nghĩa này
Johan Snowgoose

Câu trả lời:


214

Bạn không cần ANDtừ khóa. Đây là cú pháp đúng của câu lệnh CẬP NHẬT :

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

12
Thực sự vui mừng tôi đã tìm thấy câu trả lời này trước khi ném máy tính vào tường
rbennell

19
Tuy nhiên, chắc chắn sự ngu ngốc của những người như tôi đã phạm phải sai lầm đó, tuy nhiên, 'Cắt bớt giá trị
NHÂN

6
Về cơ bản bất cứ khi nào có một số vấn đề Cú pháp, nó sẽ ném ngoại lệ vô dụng này "mysql-truncated-không chính xác-giá trị kép"
heman123

Có..tôi cũng có một trải nghiệm tương tự trong khi cố gắng sử dụng một chuỗi ký tự trong mệnh đề 'where' mà không sử dụng dấu ngoặc kép.
pranay

Tôi định tự tử vì điều này. Cảm ơn chúa đã cứu mạng tôi. Điều này ngu ngốc VÀ trong bản cập nhật. 😠🤣
gauravmehla

72

Tôi đã nhận được ngoại lệ này không phải vì AND thay vì dấu phẩy, thực tế tôi đã có ngoại lệ này chỉ vì tôi không sử dụng dấu nháy đơn trong mệnh đề where.

Giống như truy vấn của tôi là

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

Khi tôi thay đổi mệnh đề thành where column2 in ('00012121');thì truy vấn hoạt động tốt với tôi.


2
Vấn đề tương tự cho tôi! Tôi đã cố gắng cập nhật một bảng trong crm sử dụng 1 làm id người dùng của người dùng quản trị viên và 36 hướng dẫn char cho tất cả người dùng khác. Của tôi đã chỉ định user_id là 1, không có dấu ngoặc kép. Tôi nghĩ rằng điều này có liên quan đến việc mysql ở chế độ nghiêm ngặt.
dmulvi

3
@danny_mulvihill Tôi tin rằng bạn đang đi đúng hướng. Tôi đã STRICT_TRANS_TABLESthiết lập sql_modevà cố gắng cập nhật một trường bị giới hạn với (dường như là) một giá trị số trong wheremệnh đề đã gây ra lỗi. Thay đổi chế độ, nó đã đưa ra một cảnh báo thay thế, nhưng vẫn không áp dụng bản cập nhật. Khi kiểm tra kỹ hơn, cột được sử dụng trong mệnh đề where, mặc dù chỉ có giá trị nguyên là giá trị nguyên, thực ra làvarchar(20)
Robert Gannon

Vấn đề tương tự đối với tôi. A 'select * từ t trong đó id = 6503' hoạt động ổn nhưng 'update t set a = "foo" trong đó id = 6503' dẫn đến ERROR 1292 (22007): Rút ngắn giá trị NHÂN ĐÔI: '234805557438 #'. id trông giống như số nguyên nhưng là một varchar. Trích dẫn giá trị trong bản cập nhật đã giải quyết vấn đề. 'update t set a = "foo" trong đó id = "6503"'
gaoithe

Vấn đề tương tự đối với tôi khi vượt qua một INSERT đang hoạt động trong bảng điều khiển mysql nhưng không hoạt động trong phần mềm Pentaho Data Integration. Đã thay đổi "tên> 1000 và tên <6000" thành "tên> '1000' và tên <'6000'" và hoạt động như một lá bùa.
Cưa

13

Hãy thử thay thế ANDbằng,

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

Các CẬP NHẬT Cú pháp show dấu phẩy nên được sử dụng làm phân cách.


1
Làm việc cho tôi +1 cho nó :)
Faisal

12

Về cơ bản nó là gì

Đó là cú pháp không chính xác khiến MySQL nghĩ rằng bạn đang cố gắng làm điều gì đó với một cột hoặc tham số có loại "NHÂN ĐÔI" không chính xác.

Học hỏi từ sai lầm của tôi

Trong trường hợp của tôi, tôi đã cập nhật cột varchar trong cài đặt bảng NULLcó giá trị 0đứng. Truy vấn cập nhật của tôi là như thế này:

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

Bây giờ, vì loại thực tế myValueVARCHAR(255)điều này đưa ra cảnh báo:

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

Và bây giờ myTablethực tế là trống rỗng, bởi vì myValuebây giờ là NULLcho MỌI ROW trong bảng! Làm sao chuyện này lại xảy ra?
* la hét nội bộ *

Hơn 30k hàng hiện thiếu dữ liệu.
* la hét nội bộ tăng cường *

Cảm ơn lòng tốt cho bản sao lưu. Tôi đã có thể phục hồi tất cả các dữ liệu.
* giảm cường độ la hét nội bộ *

Truy vấn đã sửa như sau:

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

Tôi ước điều này không chỉ là một lời cảnh báo để bớt đi những lời trích dẫn đó.

* Kết thúc la hét nội bộ *


1
Bạn có thể đặt tùy chọn thất bại trong các cảnh báo - xem stackoverflow.com/a/4289242/1488762
Roger Dueck

5

Tôi chỉ lãng phí thời gian của mình vào việc này và muốn thêm một trường hợp mà lỗi này xuất hiện.

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

Dữ liệu kiểm tra

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

Vấn đề là ORDER BY value1+0 - kiểu đúc.

Tôi biết rằng nó không trả lời câu hỏi nhưng đây là kết quả đầu tiên trên Google cho lỗi này và nó sẽ có các ví dụ khác trong đó lỗi này xuất hiện.


4

Chủ yếu các chuỗi truy vấn không hợp lệ sẽ đưa ra cảnh báo này.

Sai do lỗi cú pháp tinh tế (sai dấu ngoặc đơn bên phải) khi sử dụng INSTRhàm:

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

Chính xác:

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

2

Có vẻ như mysql xử lý kiểu truyền một cách duyên dáng với các câu lệnh CHỌN. Trường shop_id có kiểu varchar nhưng các câu lệnh chọn hoạt động

select * from shops where shop_id = 26244317283;

Nhưng khi bạn thử cập nhật các trường

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

Không thành công với lỗi Rút ngắn giá trị NHÂN ĐÔI: '1t5hxq9'

Bạn cần đặt shop_id 26244317283 trong dấu ngoặc kép '26244317283' để truy vấn hoạt động do trường có kiểu varchar không int

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

0

Nếu bạn đang gặp vấn đề này với một phần chèn giống như phần bên dưới, thì vấn đề có thể đơn giản là thiếu khoảng trắng giữa --và văn bản nhận xét:

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

Vấn đề với điều này là --somethingthực sự nên -- somethingcó một không gian.


0

Tôi đã gặp lỗi này khi sử dụng bindParam và chỉ định PDO :: PARAM_INT nơi tôi thực sự đang truyền một chuỗi. Thay đổi thành PDO :: PARAM_STR đã sửa lỗi.


0

Tôi đã gặp phải lỗi này khi tôi thử thực hiện WHERE EXIST trong đó truy vấn con khớp với 2 cột ngẫu nhiên là các loại khác nhau. Hai bảng cũng là công cụ lưu trữ khác nhau.

Một cột là CHAR (90) và cột còn lại là BIGINT (20).

Một bảng là InnoDB và bàn còn lại là NHỚ.

Một phần của truy vấn:

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

Thay đổi loại cột trên một cột từ BIGINT thành CHAR đã giải quyết vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.