Portál AbcLinuxu, 7. května 2025 05:17
Kuriozně teď oznamuji něco, co vlastně nefunguje. Ale třeba mi to pomůžete rozchodit .
Na seznamu se mi líbi hledání ve slovníku. Zadám pár písmen a objeví se mi seznam možných výrazů. Vím, nápad pochází od google, ale ten to v praxi nepoužívá na svých hlavních stránkách. Chtěl jsem tedy napsat něco podobného.
Vytvořil jsem si tabulku se seznamem hledaných řetězců včetně počtu hledání a naplnil jsem ji z logů. Našel jsem knihovnu suggest, která za mně udělá JS hrátky. Napsal jsem si krátký servlet, který vrací data začínající stejným textem seřazená dle počtu hledání. Doma mi to funguje slušně (knihovna má pár chyb, například tlačítko za vstupním políčkem se posune na nový řádek nebo formulář nejde odeslat klávesou enter). To vše bych do beta provozu překousl, jenže na serveru to nejede. Každé hledání (i ascii textu) skončí chybou:
Illegal mix of collations (latin2_general_ci,IMPLICIT) and (utf8_ge
neral_ci,COERCIBLE) for operation 'like'
Doma mi to nedělá, jen pro utf znaky v souborech s latin2 kodování. Na serveru mi to lítá pokaždé. Už bych to rád vyřešil, podobný problém bývá občas i ve variantách softwaru pro znaky s diakritikou. Zkoumal jsem pochopitelně dokumentaci k MySQL, ale nevyznám se v tom. Nějak nepočítají s nožností, že neporovnávám dvě tabulky, ale tabulku s příkazem přes JDBC ovladač.
Update: dostal jsem odpověď od autora Suggest, že jej přestal podporovat. Takže teď se musím rozhodnout, že buď jej zkusím opravit sám (nesnáším JS), nebo budu hledat jinou knihovnu. Je to pech, ta knihovnička je sympaticky malá a jednoduchá, narozdíl třeba od Yahoo UI Library.
Tiskni
Sdílej:
MySQL
se pokoušíš porovnat UTF-8
a Latin2
stringy. Jestli se nepletu, tak databáze Abíčka je v Latin2, ale v parametrech JDBC spojení je useUnicode=true
, takže tam se řetězec pravděpodobně předává v UTF-8.
Problém bude zřejmě v tom, na jakém charset se server s JDBC ovladačem "dohodnou" - asi to není Latin2, ale UTF-8. Možná by pomohlo jako parametr JDBC URL nastavit characterEncoding=ISO8859_2
.
jdbc:mysql://…/devel?characterEncoding=ISO8859_2&mysqlEncoding=latin2
SHOW VARIABLES; | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin2 | | character_set_results | latin1 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | | collation_connection | latin1_swedish_ci | | collation_database | latin2_bin | | collation_server | utf8_general_ci | SHOW CHARACTER SET;
Je třeba dát MySQL na vědomí, aby s vámi komunikovala v daném kódování. To vůbec nesouvisí s tím, v jakém kódování jsou data v databázi uložena. Asi nejsnazší je do /etc/mysql/my.cnf
přidat něco jako
[client] default-character-encoding=latin2Jeden drobný háček zrovna tohoto řešení je: všechny klientské programy MySQL by měly načítat konfiguraci ze sekce
client
(kromě toho samozřejmě i ze sekce určené jenom pro ně, třeba pro řádkového klienta mysql je to sekce mysql
) a když najdou volbu, kterou neznají, považovat to za chybu. A takový mysqlbinlog si zrovna s default-character-encoding
neporadí set names latin2
, ten dělá totéž. Pro aktuální spojení.
default-character-set=latin2
…
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.