webForumDet fria alternativet

strtoupper()

9 svar · 1 616 visningar · startad av drew

drewMedlem sedan mars 2007748 inlägg
#1

Jag har detta i ett skript

$keywords = strtoupper($search_keywords);
$sql .= ' AND UPPER(p.message_text) REGEXP "[[:<:]](' . $keywords . ')[[:>:]]"';

Om jag söker på älsklingen som jag vet finns i texten så hittas det inte.

Om jag ändrar till

$keywords = $search_keywords;
$sql .= ' AND p.message_text REGEXP "[[:<:]](' . $keywords . ')[[:>:]]"';

så hittas dom. Det är samma med allt som innehåller åäö

Tanken är att sökningen inte ska skilja på stora och små bokstäver.

Fältet i databasen är mediumtext, utf8_bin. åäö visas som dom ska på alla sidor.

Det jag undrar är dels om det är php eller MySQL som inte klarar att göra om ä till Ä? Och dels vad ska jag göra för att det ska bli rätt?

drewMedlem sedan mars 2007748 inlägg
#2

Jag har meddelanden innehållande både Älsklingen och älsklingen.

Vid en sökning på älsklingen så hittas ingen. Men om jag söker på Älsklingen så hittas alla.

Detta är alltså med den version där alla tecken görs om till stora.

Det enklaste och bästa för att klara åäö och andra bokstäver utanför a-z både som stora och små. Och samtidigt vara någorlunda kompatibel med andra databaser än MySQL är nog att läsa in alla meddelanden som är aktuella enligt user_id och sen sköta sorteringen i php. Kanske.

MeleaMedlem sedan juli 20032 667 inlägg
#3

strtoupper() tar inte hänsyn till åäö, enklast är att göra

$match    = array('å', 'ä', 'ö');
$replace  = array('Å', 'Ä', 'Ö');

$keywords = str_replace($match, $replace, strtolower($search_keywords));
drewMedlem sedan mars 2007748 inlägg
#4

strtolower() borde ju inte behövas om man ska göra alla tecken stora.

Melea skrev:

$keywords = str_replace($match, $replace, strtolower($search_keywords));

Jag testade både med strtolower() och utan. Det fungerade inte. Däremot fungerade att inte låta php hantera det alls.

$sql .= ' AND UPPER(p.message_text) REGEXP UPPER("[[:<:]](' . $keywords . ')[[:>:]]")';
MeleaMedlem sedan juli 20032 667 inlägg
#5

Menade självklart strtoupper(), men det har mao löst sig?

drewMedlem sedan mars 2007748 inlägg
#6

Ja, det verkar som att det fungerar. Tack för hjälpen.

effataMedlem sedan apr. 2008141 inlägg
#7

Vad har du för collate på tabellen? Mysql REGEXP ska inte vara case sensitive utom för collate _cs.
Rätt lösning borde vara att konvertera till en case-insensitive collate. Om du testat phpmyadmin så är det så dom gör vid sina sökningar.

REGEXP CONVERT( _utf8 'sträng'
USING latin1 )
COLLATE latin1_swedish_ci
drewMedlem sedan mars 2007748 inlägg
#8

Enligt MySQL's egen sida så är sökningar i binära fält alltid case sensitive.

Och exakt det där testade jag, men fick inga träffar alls.

colioneMedlem sedan juni 20013 386 inlägg
#9

Varför har du valt utf8-bin? I princip alla binära textjämförelser är skiftlägesknslig. Varför inte använda en som inte är det som är mer vanligt att använda på text? Typ utf8_general_ci, utf8_swedish_ci eller utf8_unicode_ci?

drewMedlem sedan mars 2007748 inlägg
#10

Det är inte jag som valt. Men tanken är nog att det ska fungera likadant oavsett språk.

Genererad på 390 ms · cache AV · v20260730165559-full.f96bc7eb