String comparison problem in select - too many results - Mailing list pgsql-general

From Durumdara
Subject String comparison problem in select - too many results
Date
Msg-id CAEcMXhmFVUmAJB1D_BQahfWjQENNWqeuhz6HcD4_crm=XqLQNQ@mail.gmail.com
Whole thread Raw
Responses Re: String comparison problem in select - too many results  ("David G. Johnston" <david.g.johnston@gmail.com>)
List pgsql-general
Dear Members!


Today one of hour clients reported an error.

She made a report filtered with string range, and she got wrong documents.

I checked it.
She filtered by a document nr (varchar field -> character varying(15)).

The range was: '18/0113', and '18/0212'.

    Q.Close;
    Q.SQL.Text := 'select * from idoc where nr >=:pfrom and nr  <=:pto';
    Q.paramByName('pfrom').Asstring := PFrom;
    Q.paramByName('pto').Asstring := PTo;
    Q.Open;

This devart TPGQuery uses parameters, the query prepared before call.

She said that she got nr = '180/2010'  document too (and much more).

Firstly I tried to check this in LibreOffice calc, because it seems to be impossible.



LesserGreater
'18/0113'180/2010TrueFalse
'18/0212'180/2010TrueFalse

It's ok.

Then I tried to use the select in the database.
I also got 180/2010 in the list!!!

Then I tried a simple check with SQL:

select 
'18/0113' > '180/2010',
'18/0113' < '180/2010',
'18/0212' > '180/2010',
'18/0212' < '180/2010'
---
f;t;t;f

Whaaaaat????

It's impossible.
First I assumed the "/" is special char like escape "\". But in this case the pretag is "18/0" in every input string!!!

Next I supposed that PGSQL converts this expression and the numeric value could be different.
Without calculation I changed the select to:

select 
cast('18/0113' as text) > cast('180/2010' as text),
cast('18/0113' as text) < cast('180/2010' as text),
cast('18/0212' as text) > cast('180/2010' as text),
cast('18/0212' as text) < cast('180/2010' as text),
replace(cast('18/0113' as text), '/', '_') > replace(cast('180/2010' as text), '/', '_'),
replace(cast('18/0212' as text), '/', '_') > replace(cast('180/2010' as text), '/', '_')

To be sure the strings must be strings. I use replace at the end to filter "/" sign.
The result is also wrong:
f;t;t;f;f;t

Please help me in this theme!

What can cause differences between similar strings?
How can I force the good range?
What is the base of the problem?

The PG is 9.4 on Linux, the DataBase encoding is:
       ENCODING = 'UTF8'
       LC_COLLATE = 'hu_HU.UTF-8'
       LC_CTYPE = 'hu_HU.UTF-8'


Thank you for your help!

Best regards
   dd



pgsql-general by date:

Previous
From: Glauco Torres
Date:
Subject: Segmentation fault with core dump
Next
From: Merlin Moncure
Date:
Subject: Re: help with generation_series in pg10