-5

こんにちは、SQL の文字列比較で混乱しています。

select * from table where column1 = 'abc';

文字列「abc」が数値に変換されることを理解しているので、この例では (1+2+3=6) とします。

この意味は

select * from table where column1 = 'cba'; 

も同じ値 6 になります。文字列は同じではありません。教えてください。

編集:これは冗談だと思うからです。

「文字文字 King は数値表現に変換されます。AMERICAN NLS 設定の US7ASCII データベース文字セットを想定すると、文字通りの king は序数文字値の合計に変換されます: K+i+n+g = (75+105+ 110+103=393)」。

これは、私を混乱させた本の正確なテキストです。

4

2 に答える 2

3

むしろこのように見えます

    a= 00000100
    b= 00010000
    c= 01100100

    abc= 000001000001000001100100
    cba= 011001000001000000000100

したがって、同じではありません

于 2013-02-14T10:28:02.640 に答える
1

この引用は、この OCA/OCP Oracle Database 11g All-in-One Exam Guide の第 9 章の31 ページからのようです。abcもしそれがそのように機能し、実際に同等であるとcba見なされた場合、これは正しくないように見えます (親切です) 。

11gR2 SQL 言語リファレンスには次のように書かれています。

デフォルトのバイナリ比較では、データベース・キャラクタ・セット内の文字の数値コードの連結値に従って、文字列が比較されます。文字セット内の他の文字よりも大きな数値を持つ場合、その文字は別の文字よりも大きくなります。

主な違いは、「連結された値」というフレーズです。つまり、@JoroenMoonen が示したものに近く、文字セットの数値コードがつなぎ合わされています。本が示した値の合計ではありません。

しかし、連結される各文字の数値コードと、比較される数値を表す結果の (潜在的に非常に長い!) 文字列を考えるのは誤解を招く可能性があります。これらの値を取るabc= 000001000001000001100100=266340cba= 011001000001000000000100= 6557700。6557700 と 266340 を比較するだけで、それcbaが「より大きい」ことを示しabcます。しかしcb、「よりも大きい」abc- select greatest('abc', 'cb') from dual- 同じ変換を行うと、cb= 0110010000010000=が得られます25616。これは、数値として明らかに 266340 よりも小さくなります。

実際には、同等の 10gR1 ドキュメントでよりよく説明されていると思います。

Oracle は、異なる最初の文字まで 1 文字ずつ 2 つの値を比較します。その位置にある文字が大きいほど値が大きいと見なされます。長さが異なる 2 つの値が短い方の値の最後まで同じである場合、長い方の値が大きいと見なされます。長さが等しい 2 つの値に異なる文字がない場合、値は等しいと見なされます。

したがって、ASCII を想定すると、c(99) は (97) より大きいaため、どちらの文字列でもそれ以上の文字を調べる必要はありません。これは決して見ることはできませabccba

とにかく、あなたが本の説明に戸惑うのは当然です。

于 2013-02-14T12:41:53.547 に答える