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
Guido Schmidt [ Fr, 11 Mai 2007 12:03 ] [ ID #1709752 ]

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.
Christian Kirsch [ Fr, 11 Mai 2007 12:27 ] [ ID #1709755 ]

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
Guido Schmidt [ Fr, 11 Mai 2007 13:31 ] [ ID #1709758 ]

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
Andreas Kretschmer [ Fr, 11 Mai 2007 13:41 ] [ ID #1709759 ]

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
Guido Schmidt [ Fr, 11 Mai 2007 13:43 ] [ ID #1709760 ]

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
Joachim Durchholz [ Fr, 11 Mai 2007 14:13 ] [ ID #1709762 ]

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.
Christian Kirsch [ Fr, 11 Mai 2007 14:11 ] [ ID #1709763 ]

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
Joachim Zobel [ So, 13 Mai 2007 14:32 ] [ ID #1711098 ]

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
Joachim Zobel [ So, 13 Mai 2007 14:40 ] [ ID #1711099 ]

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)
Andreas Kretschmer [ So, 13 Mai 2007 15:47 ] [ ID #1711100 ]
Datenbanken » de.comp.datenbanken.mysql » Abfrage auf Sonderzeichen

Vorheriges Thema: query_cache... mit Festplatte statt RAM
Nächstes Thema: INSERT INTO foo VALUES(0,...