db2 エラー sqlcode=-420 自動型変換問題
今日、テストで、フォアグラウンドがデータを照会するページをクリックすると、エラーになる問題が発生しました。
[Error Code: -420, SQL State: 22018] DB2 SQL Error: SQLCODE=-420, SQLSTATE=22018, SQLERRMC=DECFLOAT, DRIVER=4.18.60
sqlcodeによるエラーの原因は。 -420 22018 文字列の自己変数の値が関数と一致しません。
クエリ文はおおよそ次のようなものである。
select * from tabletest where createDate < '2018-11-17' and createStatus ! = 0
この問題はテスト環境でのみ発生したため、データベースのデータの問題だと判断しました。また、デバッグの際に、以下のようなステートメントを使用するとデータが照会されることがわかり、さらに確信が持てました。
select * from tabletest where createDate < '2018-11-15' and createStatus ! = 0
しかし、createDateフィールドを取り出しても、異常なデータは見つかりませんでした。そこで、テーブル構造に目を向けると、createStatusフィールドがvarchar型であり、このsql文は createStatus ! = 0 値0と比較し、createStatusフィールドを取り出したところ、値がNULLになっており、NULL値は自動型変換のエラーであることがわかりました。sqlステートメントを次のように修正します。
select * from tabletest where createDate < '2018-11-17' and createStatus ! = '0'
データのチェックアウトに成功しました。
原因分析
問題が解決した後、問題を再現するために、db2とmysqlのそれぞれのデータベースに新しいテーブルを作成し、より深い分析を行いました。
1 create table tableTest(id varchar(20) primary key not null, createDate Date, createStatus varchar(10));
2
3 INSERT INTO tabletest (id, createDate, createStatus) VALUES ('1', '2018-11-12', '10');
4 INSERT INTO tabletest (id, createDate, createStatus) VALUES ('2', '2018-11-12', '00');
5 INSERT INTO tabletest (id, createDate, createStatus) VALUES ('3', '2018-11-13', '0');
6 INSERT INTO tabletest (id, createDate, createStatus) VALUES ('4', '2018-11-15', '');
7 INSERT INTO tabletest (id, createDate, createStatus) VALUES ('7', '2018-11-18', '48');
まず、2つのデータベースそれぞれでエラーを報告するクエリ文を実行すると、mysqlでは結果が得られ、db2ではsqlcode=-420というエラーが報告されます。
これは興味深い問題で、2つのデータでNULL値の型変換の定義が異なることが推測されます。代わりに、次のようなクエリ文を使ってください。
select * from tabletest where createDate < '2018-11-17' and createStatus = 0
db2はまだエラー-420を報告していますが、mysqlでは3つのデータをチェックアウトしています。mysql ではデータベースが直接 null 値を 0 に変換してマッチングを行っていることがわかります。しかし、これは非常に非効率的なやり方です。 SQLコマンドは、文字列を数字0 がマッチし SQLServerはデフォルトで、フィールドを フィールドを数字に変換してからマッチを行います。 . また、データが非常に大きい場合に一旦数値に変換されるため、範囲外になります。
要約すると
- SQLコマンドの値を対応するフィールドの型に変換するのではなく、クエリを実行する際にデータベース内のデータをSQLコマンドの型に変換するため、効率に影響するだけでなく、エラーも発生しやすいのです。
- mysql は null 値を自動的に 0 に変換するが、db2 は何もしない。
- データを照会する際には、フィールドのデータ型を同じにした方がよいでしょう。そうしないと、データが正しく検索されない可能性があります。
取得元:https://www.cnblogs.com/readerman/p/10118987.html
関連
-
MYSQL "Access denied; you need (at least one of) SUPER privilege(s) for this operation" 問題解決
-
この操作を行うには、少なくとも1つのSUPER権限が必要です。
-
IEntityChangeTracker の複数のインスタンスからエンティティオブジェクトを参照できない場合の対処法
-
INSERT EXEC文は入れ子にできません。
-
SQL SERVER データベース SELECT INTO および INSERT INTO の使用法(テンポラリテーブルへのデータ挿入を含む)
-
MongoDBコマンド
-
は、GROUP BY句に含まれるか、集約関数で使用される必要があります。
-
ORA-06550 "の解決策。1 行目、7 列目"
-
ORA-30926: ソース・テーブルの安定した行のセットを取得できませんか?
-
MySqlエラー解析'where節'の未知の列'xxx'
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mysql reports Access denied; you need (at least one of) SUPER privilege(s) for this operation
-
MySQL - エラーです。executeQuery() でデータ操作ステートメントを発行できません。
-
(NTDLL.DLL): 0xC0000005: アクセス違反 - 解決
-
Hibernateでhibernate.propertiesが見つからない問題とデータベース方言の更新の問題
-
解決方法 テーブルの定義が正しくありません。自動列は1つだけで、キーとして定義する必要があります。
-
MySQLデータベースのクエリ機能を使用する際に、グループ関数の使用が無効である問題の解決方法
-
01. プロシージャの結果セットを持つ一時テーブルへのSELECT INTO
-
Postgresql でテーブル "t" の FROM 句の項目が見つからない。
-
DB2 SQL エラーの解決法。sqlcode=-420, sqlstate=22018
-
MySQL上級SQLステートメント