"case insensitive" Collation wird mal angewendet und mal nicht

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
jhoehne
Beiträge: 44
Registriert: Di 11. Dez 2018, 09:19

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.
--
Joachim
Gerd
Beiträge: 243
Registriert: Di 1. Okt 2019, 17:13

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
ISQL Version: LI-V5.0.1.1469
Linux Mint 22 Cinnamon 6.2.9
vr2
Beiträge: 246
Registriert: Fr 13. Apr 2018, 00:13

Hallo Joachim,

kann Gerds Auswertung bestätigen, alles wie es sein soll, FB WI-V5.0.1.1372 Firebird 5.0.
Benutzeravatar
martin.koeditz
Beiträge: 478
Registriert: Sa 31. Mär 2018, 14:35

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
Martin Köditz
it & synergy GmbH
bfuerchau
Beiträge: 546
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

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
Benutzeravatar
martin.koeditz
Beiträge: 478
Registriert: Sa 31. Mär 2018, 14:35

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?
Martin Köditz
it & synergy GmbH
bfuerchau
Beiträge: 546
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Kann ich nicht beurteilen, ggf. mal Frage an die Entwickler.
Bei start with funktioniert es ja anscheinend korrekt, nur bei "=" eben nicht.
Antworten