Seite 1 von 1

"case insensitive" Collation wird mal angewendet und mal nicht

Verfasst: Fr 26. Apr 2024, 16:38
von jhoehne
Hallo,

ich habe hier folgenden Fall. Eine Tabelle:

Code: Alles auswählen

create table test
(
  id BIGINT GENERATED BY DEFAULT AS IDENTITY,
  f1_cs VARCHAR(20),
  f1_ci VARCHAR(20) COLLATE UNICODE_CI
);
Mit dem Inhalt:

Code: Alles auswählen

insert into test (f1_cs, f1_ci) values ('Test', 'Test');
insert into test (f1_cs, f1_ci) values ('test', 'test');
insert into test (f1_cs, f1_ci) values ('TEST', 'TEST');
Bei folgenden Abfragen:

Code: Alles auswählen

select * from test where f1_cs starting with 'test'
select * from test where f1_ci starting with 'test'
ergeben sich die erwarteten Werte: eine Zeile bei "f1_cs" und drei Zeilen bei "f1_ci".
Aber wenn ich selektiere:

Code: Alles auswählen

select * from test where f1_cs = 'test'
select * from test where f1_ci = 'test'
bekomme ich jeweils nur eine Zeile. Hö?

--
Joachim

P.S.: Firebird 5.0, Datenbank wurde anlegt mit default charset UTF8.

Re: "case insensitive" Collation wird mal angewendet und mal nicht

Verfasst: Fr 26. Apr 2024, 17:39
von Gerd
jhoehne hat geschrieben: Fr 26. Apr 2024, 16:38
Aber wenn ich selektiere:

Code: Alles auswählen

select * from test where f1_cs = 'test'
select * from test where f1_ci = 'test'
bekomme ich jeweils nur eine Zeile. Hö?

--
Joachim

P.S.: Firebird 5.0, Datenbank wurde anlegt mit default charset UTF8.

Hallo Joachim.

Bei mir hier ist es erwartungsgemäß:

Code: Alles auswählen

gerd@gerd-MS-7641:~$ isql
CREATE DATABASE '/home/gerd/Firebird/Datenbanken/joachim.fdb'
USER 'Gerd'
PASSWORD 'geheimes_passwort'
PAGE_SIZE 8192
SET NAMES 'UTF8'
DEFAULT CHARACTER SET UTF8;
commit;
exit;
gerd@gerd-MS-7641:~$ isql


gerd@gerd-MS-7641:~$ isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> CONNECT '/home/gerd/Firebird/Datenbanken/joachim.fdb' user gerd password 'geheimes_passwort';
Database: '/home/gerd/Firebird/Datenbanken/joachim.fdb', User: GERD
SQL> create table test
CON> (
CON>   id BIGINT GENERATED BY DEFAULT AS IDENTITY,
CON>   f1_cs VARCHAR(20),
CON>   f1_ci VARCHAR(20) COLLATE UNICODE_CI
CON> );
SQL> commit;
SQL> insert into test (f1_cs, f1_ci) values ('Test', 'Test');
SQL> insert into test (f1_cs, f1_ci) values ('test', 'test');
SQL> insert into test (f1_cs, f1_ci) values ('TEST', 'TEST');
SQL> commit;
SQL> select * from test where f1_cs starting with 'test';

                   ID F1_CS                F1_CI                
===================== ==================== ==================== 
                    2 test                 test                 

SQL> select * from test where f1_ci starting with 'test';

                   ID F1_CS                F1_CI                
===================== ==================== ==================== 
                    1 Test                 Test                 
                    2 test                 test                 
                    3 TEST                 TEST                 

SQL> select * from test where f1_cs = 'test';

                   ID F1_CS                F1_CI                
===================== ==================== ==================== 
                    2 test                 test                 

SQL> select * from test where f1_ci = 'test';

                   ID F1_CS                F1_CI                
===================== ==================== ==================== 
                    1 Test                 Test                 
                    2 test                 test                 
                    3 TEST                 TEST                 

SQL> commit;
SQL> exit;
gerd@gerd-MS-7641:~$ 
Grüße Gerd

Re: "case insensitive" Collation wird mal angewendet und mal nicht

Verfasst: Fr 26. Apr 2024, 23:08
von vr2
Hallo Joachim,

kann Gerds Auswertung bestätigen, alles wie es sein soll, FB WI-V5.0.1.1372 Firebird 5.0.

Re: "case insensitive" Collation wird mal angewendet und mal nicht

Verfasst: So 28. Apr 2024, 13:39
von martin.koeditz
Hi,

bei mir funktioniert es ebenfalls korrekt. Ich habe allerdings auch den Kompatibilitätsmodus auf Firebird 3.0 eingestellt. Eventuell wäre das noch ein Punkt, den man prüfen könnte.

Gruß
Martin

Re: "case insensitive" Collation wird mal angewendet und mal nicht

Verfasst: So 28. Apr 2024, 14:28
von bfuerchau
Erstaunlich ist, dass die Vergleichsart zu unterschiedlichen Ergebnissen führt.
"starts with" entspricht dem "like 'xxx%' und wird auch genau so angewendet.
Der genaue Vergleich mit "=" scheint da aber wohl anders zu arbeiten.
Mein erster Verdacht war eine ggf. inkorrekte Registrierung der Collation, denn dafür gibts eigene Create-Befehle.
Dies erklärt allerdings nicht die unterschiedliche Behandlung.
Ursache könnte auch ein Index auf dem Feld sein, obwohl ein "starts with" oder "=" denselben Index nehmen müsste.
Ein weiterer Hinweis ist auch, dass u.U. die Compression-Angabe der Collation falsch angewendet wird.
Probieren kann man das mit der Erstellung einer eigenen Collation "create collation" und die verschiedenenen Parameter auszuprobieren.

https://firebirdsql.org/file/documentat ... ation.html

Re: "case insensitive" Collation wird mal angewendet und mal nicht

Verfasst: Mo 29. Apr 2024, 10:57
von martin.koeditz
Bitte schaut mal in die Beschreibung:
https://www.firebirdsql.org/file/docume ... dstartwith.

Dort steht:
The STARTING WITH predicate searches for a string or a string-like type that starts with the characters in its value argument. The case- and accent-sensitivity of STARTING WITH depends on the collation of the first value.
Also zu deutsch etwa:
Das Prädikat STARTING WITH sucht nach einer Zeichenkette oder einem zeichenkettenähnlichen Typ, der mit den Zeichen in seinem Wertargument beginnt. Die Unterscheidung von Groß- und Kleinschreibung bei STARTING WITH hängt von der Collation des ersten Wertes ab.
Hängt es vielleicht hiermit zusammen?

Re: "case insensitive" Collation wird mal angewendet und mal nicht

Verfasst: Mo 29. Apr 2024, 14:52
von bfuerchau
Kann ich nicht beurteilen, ggf. mal Frage an die Entwickler.
Bei start with funktioniert es ja anscheinend korrekt, nur bei "=" eben nicht.