web-dev-qa-db-ja.com

エラーコード1292-誤ったDOUBLE値の切り捨て-Mysql

このエラーが何なのかわかりません!

#1292 - Truncated incorrect DOUBLE value: 

二重の値フィールドまたはデータはありません!

私はこれを理解しようとして1時間も無駄にしました!

ここに私の質問があります

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

ここに、結果が入っているテーブルのshow create tableがあります

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
53
Mike

このメッセージは、WHEREまたはON句の数値と文字列を比較しようとしていることを意味します。クエリでは、それが発生する可能性のある唯一の場所はON ac.company_code = ta.company_codeです。同様の宣言があることを確認するか、明示的なCASTを使用して数値を文字列に変換します。

strictモードをオフにすると、エラーは警告に変わります。

107
Barmar

クエリに構文エラーまたは不要な文字があったため、このエラーを修正しましたが、MySQLはそれをキャッチできませんでした。更新中に複数のフィールド間でandを使用していました。

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

上記のクエリの問題は、andをコンマ(,)に置き換えることで解決できます。

6
user1926248

私は同じ問題に直面していました。 varchar(100)列を数値1と比較しようとすると、1292エラーが発生しました。 1( '1')の前後に一重引用符を追加することで修正されました。

上記の説明をありがとう

5
ForeverLearner

TL; DR

これは、ORを文字列の列/リテラル​​に適用することによっても引き起こされる可能性があります。

フルバージョン

ビューを含む簡単なINSERTステートメントに対して同じエラーメッセージが表示されました。

insert into t1 select * from v1

ただし、すべてのソース列とターゲット列はVARCHAR型でした。デバッグの後、根本的な原因を見つけました。ビューには次のフラグメントが含まれていました。

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

これはおそらく、Oracleからの次のスニペットの自動変換の結果でした。

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

||はOracleの文字列連結です)。解決策は使用することでした

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

代わりに。

2
Frank Schmitt

このエラーを受け取ったときはバグだと思いますが、SELECTステートメントと同じWHERE句を使用して別のクエリを実行する場合、そのSELECTからプライマリIDを取得できることに注意してください:SELECT CONCAT(primary_id, ','))ステートメントを使用して、条件付きの失敗したUPDATEクエリに挿入します。-> "WHERE [primary_id] IN([SELECTステートメントからのコンマ区切りのプライマリIDのリスト)]。これにより、元の( )クエリのWHERE句。

個人的には、 "WHERE ____ IN([values here])"の値に引用符を使用していたときに、300のエントリのうち10のみが影響を受けていましたが、これはバグのようです。

1
Kylan Hurt

私の場合、それは mysql-5.6 でエラーを引き起こすビュー(高度にネストされたビューのビュー)挿入でした。

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

回避策は、マテリアライズドビュー(実際はテーブル)をシミュレートし、ストアドプロシージャを使用して定期的に挿入/更新することでした。

0
Nae