Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Text sucherei (https://www.delphipraxis.net/169161-text-sucherei.html)

Gruber_Hans_12345 3. Jul 2012 09:11

Datenbank: Firebird • Version: 2.5 • Zugriff über: SQL

Text sucherei
 
Hallo

foglendes Problem, ich habe eine DB wo ich Strings drinnen stehen habe die auch umlaute habe, diese sind als "normale" Varchar ohne COLLATE usw angelegt, und das kann ich auch nicht so schnell ändern.

Nun muß ich in diesen Feldern suchen

ein
WHERE UPPER(BEZEICHNUNG) LIKE '%TEST%';
funktioniert

nur was nicht funktioniert ist wenn im Suchtext ein umlaut drinnen ist, da ja das UPPER aus "testäödr" ein "TESTäöDR" macht.

was funktioniert wäre ja folgendes
Code:
UPPER(CAST(BEZEICHNUNG AS BLOB CHARACTER SET ISO8859_1) COLLATE DE_DE) LIKE '%TEÖÄ%'
nur das problem ist, das es so grotten langsam ist, dauert statt noramlerweise 2 Sekunden, 4 Minuten

Habe ich da noch eine andere möglichkeit?

tsteinmaurer 3. Jul 2012 09:26

AW: Text sucherei
 
Hallo,

* Mit welchem Zeichensatz wurde die Datenbank erstellt?
* Von welchem Typ ist BEZEICHNUNG?
* Mit welchem Zeichensatz wurde BEZEICHNUNG erstellt?
* Mit welchem Zeichensatz verbindest du dich zur Datenbank?

Gruber_Hans_12345 3. Jul 2012 09:49

AW: Text sucherei
 
Also ich suche in zwei Feldern

BEZEICHNUNG VARCHAR(200)
BESCHREIBUNG BLOB SUB_TYPE TEXT

Zeichensatz wurde weder beim erstellen der DB noch bei den Feldern was eingestellt (Wie und wo kann ich da nachschauen, was da drinnensteht)
es ist einfach ein gewachsenes System, daher sind änderung nur sehr sehr schwer durchzuführen ;) (Oder auch verbesserungen ;) )

Gruber_Hans_12345 3. Jul 2012 10:04

AW: Text sucherei
 
so das hier meinst oder?

Code:
CREATE DATABASE 'test.fdb' PAGE_SIZE 8192
 DEFAULT CHARACTER SET NONE                                                                                        


CREATE TABLE "ARTIKEL"
(
  "ID"  INTEGER NOT NULL,
  "BEZEICHNUNG"  VARCHAR(200),
  "BESCHREIBUNG"  BLOB SUB_TYPE 0 SEGMENT SIZE 80
);

tsteinmaurer 3. Jul 2012 10:04

AW: Text sucherei
 
Zitat:

Zeichensatz wurde weder beim erstellen der DB noch bei den Feldern was eingestellt (Wie und wo kann ich da nachschauen, was da drinnensteht)
Schlecht, weil dann läuft alles im Kontext von NONE. Im Prinzip akzeptiert hier Firebird alles, ohne dabei irgendwelche Überprüfungen im Kontext des verwendeten Zeichensatzes durchzuführen inkl. weiss Firebird hier dann eben nicht was mit Umlauten etc. zu tun ist. Ganz vereinfacht dargestellt.

Kurzfristig kann man sich mit den unterschiedlichen CASTs drüberhelfen, aber das ist längerfristig keine Option. LIKE '%...%' würde dir zwar eh keinen Index verwenden, aber z.B. bei LIKE '...%' auf einem VARCHAR sehr wohl, allerdings wird das durch ein CAST mit COLLATE etc. wieder ausgehebelt und es wird somit kein Index verwendet.

Ich befürchte, längerfristig solltet ihr eine Migration auf einen Zeichensatz eurer Anforderungen entsprechend anstreben.

Gruber_Hans_12345 3. Jul 2012 10:13

AW: Text sucherei
 
Hmmm, auf was soll man da dann migrieren, ich habe ja das problem, das die gleiche datenbank ja auch in anderne ländern funktionieren sollte (Also Tschechei, Ungarn, Slowakei, Serbien ... )
ich hatte bis vor kurzen eine "Lösung" indem ich eine UDF Funktion gemacht habe, die halt ein ANSIUPPERCASE macht aber das problem war halt das diese UDF halt wieder bestimmte anzahl von zeichen zurückgeben muß

Das COLLATE ist so langsam das ich es wieder rausgeben mußte ...

Siehst du einen kurzfristigen weg, mit dem man das lösen kann OHEN die Db anzugreifen (ich möchte nun ungern über 100 DB's umändern ... )
vorrangig geht es mir nur um die äöü die ich mit dem UPPER nicht schaffe...

Blup 3. Jul 2012 10:34

AW: Text sucherei
 
Alle Kombinationen der Umlaute angeben:
Code:
WHERE (UPPER(BEZEICHNUNG) LIKE '%TESTäöDR%') or
      (UPPER(BEZEICHNUNG) LIKE '%TESTÄöDR%') or
      (UPPER(BEZEICHNUNG) LIKE '%TESTäÖDR%') or
      (UPPER(BEZEICHNUNG) LIKE '%TESTÄÖDR%');
In der Regel werden höchstens 1 bis 2 Umlaute im Suchtext sein.
Sind mehr als 3 enthalten, würde ich den Suchtext nach dem 3. Umlaut einkürzen.

tsteinmaurer 3. Jul 2012 10:51

AW: Text sucherei
 
Zitat:

Hmmm, auf was soll man da dann migrieren, ich habe ja das problem, das die gleiche datenbank ja auch in anderne ländern funktionieren sollte (Also Tschechei, Ungarn, Slowakei, Serbien ... )
Naja, mit Unicode wärst halt auf der sicheren Seite. Aber damit das Sinn macht, muss auch die Client-Anwendung, Delphi etc. mitmachen.
Zitat:

Das COLLATE ist so langsam das ich es wieder rausgeben mußte ...
Du könntest mal versuchen den CAST im Falle von BEZEICHNUNG nicht auf einen BLOB sondern auf einen VARCHAR zu machen. Vielleicht hilft das bzgl. Performance. Ein Index wird dir da aber nie verwendet werden.
Zitat:

Siehst du einen kurzfristigen weg, mit dem man das lösen kann OHEN die Db anzugreifen (ich möchte nun ungern über 100 DB's umändern ... )
Ehrlich gesagt keinen Vernünftigen. Haben sich deine Kunden noch nie beschwert, dass z.B. auch die Sortierung nach Textfeldern eine Katastrophe ist?

Iwo Asnet 3. Jul 2012 10:53

AW: Text sucherei
 
Wieso baut man sich dafür keine UDF?
SQL-Code:
WHERE UDFMatches(Field,'%Sörtschtäxt%')

Gruber_Hans_12345 3. Jul 2012 10:59

AW: Text sucherei
 
Das mit der sortierung ist unsofern "kein Problem", da dies der Client erledigt.

Das mit dem UDF Match wäre sicher mal ne interessante lösung, brauche zwar dann zwei (einmal varchar und einmal blob)

gibt es irgendwo ein tutorial wie ich die Datenbank von meinem NONE CHARSET in ein vernünftiges (passt dieses ISO8859_1) wandeln kann?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz