PDA

View Full Version : emb. SQL und UTF-16



Seiten : 1 [2]

Fuerchau
05-02-09, 13:31
Das Problem beim casten ist die fixe Länge an stelle von VARGRAPHIC bzw. VARCHAR.
Dadurch wird rechstbündig mit Leerzeichen aufgefüllt, die natürlich zum Suchmuster dazugehören.

AUch bei Hostvariablen ist ggf. die Definition varying erforderlich oder im SQL ein trim(: MyHstVar) !

Fuerchau
05-02-09, 13:34
Nachtrag:
Wenn du ohne Hostvars arbeitest und deinen SQL zusammenstrickst, wird das Ganze nur mit invarianten Zeichen in den Konstanten korrekt funktionieren.
Umlaute und andere Sonderzeichen werden Probleme bereiten.

Einzig die Verwendung einer UCS2-Hostvariablen als Parameter wird sicher über alle Sprachgrenzen hinweg funktionieren.

tsh1970
05-02-09, 13:39
okay das wars, vielen Dank :cool:
mit folgenden Select klappts zu voller Zufriedenheit:


select * from MDPROP03
where upper(cast(TITITL as graphic(60) ccsid 1200))
like trim(cast('%TOP%' as graphic(60) ccsid 1200))

Eine Umstellung auf HostVars werde ich nun als nächstes in Angriff nehmen.

Fuerchau
06-02-09, 08:11
Zu beachten ist aus Performancegründen dass Funktionen auf Felder in der Where-Klauses wie UPPER, CAST u.ä. die Verwendung eines Indexes verhindern.

BenderD
06-02-09, 08:21
a) dös is hier Wurscht (like %irgendwas führt eh zum full table scan)
b) wat mutt dat mutt
c) eine halbwegs intelligente Query Engine sollte sich da (hoffentlich) ratz fatz den erforderlichen Zugriffspfad von einem (hoffentlich) vorhandenen Index ableiten können.

D*B


Zu beachten ist aus Performancegründen dass Funktionen auf Felder in der Where-Klauses wie UPPER, CAST u.ä. die Verwendung eines Indexes verhindern.

tsh1970
06-02-09, 08:28
Habe da Programm nun auf Hostvar umgestellt und es funktioniert wunderbar mit Sonderzeichen, Kyrillisch und Chinesisch.
Das einzige was mich etwas erstaunt hat war, das die erste Hostvar nicht mit LIKE verwendet werden darf.
Sondern das z.B. erst ein direkter Vergleich mit einem Tabelleninhalt erfolgen muss und dann das Like mit HostVar folgen darf.
Warum auch immer? Es funktioniert jetzt wie gewünscht.

Vielen Dank für eure Hilfe.

Fuerchau
06-02-09, 08:41
Like mit Hostvar verwende ich regelmäßig.
Dazu 2 Varianten:

D MyLikeVar s 100 varying
D My2LikeVar s 100

MyLikeVar = '%' + %trim(Irgendwas) + '%';
// direkte Verwendung in Like möglich
exec sql
declare MyCursor Cursor for
select ....
where Field like : MyHostVar;

My2LikeVar = '%' + %trim(Irgendwas) + '%';
// hier stehen Leerzeichen am Ende
exec sql
declare MyCursor Cursor for
select ....
where Field like trim(: My2HostVar);

B.Hauser
06-02-09, 10:44
Hier noch eine 3. Variante:

Es ist völlig egal, ob die Hostvariable fixe oder variable Länge hat oder ob am Anfang oder Ende noch irgendwelche *Blanks rumstehen. Achso und die Prozentzeichen muss man auch nicht in den String reinpfriemeln.


exec sql
declare MyCursor Cursor for
select ....
where Field like '%' concat Trim(:HostVar) concat '%';

Birgitta