mysql case insensitive like
Sziasztok!
Van egy gxt mysql adatbázis alapú adatnyilvántartó alkalmazás, melynek fenntartását, fejlesztését végzem. Az adatbázisra hibernate van ráhúzva (java), mely generálja az sqlt. Feltűnt, hogy pár lekérdezés nagyon lassan fut le, és ahogy logolgattam az sql-t, néztem, hogy bizonyos helyeken a LOWER() függvényt alkalmazza a kód (természetesen java -ból meghíva (SimpleExpression valtozo).ignoreCase();). Mivel ha jól tudom függvényre indexet rakni nem tudunk, gondoltam kiveszem, így viszont nem találja meg kisbetűkre a nagybetűket (m M) pedig a mysql doksiban azt írja, hogy a like case insensitive alapból. case-sensitivity
Nos lefuttattam pár tesztet tisztán az adatbázisban:
Az utolsó select azt mutatja, hogy az adott collation igazság szerint case insensitive search -ot kellene hogy adjon, és mégsem. Ám a doksiban az is benne van, hogy ezt rá lehet "erőltetni" oda és viszont, és íme:Nagyon örülnék neki ha ezt valaki meg tudná magyarázni, hogy miért van, és tudok -e valamit csinálni az adatbázissal annak érdekében, hogy ne kelljen a collatet belerakni minden ilyen lekérdezésbe, ha mégsem, akkor persze belerakom, mert még mindig gyorsabb (gondolom) mint a lower()
Köszi és béke:
Gábor
■ Van egy gxt mysql adatbázis alapú adatnyilvántartó alkalmazás, melynek fenntartását, fejlesztését végzem. Az adatbázisra hibernate van ráhúzva (java), mely generálja az sqlt. Feltűnt, hogy pár lekérdezés nagyon lassan fut le, és ahogy logolgattam az sql-t, néztem, hogy bizonyos helyeken a LOWER() függvényt alkalmazza a kód (természetesen java -ból meghíva (SimpleExpression valtozo).ignoreCase();). Mivel ha jól tudom függvényre indexet rakni nem tudunk, gondoltam kiveszem, így viszont nem találja meg kisbetűkre a nagybetűket (m M) pedig a mysql doksiban azt írja, hogy a like case insensitive alapból. case-sensitivity
Nos lefuttattam pár tesztet tisztán az adatbázisban:
mysql> select billing_name from cc_card where billing_name like 'mas%';
Empty set (0,04 sec)
mysql> select billing_name from cc_card where billing_name like 'Mas%';
+------------------+
| billing_name |
+------------------+
| Masa Akárki |
| Masta Borbika |
+------------------+
2 rows in set (0,04 sec)
mysql> select billing_name from cc_card where lower(billing_name) like lower('Mas%');
+------------------+
| billing_name |
+------------------+
| Masa Akárki |
| Masta Borbika |
+------------------+
2 rows in set (0,04 sec)
mysql> select collation(version());
+----------------------+
| collation(version()) |
+----------------------+
| utf8_general_ci |
+----------------------+
1 row in set (0,00 sec)
Az utolsó select azt mutatja, hogy az adott collation igazság szerint case insensitive search -ot kellene hogy adjon, és mégsem. Ám a doksiban az is benne van, hogy ezt rá lehet "erőltetni" oda és viszont, és íme:
mysql> select billing_name from cc_card where billing_name collate utf8_general_ci like 'Mas%';
+------------------+
| billing_name |
+------------------+
| Masa Akárki |
| Masta Borbika |
+------------------+
2 rows in set (0,05 sec)
mysql> select billing_name from cc_card where billing_name collate utf8_general_ci like 'mas%';
+------------------+
| billing_name |
+------------------+
| Masa Akárki |
| Masta Borbika |
+------------------+
2 rows in set (0,05 sec)
Köszi és béke:
Gábor
mező/tábla/adatbázis ?
Lehet, hogy nem jó helyen kapizsgálok, de:
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_collation
A collation megadja az argumentumára vonatkozó információkat, de
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_version
a version mindig utf8-ban adja vissza az értéket!
Nem lehet, hogy a collation-je a mezőknek vagy tábláknak vagy adatbázisnak cs-re van állítva?
De jó lenne ha igaz lenne!
Köszi:
Gábor
Ezt próbáltam:
show
Táblákét így tudod:
Köszi
Kérdés, hogy hogy tudom ezt megváltoztatni?
Próbáltam a
Nagyon nagy öröm lenne ha tudnál rá valami gyógymódot:-)
A phpadmin -ra gondoltam, de még nem raktam fel, biztos lehet ezt valahogy sql-ből is...
Köszi:
Gábor.
szerk
Ime ez működik:
Köszi, ha van más ötleted (tehát hogy ne mezőnként kelljen változtatni a collationt, hanem legalább táblánként...
Üdv:
Gábor
duplicate_key
Úgy emlékszem, ha a mező nem írja felül a tábla collation-jét, akkor a tábláét kapja.
Viszont a gond az, hogy van egy kulcs a tábla egyik mezőjén, hogy csak egyedi értékek kerülhetnek bele. Viszont ha ci lesz a collation, akkor lesz benne duplikált érték, amit a kulcs nem enged (ez a cons_cc_card_username).
Tehát most van benne "Marcsi" és "marcsi" mondjuk. Ez a kettő jelenleg cs-vel különbözőnek számít, de ha ci lesz a mező, akkor azonos lenne. Ezt nem engedi a kulcs.
Renben is van
Minden jót:
Gábor.
nm
Csak hogy tudd
A gxt alkalmazásban a hbm.xml -ekben az oszlopnév pl billing_name konvenció szerint a .java osztályban billingName. És ezzel nincs is baj, a hibernate Criteria api nagyon szépen megoldja ezt a konverziót, egészen addig, míg az sqlRestriction függvényt nem kellett használnunk, hogy belerakjuk a like -os lekérdezésekbe collate utf8_hungarian_ci -t. Innentől kezdve a Filter.getFieldName mivel a billingName -t adta vissza, hibás oszlopként jelent meg az sql-ben... A másik megoldás lett volna, hogy a mapping fájloktól kezdve az egész alkalmazást átírhattam volna billing_name - (és még vagy 30 ilyen nevű oszlop) megfeleltetésekre :-)
Szóval NAGYON köszi!
Üdv:
Gábor.