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)