From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Thomas Hallgren <thomas(at)tada(dot)se> |
Cc: | Kris Jurka <books(at)ejurka(dot)com>, "Pgsql-Jdbc(at)Postgresql(dot)Org" <pgsql-jdbc(at)postgresql(dot)org> |
Subject: | Re: [Fwd: Re: [Pljava-dev] char with trailing space, PreparedStatement.setObject |
Date: | 2006-06-27 19:17:31 |
Message-ID: | 26695.1151435851@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-jdbc |
Thomas Hallgren <thomas(at)tada(dot)se> writes:
> so why does it make a difference to use varchar instead of text?
It's a question of type resolution rules. text is the preferred string
type so it "wins" in cross-type situations, in particular
char_value = text_value
will be interpreted as
char_value::text text_eq text_value
varchar is not only not a preferred type, it doesn't even have any
comparison ops of its own (it depends on text's ops). Therefore given
char_value = varchar_value
the parser is faced with the alternative interpretations
char_value::text text_eq varchar_value::text
char_value char_eq varchar_value::char
and it will prefer the latter because it has fewer casts.
See
http://www.postgresql.org/docs/8.1/static/typeconv.html
particularly rules 10.2.3b and 3c. The upshot of all this
is that a parameter specified as "text" dominates any comparison
to other string datatypes, whereas one specified as "varchar"
does not. Yeah, it's a bit grotty, but it gets the job done
and it's not an area we're likely to change much.
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Thomas Hallgren | 2006-06-27 19:43:15 | Re: [Fwd: Re: [Pljava-dev] char with trailing space, PreparedStatement.setObject |
Previous Message | Thomas Hallgren | 2006-06-27 18:06:18 | Re: [Fwd: Re: [Pljava-dev] char with trailing space, PreparedStatement.setObject |