2013-04-17 63 views
29

Tôi không chắc lỗi này là gì!Mã lỗi 1292 - Cắt ngắn giá trị DOUBLE không chính xác - Mysql

#1292 - Truncated incorrect DOUBLE value: 

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

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

đây là câu hỏi 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à chương trình của tôi tạo bảng cho bảng mà kết quả sẽ 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 
+2

Theo [báo cáo lỗi này] (http://bugs.mysql.com/bug.php?id=63112) thông báo đến từ việc so sánh một cột chuỗi với một số nguyên, vì cả hai đều được chuyển thành 'double' để so sánh. 'Ac.company_code' và' ta.company_code' được khai báo như thế nào? – Barmar

+0

Xem thêm http://bugs.mysql.com/bug.php?id=46641 nơi áp phích đề xuất rằng thông báo lỗi này được ghi lại thành "WHERE so sánh giữa các cột số và không phải là số không được phép" – Barmar

+0

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

Trả lời

63

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ệnh đề WHERE hoặc ON. Trong truy vấn của bạn, nơi duy nhất có tiềm năng xảy ra là ON ac.company_code = ta.company_code; hoặc đảm bảo rằng chúng có khai báo tương tự hoặc sử dụng CAST rõ ràng để chuyển đổi số thành chuỗi.

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

+0

Ồ, một thông báo lỗi gây hiểu lầm. Cảm ơn bạn đã giúp đỡ. Bạn đa đung. Tôi cần phải thay đổi bảng 'DB :: ('liên hệ') -> trong đó ('tham gia', $ int) -> cập nhật ([" tham dự "=> $ string]);' tới 'DB :: bảng (' liên hệ ') -> trong đó (' tham gia ',' '. $ int) -> cập nhật (["tham dự" => $ string]); ' – Ryan

3

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

Cảm ơn đã giải thích ở trên

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 làm một truy vấn riêng biệt với một câu lệnh SELECT và cùng mệnh đề WHERE, sau đó 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 điều kiện -> "WHERE [primary_id] IN ([danh sách ID chính được phân cá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ỳ vấn đề nào được gây ra bởi mệnh đề WHERE của truy vấn ban đầu (không thành công). Đố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 ([values ​​here])", chỉ có 10 trong số 300 mục dự kiến ​​bị ảnh hưởng, theo ý kiến ​​của tôi, có vẻ như lỗi.

3

Tôi đã sửa lỗi này vì đã xảy ra 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. Tôi đã sử dụng and ở giữ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' 

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

0

TL; DR

Điều này cũng có thể là do áp dụng OR cho các cột chuỗi/chữ.

Phiên bản đầy đủ

tôi nhận được thông báo lỗi tương tự cho một INSERT tuyên bố đơn giản liên quan đến một cái nhìn:

insert into t1 select * from v1 

mặc dù tất cả các cột nguồn và mục tiêu là loại VARCHAR.Sau khi gỡ lỗi, tôi đã tìm ra nguyên nhân gốc rễ; quan điểm 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 một chuyển đổi tự động của các đoạn sau đây 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ác vấn đề liên quan