Varchar-Abfrage mit Leerzeichen, komischer effekt

27/04/2009 - 15:18 von Klaus Neppl | Report spam
Hallo,
Folgende Abfrage sei gegeben

select * from tab where txtSpalte='aaa'

liefert einen Datensatz, wo in txtSpalte 'aaa' steht. Soweit klar.
Jetzt schreibe ich:

select * from tab where txtSpalte='aaa '

also mit nachfolgenden Leerzeichen und erhalte trotzdem den gleichen
Datensatz mit 'aaa'.

Warum ist das denn so? Ich hàtte dieses Verhalten eigentlich nicht erwartet.

Klaus
 

Lesen sie die antworten

#1 Frank Kalis
27/04/2009 - 16:29 | Warnen spam
On 27 Apr., 15:18, "Klaus Neppl" wrote:
Hallo,
Folgende Abfrage sei gegeben

select * from tab where txtSpalte='aaa'

liefert einen Datensatz, wo in txtSpalte 'aaa' steht. Soweit klar.
Jetzt schreibe ich:

select * from tab where txtSpalte='aaa   '

also mit nachfolgenden Leerzeichen und erhalte trotzdem den gleichen
Datensatz mit 'aaa'.

Warum ist das denn so? Ich hàtte dieses Verhalten eigentlich nicht erwartet.




Weil logisch kein Unterschied zwischen 'aaa' und 'aaa ' besteht und
der Vergleich deshalb TRUE zurückgibt.

Ursprung ist der SQL 92 Standard, dem SQL Server teilweise folgt:

3) The comparison of two character strings is determined as fol-
lows:

a) If the length in characters of X is not equal to the length
in characters of Y, then the shorter string is effectively
replaced, for the purposes of comparison, with a copy of
itself that has been extended to the length of the longer
string by concatenation on the right of one or more pad char-
acters, where the pad character is chosen based on CS. If
CS has the NO PAD attribute, then the pad character is an
implementation-dependent character different from any char-
acter in the character set of X and Y that collates less
than any string under CS. Otherwise, the pad character is a
<space>.

b) The result of the comparison of X and Y is given by the col-
lating sequence CS.

c) Depending on the collating sequence, two strings may com-
pare as equal even if they are of different lengths or con-
tain different sequences of characters. When the operations
MAX, MIN, DISTINCT, references to a grouping column, and the
UNION, EXCEPT, and INTERSECT operators refer to character
strings, the specific value selected by these operations from
a set of such equal values is implementation-dependent.

Lies Dir auch mal "Using char and varchar Data" in den BOL durch.
Frank Kalis
Microsoft SQL Server MVP
Webmaster: http://www.insidesql.org

Ähnliche fragen