Mã lỗi 1292 - Giá trị DOUBLE không chính xác bị cắt ngắn - Mysql


85

Tôi không chắc chắn đây là lỗi gì!

#1292 - Truncated incorrect DOUBLE value: 

Tôi không có trường giá trị kép hoặc dữ liệu!

Tôi đã lãng phí cả giờ để tìm ra điều này!

đây là truy vấn của tôi

INSERT INTO call_managment_system.contact_numbers 
    (account_id, contact_number, contact_extension, main_number, created_by)
SELECT
    ac.account_id,
    REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') AS Phone,
    IFNULL(ta.ext, '') AS extention,
    '1' AS MainNumber,
    '2' AS created_by
FROM 
    cvsnumbers AS ta
    INNER JOIN accounts AS ac ON ac.company_code = ta.company_code
WHERE 
    LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') ) = 10

đây là bảng tạo chương trình của tôi cho bảng mà kết quả sẽ đi vào

CREATE TABLE `contact_numbers` (  
    `number_id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
    `account_id` int(10) unsigned NOT NULL DEFAULT '0',  
    `person_id` int(11) NOT NULL DEFAULT '0',  
    `contact_number` char(15) NOT NULL,  
    `contact_extension` char(10) NOT NULL DEFAULT '',  
    `contact_type` enum('Primary','Direct','Cell','Fax','Home','Reception','Office','TollFree') NOT NULL DEFAULT 'Primary',  
    `contact_link` enum('Account','PDM','Other') NOT NULL DEFAULT 'Account',  
    `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 = inactive, 1=active', 
    `main_number` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = main phone number',  
    `created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  
    `created_by` int(11) NOT NULL,  
    `modified_on` datetime DEFAULT NULL,  
    `modified_by` int(11) NOT NULL DEFAULT '0',  
    PRIMARY KEY (`number_id`),  
    KEY `account_id` (`account_id`),  
    KEY `person_id` (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=534 DEFAULT CHARSET=utf8

7
Theo báo cáo lỗi này , thông báo đến từ việc so sánh một cột chuỗi với một số nguyên, bởi vì cả hai đều được chuyển đổi để doubleso sánh. Làm thế nào là ac.company_codeta.company_codetuyên bố?
Barmar

Xem thêm bug.mysql.com/bug.php?id=46641 trong đó một người đăng đề xuất rằng thông báo lỗi này được đổi từ thành "WHERE không được phép so sánh giữa các cột số và không phải số"
Barmar

Cả hai cột đó đều là int (11) và không phải là chuỗi!
Mike

Bạn có thể tạo một sqlfiddle với một số dữ liệu mẫu không?
Barmar

Câu trả lời:


156

Thông báo này có nghĩa là bạn đang cố gắng so sánh một số và một chuỗi trong một WHEREhoặc ONmệnh đề. Trong truy vấn của bạn, nơi tiềm năng duy nhất có thể xảy ra là ON ac.company_code = ta.company_code; hoặc đảm bảo rằng chúng có các khai báo tương tự hoặc sử dụng một cách rõ ràng CASTđể chuyển đổi số thành chuỗi.

Nếu bạn tắt strictchế độ, lỗi sẽ chuyển thành cảnh báo.


1
Chà, thật là một thông báo lỗi gây hiểu lầm. Cảm ơn vì đã giúp đỡ. Bạn đa đung. Tôi cần đổi DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);thànhDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
Ryan

4
Cám ơn vì cái này. Để mở rộng: có tất cả các cách mà điều này có thể được kích hoạt. Trong trường hợp của tôi, nó đang sử dụng regexp để trích xuất một số nguyên từ một chuỗi và so sánh điều này với một số nguyên. Thật kỳ lạ, khi tôi chỉ sử dụng câu lệnh SELECT, mọi thứ đều ổn: chọn xxxx từ t1 tham gia bên trong t2 trên t1.id = substr (giá trị, định vị (':', tagvalue) +1) Sau khi tôi biến nó thành một INSERT. ..SELECT, lỗi đã được kích hoạt.
xgretsch 20/02/19

22

Tôi đã sửa lỗi này vì có lỗi cú pháp hoặc một số ký tự không mong muốn trong truy vấn, nhưng MySQL không thể bắt được nó. Tôi đã sử dụng andgiữa nhiều trường trong quá trình cập nhật, ví dụ:

update user 
set token='lamblala', 
    accessverion='dummy' and 
    key='somekey' 
where user = 'myself'

Vấn đề trong truy vấn trên có thể được giải quyết bằng cách thay thế andbằng dấu phẩy ( ,)


Nhờ đây không phải là một vấn đề lớn nhưng vấn đề đôi khi nhỏ trở thành vấn đề lớn
Sumit Kumar Gupta

Cảm ơn bạn rất nhiều!!!! Điều này xảy ra với tôi trong bối cảnh của một tuyên bố cập nhật
KC Baltz

8

Tôi đã phải đối mặt với cùng một vấn đề. Cố gắng so sánh cột varchar (100) với số 1. Kết quả là lỗi 1292. Đã sửa bằng cách thêm dấu nháy đơn xung quanh 1 ('1').

Cảm ơn vì lời giải thích ở trên


3

TL; DR

Điều này cũng có thể được gây ra bởi việc áp dụng ORcho các cột / chữ chuỗi.

Phiên bản đầy đủ

Tôi nhận được thông báo lỗi tương tự cho một INSERTcâu lệnh đơn giản liên quan đến chế độ xem:

insert into t1 select * from v1

mặc dù tất cả các cột nguồn và cột đích đều thuộc loại VARCHAR. Sau một số lần gỡ lỗi, tôi đã tìm ra nguyên nhân gốc rễ; chế độ xem chứa đoạn này:

string_col1 OR '_' OR string_col2 OR '_' OR string_col3

mà có lẽ là kết quả của việc chuyển đổi tự động đoạn mã sau từ Oracle:

string_col1 || '_' || string_col2 || '_' || string_col3

( ||là nối chuỗi trong Oracle). Giải pháp là sử dụng

concat(string_col1, '_', string_col2, '_', string_col3)

thay thế.


Cảm ơn bạn! Mới đối với MySQL, tôi đã nối bằng cách sử dụng SQL Server cho phép, chẳng hạn như string1 + string2 + string3. Đề xuất của bạn về hàm concat đã sửa lỗi này cho tôi.
Marcy

1

Khi tôi nhận được lỗi này, tôi tin rằng đó là một lỗi, tuy nhiên bạn nên lưu ý rằng nếu bạn thực hiện một truy vấn riêng biệt với một câu lệnh SELECT và cùng một mệnh đề WHERE, thì bạn có thể lấy ID chính từ câu lệnh SELECT SELECT CONCAT(primary_id, ','):) đó và chèn chúng vào truy vấn UPDATE không thành công với các điều kiện -> "WHERE [primary_id] IN ([danh sách ID chính được phân tách bằng dấu phẩy từ câu lệnh SELECT)" cho phép bạn giảm bớt bất kỳ sự cố nào do mệnh đề WHERE của truy vấn ban đầu (không thành công) gây ra.

Đối với cá nhân tôi, khi tôi sử dụng dấu ngoặc kép cho các giá trị trong "WHERE ____ IN ([giá trị ở đây])", chỉ có 10 trong số 300 mục nhập dự kiến ​​bị ảnh hưởng, theo ý kiến ​​của tôi, có vẻ như là một lỗi.


1

Tôi đã thấy một số trường hợp xảy ra lỗi này:

1. sử dụng toán tử not = !=trong wheremệnh đề có danh sách nhiều orgiá trị

nhu la:

where columnName !=('A'||'B')

Điều này có thể được giải quyết bằng cách sử dụng

where columnName not in ('A','B')

2. thiếu toán tử so sánh trong một if()hàm:

select if(col1,col1,col2);

để chọn giá trị trong col1nếu nó tồn tại và nếu không thì hiển thị giá trị trong col2... điều này sẽ tạo ra lỗi; nó có thể được giải quyết bằng cách sử dụng:

select if(col1!='',col1,col2);

0

Trong trường hợp của tôi, đó là chèn chế độ xem (lồng vào nhau, chế độ xem trong chế độ xem) gây ra lỗi trong :

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

Cách giải quyết mà chúng tôi đã thực hiện là mô phỏng một khung nhìn cụ thể hóa (thực sự là một bảng) và định kỳ chèn / cập nhật nó bằng các thủ tục được lưu trữ.


0

Đã gặp sự cố này với ES6 và TypeORM trong khi cố gắng vượt qua .where("order.id IN (:orders)", { orders }), trong đó orderscó một chuỗi số được phân tách bằng dấu phẩy. Khi tôi chuyển đổi sang mẫu theo nghĩa đen, sự cố đã được giải quyết.

.where(`order.id IN (${orders})`);

0

Nếu bạn đã sử dụng CHECK CONSTRAINT trên bảng cho độ dài trường chuỗi

ví dụ: để kiểm tra độ dài tên người dùng> = 8

sử dụng:

CHECK (CHAR_LENGTH(username)>=8)

thay vì

CHECK (username>=8)

sửa chữa ràng buộc kiểm tra nếu có sai so sánh kiểu dữ liệu


0

Nếu bạn không có trường giá trị kép hoặc dữ liệu, có thể bạn nên thử tắt chế độ nghiêm ngặt sql.

Để làm điều đó, bạn phải chỉnh sửa tệp " my.ini " nằm trong thư mục cài đặt MySQL, tìm dòng "Đặt chế độ SQL thành nghiêm ngặt" và thay đổi dòng dưới đây:

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

vào mục này, xóa "STRICT_TRANS_TABLES"

# Set the SQL mode to strict
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Sau đó, bạn phải khởi động lại dịch vụ MySQL để kích hoạt thay đổi này.

Để kiểm tra sự thay đổi, hãy mở trình soạn thảo và thực hiện câu sql này:

SHOW VARIABLES LIKE 'sql_mode';

Rất quan trọng : Hãy cẩn thận với định dạng tệp sau khi lưu. Lưu nó là "UTF8" và không phải là "TFT8 with BOM" vì dịch vụ sẽ không khởi động lại.


Sẽ an toàn hơn khi thực hiện điều này trên cơ sở mỗi phiên, hoặc thậm chí tốt hơn chỉ trong tập lệnh cụ thể đang sửa đổi 'bảng rắc rối': $pdo->query('SET SESSION SQL_MODE = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')và sau khi phép thuật tập lệnh của bạn, hãy quay lại nghiêm ngặt theo cách tương tự:$pdo->query('SET SESSION SQL_MODE = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')
Piemol
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.