1. ホーム
  2. Database

db2 エラー sqlcode=-420 自動型変換問題

2022-02-22 10:57:43

今日、テストで、フォアグラウンドがデータを照会するページをクリックすると、エラーになる問題が発生しました。

[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