Abfrage auf Sonderzeichen
Abfrage auf Sonderzeichen
am 11.05.2007 12:03:38 von 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=20
werden, in denen Feld a vom Typ Varchar(20) mindestens 1 Sonderzeichen=20
an beliebiger Position enthält. Sonderzeichen meint in diesem Fall=20
Zeichen mit Dezimalcode > 127.
Vielen Dank im Voraus für sachdienliche Hinweise.
Guido
Re: Abfrage auf Sonderzeichen
am 11.05.2007 12:27:18 von Christian Kirsch
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
am 11.05.2007 13:31:39 von Guido Schmidt
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=
=20
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=20
Dezimalwert > 127 in irgendetwas beliebiges ändert. a hat Zeichensatz=20
latin1. Ich muss noch mal gucken ob ich mit CONVERT() und dem auf dem=20
installierten Datenbankserver verfügbaren Character Sets zu einem=20
Ergebnis komme.
Guido
Re: Abfrage auf Sonderzeichen
am 11.05.2007 13:41:57 von Andreas Kretschmer
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
am 11.05.2007 13:43:29 von 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=
=20
auf? Die Tabelle umfasst einige hunderttausend Datensätze, so dass ich =
nicht so einfach überblicken kann, ob die Abfrage wirklich alle=20
Datensätze mit Zeichen > 127 ausgeworfen hat.
Guido
Re: Abfrage auf Sonderzeichen
am 11.05.2007 14:11:34 von Christian Kirsch
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 11.05.2007 14:13:54 von Joachim Durchholz
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 13.05.2007 14:32:19 von Joachim Zobel
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 13.05.2007 14:40:13 von Joachim Zobel
Am Freitag, den 11.05.2007, 13:43 +0200 schrieb Guido Schmidt:
> Guido Schmidt schrieb:
>=20
> Ich habe jetzt folgendes probiert:
>=20
> SELECT a
> FROM table
> WHERE BINARY a NOT LIKE BINARY CONVERT(a USING cp1256)
>=20
> Das Ergebnis sieht ganz gut aus. Fällt da irgendwem noch ein Denkfehler=
=20
> auf? Die Tabelle umfasst einige hunderttausend Datensätze, so dass ich=20
> nicht so einfach überblicken kann, ob die Abfrage wirklich alle=20
> Datensätze mit Zeichen > 127 ausgeworfen hat.
Du könntest alternativ=20
'' <> TRIM(LEADING "" FROM a)
verwenden. Liefert das das selbe Ergebnis?
Gruß,
Joachim
Re: Abfrage auf Sonderzeichen
am 13.05.2007 15:47:14 von Andreas Kretschmer
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)