[MySQL] RLIKE negeert accenten

Pagina: 1
Acties:

  • Icelus
  • Registratie: Januari 2004
  • Niet online
SQL:
1
SELECT 'e' LIKE 'e', 'é' LIKE 'e', 'é' LIKE 'é'
Dit geeft als resultaat:
code:
1
2
'e' LIKE 'e'   'é' LIKE 'e'   'é' LIKE 'é'
      1              1              1
Met een reguliere expressie:
SQL:
1
SELECT 'e' RLIKE 'e', 'é' RLIKE 'e', 'é' RLIKE 'é'
code:
1
2
'e' RLIKE 'e'   'é' RLIKE 'e'   'é' RLIKE 'é'
      1              0              1
Heb er aan gedacht om alle klinkers door een ‘.’ te vervangen maar dan wordt er teveel gevonden ;)
Weet iemand of het met een RLIKE eenvoudig te bereiken is dat accenten ook worden gevonden?

Gebruik MySQL 4.0.20-Max en kan dit helaas niet veranderen op 't moment.

Developer Accused Of Unreadable Code Refuses To Comment


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Ik snap het niet helemaal, je wilt dus als je zoekt op

hállo

dat de resultaten moeten zijn

hallo en hállo en halló en hálló?

Of wil je juist hebben dat het resultaat alleen
hállo is?

Dan is het toch gewoon een kwestie van kiezen van RLIKE of LIKE?

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Megamind schreef op vrijdag 09 februari 2007 @ 16:45:
Ik snap het niet helemaal, je wilt dus als je zoekt op

hállo

dat de resultaten moeten zijn

hallo en hállo en halló en hálló?

Of wil je juist hebben dat het resultaat alleen
hállo is?

Dan is het toch gewoon een kwestie van kiezen van RLIKE of LIKE?
Als ik zoek op ‘hallo’ moet ook ‘hállo’ gevonden worden.
Ik heb het nu ‘opgelost’ door alle klinkers te vervangen door alle mogelijkheden voor de betreffende klinker dus: h[aáà]ll[oóò] (maar dan uitgebreider).

Developer Accused Of Unreadable Code Refuses To Comment


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Maar dat doet LIKE toch of niet? Je zegt het eigenlijk zelf al:
SELECT 'e' LIKE 'e', 'é' LIKE 'e', 'é' LIKE 'é' resultaat allemaal in true

  • Kuhlie
  • Registratie: December 2002
  • Niet online
Hij wil (waarschijnlijk) reguliere expressies gebruiken, waardoor LIKE niet meer voldoende is, maar hij wil ook dat hallo matcht op hállo.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dit staat vrij expliciet in de manual bij RLIKE:
REGEXP and RLIKE use the current character set when deciding the type of a character. The default is latin1 (cp1252 West European). Warning: These operators are not multi-byte safe.
Verder lijkt het me uberhaupt wel nuttig om te melden welke character set + collation je gebruikt. :)

{signature}


  • Coenos
  • Registratie: Januari 2003
  • Laatst online: 01-12 14:55
Wellicht kun je de zoekstring die een 'apart' teken gebruikt (of meerdere) opsplitsen in meerdere delen. Laten we in dit voorbeeld uitgaan van een apart teken:

zoekstring = hállo
deel[een] = h
deel[twee] = llo
db-veldnaam = automerk

Vervolgens (zelf even vertalen naar SQL) een query uitvoeren als (PSEUDO):

code:
1
2
3
SELECT where strlen(automerk) = strlen(zoekstring)
AND automerk LIKE 'deel[een]%'
AND automerk LIKE '%deel[twee]'


Nooit geprobeerd, maar wellicht kun je ook iets doen als:
where x LIKE 'deel[een]%deel[twee]'

Oftewel, kijk eens naar het gebruik van wildcard mogelijkheden van SQL icm LIKE.

[ Voor 16% gewijzigd door Coenos op 10-02-2007 18:23 ]


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Of je maakt een tabel met al deze tekens en voordat je je resultaat in een query stopt gebruik je str_replace of ereg_replace om é te vervangen door e.

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Kuhlie schreef op zaterdag 10 februari 2007 @ 10:48:
Hij wil (waarschijnlijk) reguliere expressies gebruiken, waardoor LIKE niet meer voldoende is, maar hij wil ook dat hallo matcht op hállo.
Ik wil inderdaad ook gebruik maken van reguliere expressies.

Heb het op dit moment opgelost door de klinkers te vervangen door een reeks mogelijke karakters. Een ‘e’ vervang ik dus bijvoorbeeld door [eëéè].

Misschien dat php ooit nog zaken als [\p{Sc}] en [\p{Alphabetic}] gaat ondersteunen.

Developer Accused Of Unreadable Code Refuses To Comment


  • kroeske
  • Registratie: Mei 2000
  • Laatst online: 05-06 09:27
Icelus schreef op dinsdag 20 februari 2007 @ 12:30:
[...]
Ik wil inderdaad ook gebruik maken van reguliere expressies.

Heb het op dit moment opgelost door de klinkers te vervangen door een reeks mogelijke karakters. Een ‘e’ vervang ik dus bijvoorbeeld door [eëéè].

Misschien dat php ooit nog zaken als [\p{Sc}] en [\p{Alphabetic}] gaat ondersteunen.
makkelijkste manier om dit te omzeilen is denk ik gebruik maken van een dergelijke php functie:

PHP:
1
2
3
4
5
6
7
8
function strip_rare_chars($string)
{
    $raresigns = array ('à' => 'a','á' => 'a','â'=>'a','ã'=>'a','ä'=>'a','å'=>'a','æ'=>'ae','ç'=>'c','è'=>'e','é'=>'e','ê'=>'e','ë'=>'e','ì'=>'i','í'=>'i','î'=>'i','ï'=>'i','ð'=>'o','ñ'=>'n','ò'=>'o','ó'=>'o','ô'=>'o','õ'=>'o','ö'=>'o','ø'=>'o','ù'=>'u','ü'=>'u','ú'=>'u','ÿ'=>'y');
    foreach($raresigns as $val =>$key){
        $string = str_replace($val, $key, $string);
    }
    return $string;
}


zal vast wel een iets snellere manier te bedenken zijn, maar dit heeft bij mij in ieder geval altijd wel voldaan.

  • FoxMan
  • Registratie: September 2000
  • Laatst online: 21-08 20:37
Wat ook wel eens gedaan wordt is een extra column in de database phonetic bijvoorbeeld met alle matches vervangen door een cijfer of ander karakter, bijvoorbeeld hállo wordt h1ll2, hallo ook, hàlló ook enz enz. Deze column kun je dan indexed maken, zodat je er goed op kunt zoeken, de echte column laat je gewoon staan en gebruik je voor de echte data..

LinuxFox, because penguins aren't even furry

Pagina: 1