アカウント名:
パスワード:
誰か教えてちょうだい
値のNULLと文字列の"NULL"を適当に変換すれば。さらに、環境によっては、暗黙にそう変換されることも。
値のNULLと文字列の"NULL"の混同が原因なのはほぼ間違いないだろうが、#3668224の言うように、それだけでは説明できない。
もし値のNULLが文字列の"NULL"に変換されるなら、ナンバープレートを登録した時点から請求が来るはず。逆に文字列の"NULL"が値のNULLに変換されても、SQLならNULLに関する演算は不定なので、値が返されることはない。そうでなくとも値のNULLはクエリ中で再び文字列の"NULL"に変換されるだろうから、最初の疑問にまた戻る。
つまり何らかの非対称性が必要。
# 実は最初から請求は発生していたけど、駐車違反するまで正規の連絡先が分からなかったとか。# あるいはもっと単純に、駐車違反の頃にたまたまシステムが変わったとか。
元コメは、そこまでの追求を求めてないやろ。
ちなみに、「非対称性」なんか、値NULLは文字列にするが、文字列"NULL"はそのまま、となってるだけで成立するで。いいかげんにSQLを使えばありがち。
交通違反は何度も起こりうるから、キーが文字列のエントリを探して罰金を加算するルーチンと、文字列からキーを作るルーチンが別なだけでしょ。要するにエントリを作る処理はnullチェックしてるけど、エントリを探す処理はnullでも通ってしまうのだと思う。
別な「だけ」というか、2段階あるというのは#3668224の言っていることと本質的に同じでは?
その上でnullチェックが不十分だとどうして不具合を起こすかという話まで来たんだと思うが。
Javaでやってみた.。
public class nullstring { public static void main(String[] args) throws Exception{ Integer a = null; String s = String.valueOf(a); s = s.toUpperCase(); System.out.println(s); }}
$ java nullstringN
php使ってるショボいWebアプリなら、その手の話は日常だと思う。注意してないと、わりと簡単にはまる。
注意してればだいたい大丈夫なんだが、そのぶん煩雑で疲れる。
で、具体的にどういうコードがそうなります?遥か太古のPHPならわからんでもないけど、今のPHPは"NULL"とNULLは厳密に区別されてます。ようわからんので具合的なコードを切に希望します。
駐車違反をする前までは問題なかったのだから、事前に違反テーブルに該当するナンバーが含まれていることが担保されていたんだと思う。例えば請求が月例かなんかのバッチ処理で、複数の違反をしていたらまとめて請求するので、まず、違反ナンバーのリストを抽出してから、ナンバー毎にクエリをかけるとか。
で、そしてそれが十分なチェック(ナンバーが無効なら含まれているはずはない、含まれているなら有効)だと勘違いして、その後の処理をはしょったとか?
でも'NULL'とNULLは違うからなぁ。素でクエリを生成していたら間違いようがないので、なんかフレームワーク介していたのかなぁ。
テーブル間の外部キー結合制約によってはナンバープレートがNOT NULL制約になってる可能性もありますし、登録する時はまだ不明だけどブランクにできないってときに'NULL'を埋めるようになってるとかあるかも。
'NULL'で埋められてたら'NULL'に請求がいくのでは?日本の免許でいう点数みたいなのがAND条件で入ってるんですかね。
銀行口座の金額計算端数をソート順で最後になるはずのZZZZZさんに突っ込む、みたいな有名なバグ(仕様?)がありますが、それの亜種ではないかと。
>'NULL'で埋められてたら'NULL'に請求がいくのでは?そのせいで、ナンバープレートが'NULL'の人に請求が集まったんじゃないかなと思った。
このツリーでも何か不具合が起こってるような……。# 無限ループ?
NaNは大丈夫だろうか
ナンと答えればいいだろうか・・・
にゃーん、と鳴いておけば良いのでは?# そしてキモいオッサンとしてクビになる
どうやらエラー用に文字列NULLが使われていたとかいう話のようだ
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
身近な人の偉大さは半減する -- あるアレゲ人
一体どんなコードを書けば文字列NULLが不具合を起こすコードになるのか (スコア:0)
誰か教えてちょうだい
Re:一体どんなコードを書けば文字列NULLが不具合を起こすコードになるのか (スコア:3)
値のNULLと文字列の"NULL"を適当に変換すれば。
さらに、環境によっては、暗黙にそう変換されることも。
Re: (スコア:0)
値のNULLと文字列の"NULL"の混同が原因なのはほぼ間違いないだろうが、
#3668224の言うように、それだけでは説明できない。
もし値のNULLが文字列の"NULL"に変換されるなら、ナンバープレートを登録した時点から請求が来るはず。
逆に文字列の"NULL"が値のNULLに変換されても、SQLならNULLに関する演算は不定なので、値が返されることはない。
そうでなくとも値のNULLはクエリ中で再び文字列の"NULL"に変換されるだろうから、最初の疑問にまた戻る。
つまり何らかの非対称性が必要。
# 実は最初から請求は発生していたけど、駐車違反するまで正規の連絡先が分からなかったとか。
# あるいはもっと単純に、駐車違反の頃にたまたまシステムが変わったとか。
Re:一体どんなコードを書けば文字列NULLが不具合を起こすコードになるのか (スコア:2)
元コメは、そこまでの追求を求めてないやろ。
ちなみに、「非対称性」なんか、値NULLは文字列にするが、文字列"NULL"はそのまま、となってるだけで成立するで。
いいかげんにSQLを使えばありがち。
Re: (スコア:0)
交通違反は何度も起こりうるから、キーが文字列のエントリを探して罰金を加算するルーチンと、文字列からキーを作るルーチンが別なだけでしょ。要するにエントリを作る処理はnullチェックしてるけど、エントリを探す処理はnullでも通ってしまうのだと思う。
Re: (スコア:0)
別な「だけ」というか、2段階あるというのは#3668224の言っていることと本質的に同じでは?
その上でnullチェックが不十分だとどうして不具合を起こすかという話まで来たんだと思うが。
Re: (スコア:0)
Javaでやってみた.。
public class nullstring {
public static void main(String[] args) throws Exception{
Integer a = null;
String s = String.valueOf(a);
s = s.toUpperCase();
System.out.println(s);
}
}
$ java nullstring
N
Re: (スコア:0)
php使ってるショボいWebアプリなら、その手の話は日常だと思う。
注意してないと、わりと簡単にはまる。
注意してればだいたい大丈夫なんだが、そのぶん煩雑で疲れる。
Re: (スコア:0)
で、具体的にどういうコードがそうなります?
遥か太古のPHPならわからんでもないけど、今のPHPは"NULL"とNULLは厳密に区別されてます。
ようわからんので具合的なコードを切に希望します。
Re: (スコア:0)
駐車違反をする前までは問題なかったのだから、事前に違反テーブルに該当するナンバーが含まれていることが担保されていたんだと思う。
例えば請求が月例かなんかのバッチ処理で、複数の違反をしていたらまとめて請求するので、まず、違反ナンバーのリストを抽出してから、ナンバー毎にクエリをかけるとか。
で、そしてそれが十分なチェック(ナンバーが無効なら含まれているはずはない、含まれているなら有効)だと勘違いして、その後の処理をはしょったとか?
でも'NULL'とNULLは違うからなぁ。
素でクエリを生成していたら間違いようがないので、なんかフレームワーク介していたのかなぁ。
Re: (スコア:0)
テーブル間の外部キー結合制約によってはナンバープレートがNOT NULL制約になってる可能性もありますし、
登録する時はまだ不明だけどブランクにできないってときに'NULL'を埋めるようになってるとかあるかも。
Re: (スコア:0)
'NULL'で埋められてたら'NULL'に請求がいくのでは?
日本の免許でいう点数みたいなのがAND条件で入ってるんですかね。
Re: (スコア:0)
銀行口座の金額計算端数をソート順で最後になるはずのZZZZZさんに突っ込む、みたいな有名なバグ(仕様?)がありますが、
それの亜種ではないかと。
Re: (スコア:0)
>'NULL'で埋められてたら'NULL'に請求がいくのでは?
そのせいで、ナンバープレートが'NULL'の人に請求が集まったんじゃないかなと思った。
Re: (スコア:0)
このツリーでも何か不具合が起こってるような……。
# 無限ループ?
Re: (スコア:0)
NaNは大丈夫だろうか
Re: (スコア:0)
ナンと答えればいいだろうか・・・
Re: (スコア:0)
にゃーん、と鳴いておけば良いのでは?
# そしてキモいオッサンとしてクビになる
Re: (スコア:0)
どうやらエラー用に文字列NULLが使われていたとかいう話のようだ