Java, přístup k MySQL a čeština

Arthur

  • ***
  • 168
    • Zobrazit profil
    • E-mail
Java, přístup k MySQL a čeština
« kdy: 22. 11. 2012, 11:08:46 »
zdravím,

udělal jsem si v jave jednoduchého klienta pro přístup k mysql databázi.  Všechno ok, až na to, že nejsem schopen zapisovat některé znaky s diakritikou (konkrétně [ě č ř ů]). V databázi se z nich stanou otazníky.

Zkoušel jsem nastavit:

character set dané tabulky 
set names <charset>
nastavení kódování při připojení  jdbc:mysql://...&useUnicode=<neco>&characterEncoding=<neco>

vyzkoušel jsem snad všechny permutace utf-8, Unicode, cp1250, iso8859-2  atd.  Buď to vyrobí otazník nebo to rovnou napíše chybu, při zápisu daného znaku.  Přitom do databáze není problém zapsat cokoliv jakkoliv z klienta, PHP apod.

Funguje to stejně blbě pro MySQL server 5.1 Linux i 4.0 Win, pro java-klienta z linuxu i z win.

Nedá se ještě někde něco nastavit nebo co dělám blbě ?  Používám oficiální JDBC connector z MySQL.
« Poslední změna: 22. 11. 2012, 11:46:48 od Petr Krčmář »


Náhodný kolemjdoucí

Re:java mysql a čeština
« Odpověď #1 kdy: 22. 11. 2012, 11:27:22 »
zdravím,

udělal jsem si v jave jednoduchého klienta pro přístup k mysql databázi.  Všechno ok, až na to, že nejsem schopen zapisovat některé znaky s diakritikou (konkrétně [ě č ř ů]). V databázi se z nich stanou otazníky.

Zkoušel jsem nastavit:

character set dané tabulky 
set names <charset>
nastavení kódování při připojení  jdbc:mysql://...&useUnicode=<neco>&characterEncoding=<neco>

vyzkoušel jsem snad všechny permutace utf-8, Unicode, cp1250, iso8859-2  atd.  Buď to vyrobí otazník nebo to rovnou napíše chybu, při zápisu daného znaku.  Přitom do databáze není problém zapsat cokoliv jakkoliv z klienta, PHP apod.

Funguje to stejně blbě pro MySQL server 5.1 Linux i 4.0 Win, pro java-klienta z linuxu i z win.

Nedá se ještě někde něco nastavit nebo co dělám blbě ?  Používám oficiální JDBC connector z MySQL.

A jste si jistý že máte dobře to kódování v Javě? Tedy obsahuje ten zdrojový String který posíláte do databáze to co má obsahovat (String v Javě je vždy UTF-16)?

Arthur

  • ***
  • 168
    • Zobrazit profil
    • E-mail
Re:Java, přístup k MySQL a čeština
« Odpověď #2 kdy: 22. 11. 2012, 16:26:31 »
A jak můžu zjistit, ověřit či jinak manipulovat se Stringem, když je jen a pouze v UTF-16 a zobrazuje se mi dobře ?  Dokonce když načtu data, která jsou v DB v pořádku (a v pořádku je zobrazím), tak ten samý String poslaný do DB udělá otazníky. 

V manuálu k JDBC connectoru se píše, že konverze se provádí automaticky z Javovského Stringu do kódování dle klienta atd, a všechno by mělo jít nastavit skrz parametry.  Co jsem googloval tak všechna řešení tohoto problému jsou jen skrze správné nastavení parametrů.  Jenomže já už nevím co dál nastavovat ...

Dá se tedy nějak řešit to kódování přímo v Javě ?

DK

Re:Java, přístup k MySQL a čeština
« Odpověď #3 kdy: 22. 11. 2012, 16:42:28 »
vyhod odtama vsechno nastaveni kodovani, nekde v tom budes mit botu, ted jsem to otestoval a funguje mi to nativne bez problemu

Arthur

  • ***
  • 168
    • Zobrazit profil
    • E-mail
Re:Java, přístup k MySQL a čeština
« Odpověď #4 kdy: 22. 11. 2012, 17:46:36 »
už jsem to zkoušel opakovaně načisto znovu - čistý program na 5 řádků + úplně nová tabulka, všechno v defaultu a chová se to stejně.

jakou máš verzi javy, mysql a všeho okolo ?  můžeš prosím zaslat zdroják svého testu  ?


Arthur

  • ***
  • 168
    • Zobrazit profil
    • E-mail
Re:Java, přístup k MySQL a čeština
« Odpověď #5 kdy: 23. 11. 2012, 11:25:27 »
tak vyřešeno:   problém byl v jiném nastavení kódování sloupečků v tabulce.  Nedošlo mi, že když vytvořím tabulku a změním její kódování, tak se to neprojeví ve sloupečcích ...

Dzefri

Re:Java, přístup k MySQL a čeština
« Odpověď #6 kdy: 10. 03. 2013, 13:52:52 »
Hmm akoze si vytvril stlpce nanovo ?

Re:Java, přístup k MySQL a čeština
« Odpověď #7 kdy: 10. 03. 2013, 22:00:13 »
Hlavně berte na vědomí, že klientská aplikace by měla vždy říct, jaké vyžaduje kódování.
Stejně tak by mělo být nadefinované i ve struktuře, protože MySQL podporuje transparentní reenkódování za běhu.
Každá tabulka může mít jiné kódování, které se ukládá v konfiguraci a klient si tedy řekne co chce.
Tzn. tabulka může mít klidně Win1250 a klient obdrží UTF-8 pokud si o něj řekne - nenastavení kódování má většinou
fatální následky a nakrklého uživatele, který hází špínu na systém...
Je to mnohem flexibilnější než třeba Oracle.
„Řemeslo se naučí každý. Umění nikdo.“
„Jednoduchost je nejvyšší úroveň sofistikovanosti.“
- Leonardo Da Vinci

Re:Java, přístup k MySQL a čeština
« Odpověď #8 kdy: 10. 03. 2013, 22:08:50 »
tak vyřešeno:   problém byl v jiném nastavení kódování sloupečků v tabulce.  Nedošlo mi, že když vytvořím tabulku a změním její kódování, tak se to neprojeví ve sloupečcích ...

Pořád to zní divně, nezáleží na tom, v jakém kódování jsou data v databázi - je to naprosto jedno.
1) storage v DB má nějaké kódování - musí být nadefinované správně (nejlépe utf-8)
2) klient má nějaké kódování a taktéž musí být definováno správně (cokoliv co si klient řekne)

Teoreticky může dojít k průšvihu, kdy uživatel např. má v DB ISO8859-2, klient má ISO8859-2 a cpe tam UTF-8
což sice na první pohled funguje, ale je to naprosto špatně. Netřídí to, občas to něco uřízne atd...
„Řemeslo se naučí každý. Umění nikdo.“
„Jednoduchost je nejvyšší úroveň sofistikovanosti.“
- Leonardo Da Vinci

Arthur

  • ***
  • 168
    • Zobrazit profil
    • E-mail
Re:Java, přístup k MySQL a čeština
« Odpověď #9 kdy: 11. 03. 2013, 21:44:44 »
vzhledem k dobe pred 5-ti mesici si uz nevybavuju vsechny detaily, ale myslim ze situace je vcelku jednoducha:

podstatne pro ukladani dat je kodovani sloupecku
sloupecek se nakoduje bud manualne nebo defaultne podle kodovani tabulky
tabulka se nakoduje bud manualne nebo defaultne podle kodovani DB
DB se nakoduje bud manualne nebo defaultne podle kodovani serveru
server se nakoduje bud v konfiguraci nebo ma defaultne latin1

takze se jedna v podstate o jakousi hierarchii defaultnich kodovani z vrchu dolu, s tim ze nejdulezitejsi je posledni clanek - sloupecek.  Rozhodne si ale nemyslim, ze na kodovani v databazi nezalezi.  Pokud tam je (casto defaultne) latin1 a nacpu tam CZ znaky, tak se to zmrsi a zadnym nastavenim klienta to nespravim (ty znaky jsou zdevastovane uz v DB).