Abfrage auf Sonderzeichen
Hallo,
mir fällt gerade keine effiziente Lösung für folgendes Problem ein:=
Aus einer MySQL5.0-Datenbanktabelle sollen alle Datensätze ausgelesen
werden, in denen Feld a vom Typ Varchar(20) mindestens 1 Sonderzeichen
an beliebiger Position enthält. Sonderzeichen meint in diesem Fall
Zeichen mit Dezimalcode > 127.
Vielen Dank im Voraus für sachdienliche Hinweise.
Guido
Re: Abfrage auf Sonderzeichen
Am 11.05.2007 12:03 schrieb Guido Schmidt:
> Hallo,
>
> mir fällt gerade keine effiziente Lösung für folgendes Problem ein:
>
> Aus einer MySQL5.0-Datenbanktabelle sollen alle Datensätze ausgelesen
> werden, in denen Feld a vom Typ Varchar(20) mindestens 1 Sonderzeichen
> an beliebiger Position enthält. Sonderzeichen meint in diesem Fall
> Zeichen mit Dezimalcode > 127.
>
eine effiziente Lösung dürfte es wohl auch nicht geben - Du suchst ja
nach einer Variante von LIKE '%ü%';
Möglicherweise hilft Dir REGEX weiter mit einem Match auf eine
geeignete Character-Klasse. Aber auch das kann keinen Index benutzen,
braucht also einen Fulltable-Scan und muss sich jedes Datenfeld einmal
angucken. U.U. ist da sed oder einer seiner Verwandten auf dem Dump
der Tabelle schneller.
Re: Abfrage auf Sonderzeichen
Christian Kirsch schrieb:
Danke für die Antwort.
> eine effiziente Lösung dürfte es wohl auch nicht geben - Du suchst =
ja
> nach einer Variante von LIKE '%ü%';
Ich hatte als "eleganten" Umweg noch sinngemäß etwas wie das folgende=
SQL in Erwägung gezogen.
SELECT a FROM table
WHERE a NOT LIKE UMKODIERT(a)
UMKODIERT() muss dann eine Funktion sein, die alle Zeichen mit
Dezimalwert > 127 in irgendetwas beliebiges ändert. a hat Zeichensatz
latin1. Ich muss noch mal gucken ob ich mit CONVERT() und dem auf dem
installierten Datenbankserver verfügbaren Character Sets zu einem
Ergebnis komme.
Guido
Re: Abfrage auf Sonderzeichen
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: Abfrage auf Sonderzeichen
Guido Schmidt schrieb:
Ich habe jetzt folgendes probiert:
SELECT a
FROM table
WHERE BINARY a NOT LIKE BINARY CONVERT(a USING cp1256)
Das Ergebnis sieht ganz gut aus. Fällt da irgendwem noch ein Denkfehler=
auf? Die Tabelle umfasst einige hunderttausend Datensätze, so dass ich =
nicht so einfach überblicken kann, ob die Abfrage wirklich alle
Datensätze mit Zeichen > 127 ausgeworfen hat.
Guido
Re: Abfrage auf Sonderzeichen
Guido Schmidt schrieb:
> Die Tabelle umfasst einige hunderttausend Datensätze, so dass ich
> nicht so einfach überblicken kann, ob die Abfrage wirklich alle
> Datensätze mit Zeichen > 127 ausgeworfen hat.
Hau ein paar Testdatensätze rein, die jeweils ein relevantes
Sonderzeichen enthalten. Notfalls richtest Du eine Testtabelle ein (aber
dann achte darauf, dass die Zeichensatzeinstellungen für Test- und
Produktivtabelle auch die gleichen sind).
Grüße
Jo
Re: Abfrage auf Sonderzeichen
Am 11.05.2007 13:41 schrieb Andreas Kretschmer:
> begin Christian Kirsch schrieb:
>> Möglicherweise hilft Dir REGEX weiter mit einem Match auf eine
>> geeignete Character-Klasse. Aber auch das kann keinen Index benutzen,
>> braucht also einen Fulltable-Scan und muss sich jedes Datenfeld einmal
>> angucken. U.U. ist da sed oder einer seiner Verwandten auf dem Dump
>> der Tabelle schneller.
>
> Kann MySQL funktionale Indexe?
AFAIK: nein.
Re: Abfrage auf Sonderzeichen
Am Freitag, den 11.05.2007, 13:41 +0200 schrieb Andreas Kretschmer:
> Kann MySQL funktionale Indexe?
Nach der Fausregel Oracleversion - 2 ist in MySQL 6.1 mit function based
Indexes zu rechnen.
Gruß,
Joachim
Re: Abfrage auf Sonderzeichen
Am Freitag, den 11.05.2007, 13:43 +0200 schrieb Guido Schmidt:
> Guido Schmidt schrieb:
>
> Ich habe jetzt folgendes probiert:
>
> SELECT a
> FROM table
> WHERE BINARY a NOT LIKE BINARY CONVERT(a USING cp1256)
>
> Das Ergebnis sieht ganz gut aus. Fällt da irgendwem noch ein Denkfehler=
> auf? Die Tabelle umfasst einige hunderttausend Datensätze, so dass ich
> nicht so einfach überblicken kann, ob die Abfrage wirklich alle
> Datensätze mit Zeichen > 127 ausgeworfen hat.
Du könntest alternativ
'' <> TRIM(LEADING "<alle ascii-Zeichen>" FROM a)
verwenden. Liefert das das selbe Ergebnis?
Gruß,
Joachim
Re: Abfrage auf Sonderzeichen
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)