3

SQLite は、明らかに「互換性機能」として、一致する列が見つからない場合、二重引用符で囲まれた識別子を文字列リテラルとして解析するようです。

不適切なSQLを書く人や、そのような人が作成したレガシープロジェクトとの下位互換性のためにそうしていることは理解していますが、真新しいプロジェクトで適切なSQLを書いている私たちにとってはデバッグが非常に難しくなります.

例えば、

SELECT * FROM "users" WHERE "usernme" = 'joe';

文字列「usernme」が文字列「joe」と等しくないため、0 行のクエリが返されます。

これにより、苦労してコードをバックトラックしてaを忘れたことに気付くまで、その名前のユーザーがいることがわかっているのに、なぜjoeの行が表示されないのか疑問に思って頭を悩ませています。

引用ルールを適用し、二重引用符で囲まれたすべての文字列を識別子として扱い、スペルが間違っている場合はすぐに通知する「厳密モード」の PRAGMA または API オプションはありますか?

(そして、必要がない場合は識別子を引用しないようにという答えはありません。そのような答えは、基本的に、適切なデバッグを行うためには、最初に悪いコードを書かなければならないことを教えてくれるからです。)

4

2 に答える 2

1

これは SQLite パーサーでハードコーディングされており、外部から変更することはできません。

于 2012-11-14T18:11:46.340 に答える
0

また、SQLite チャネルで質問したところ、親切にもソース コードを調べてパッチを作成し、メーリング リストでパッチについて説明するスレッドを開始しました。

http://www.mail-archive.com/sqlite-users@sqlite.org/msg73832.html

公式ビルドでうまくいく答えではありませんが、いつかはうまくいくかもしれません。とりあえず、このパッチで自分で再コンパイルします。

于 2012-11-14T21:02:58.480 に答える