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


87

このエラーが何であるかわかりません!

#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

これが結果が入るテーブルの私のショー作成テーブルです

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

8
このバグレポートによると、メッセージは文字列列と整数doubleの比較から発生します。これは、両方が比較のために変換されるためです。どのようにしているac.company_codeta.company_code宣言しましたか?
バーマー2013

bugs.mysql.com/bug.php?id=46641も参照してください。ポスターは、このエラーメッセージを「数値列と非数値列の比較は許可されていません」に
言い換える

これらの列は両方ともint(11)であり、文字列ではありません。
マイク

いくつかのサンプルデータを使用してsqlfiddleを作成できますか?
バーマー2013

回答:


159

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

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


1
うわー、なんて誤解を招くエラーメッセージ。助けてくれてありがとう。あなたは正しかった。私はに変更DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);する必要がありましたDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
ライアン

4
これをありがとう。拡張するには:これをトリガーする方法はいろいろあります。私の場合、正規表現を使用して文字列から整数を抽出し、これを整数と比較していました。奇妙なことに、SELECTステートメントを使用したときは、すべて問題ありませんでした。t1.id= substr(value、locate( ':'、tagvalue)+1)のt1内部結合t2からxxxxを選択します。これをINSERTに変換したら。 ..SELECT、エラーがトリガーされました。
xgretsch

22

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

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

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


おかげでこれは大きな問題ではありませんが、時には小さな問題が大きな問題になります
Sumit KumarGupta19年

どうもありがとうございます!!!!これは、更新ステートメントのコンテキストで私に起こりました
KCBaltz20年

8

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

上記の説明をありがとう


3

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)

代わりに。


ありがとうございました!MySQLの新機能として、string1 + string2 + string3のようなSQLServerで許可された方法を使用して連結していました。concat関数の提案により、このエラーが修正されました。
マーシー

1

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

私個人としては、「WHERE ____ IN([values here])」の値に引用符を使用していたとき、影響を受けたのは予想される300のエントリのうち10のみで、私の意見ではバグのようです。


1

このエラーが発生するケースをいくつか見てきました。

1.使用してはいないオペレータに等しい!=where複数のリストを句or

といった:

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

これは、を使用して解決できます

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

2.if()関数に比較演算子がありません:

select if(col1,col1,col2);

の値がcol1存在する場合はそれを選択し、そうでない場合はの値を表示するためにcol2...これはエラーをスローします。以下を使用して解決できます。

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

0

私の場合、それはビュー(高度にネストされた、ビュー内のビュー)の挿入であり、

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

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


0

を渡そうとしたときにES6とTypeORMでこの問題が発生しました.where("order.id IN (:orders)", { orders })。ここordersで、はコンマで区切られた数値の文字列でした。テンプレートリテラルに変換すると、問題は解決しました。

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

0

使用したことがある場合 文字列フィールドの長さについてテーブルでCHECKCONSTRAINT

例:ユーザー名の長さ> = 8を確認する

使用する:

CHECK (CHAR_LENGTH(username)>=8)

の代わりに

CHECK (username>=8)

データ型の比較が間違っている場合は、チェック制約を修正します


0

二重値フィールドまたはデータがない場合は、SQLストリクトモードを無効にしてみてください。

これを行うには、MySQLインストールフォルダにある「my.ini」ファイルを編集する必要があります。「SQLモードを厳密に設定する」行を見つけて、次の行を変更します。

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

これに、「STRICT_TRANS_TABLES」を削除します

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

その後、この変更を有効にするには、MySQLサービス再起動する必要があります。

変更を確認するには、エディターを開いて次のSQL文を実行します。

SHOW VARIABLES LIKE 'sql_mode';

非常に重要:保存後のファイル形式に注意してください。サービスが再起動しないため、「UTF8」として保存し、「TFT8withBOM」としては保存しないでください。


これは、セッションごとにこれを行うには、より安全で、またはより良いだけで、特定のスクリプトに「面倒テーブル」を修正だと:$pdo->query('SET SESSION SQL_MODE = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')とスクリプトの魔法の後、同じように厳しい背を向ける:$pdo->query('SET SESSION SQL_MODE = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')
Piemol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.