MySql, Java - u příkazu INSERT se místo diakritiky zobrazuje "?" – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

MySql, Java - u příkazu INSERT se místo diakritiky zobrazuje "?" – MySQL – Fórum – Programujte.comMySql, Java - u příkazu INSERT se místo diakritiky zobrazuje "?" – MySQL – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
santa58
~ Anonymní uživatel
31 příspěvků
15. 11. 2015   #1
-
0
-

Ahoj, učím se Javu a zkouším udělat takový jednoduchý prográmek na anglické slovíčka, když zadávám slovíčka přímo přes phpMyAdmin vše je v pohodě, ale když to udělám pomocí příkazu INSERT tak se mi např. u slovíčka řeka zobrazí ?eka, aéí atd. funguje spozoroval jsem to jen u ř a ž. Kodování bych měl mít všude utf8_czech_ci. Zatím Díky 

 public void Zapis(String s1, String s2)
    {
        try (Connection spojeni = DriverManager­.getConnection("jdbc:mysql://localhost/db_slovnicek?user=root&password=&useUnicode=yes&characterEn­coding=utf8_czech_ci");
        PreparedStatement dotaz = spojeni.prepareStatement("INSERT INTO slovo (anglicky, cesky) VALUES (?, ?)");) {
        dotaz.setString(1, s1);
        dotaz.setString(2, s2);
            System.out.println(s1 + s2); //U vstupu chyba není..
        int radku = dotaz.executeUpdate();
        System.out.println(radku);
} catch (SQLException ex) {
        System.err.println("Do databáze se nepovedlo zapsat!" + ex);
}
    }
Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:39ba:...–
Reklama
Reklama
Kit+11
Guru
15. 11. 2015   #2
-
0
-

#1 santa58
Zkus před INSERT ještě vpašovat SQL: SET NAMES utf8;

Za try (...) nepatří středník, ale "{".

Nauč se psát kratší řádky, ať nemusíme horizontálně scrollovat. Takové zdrojáky se i lépe čtou.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
15. 11. 2015   #3
-
0
-

Zkusil jsem to ale napsalo mi to chybu:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INSERT INTO slovo (anglicky, cesky) VALUES ('river', '?eka')' at line 1

Celkem mě zmátlo že už v té chybě to píše "?eka".. 

PreparedStatement dotaz = spojeni.prepareStatement("SET NAMES utf8; INSERT INTO slovo (anglicky, cesky) VALUES (?, ?);");) 


Jinak za ty dlouhé řádky se omlouvám ale mi to zase přijde přehlednější, a Děkuju :D

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:b1c5:...–
Kit+11
Guru
15. 11. 2015   #4
-
0
-

#3 santa58
To musí být samostatný dotaz, který určitě nepatří do prepareStatement()

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
15. 11. 2015   #5
-
0
-

A jaký by to tedy měl být příkaz? Zkoušel jsem to hledat al nevím "pod čím" to mám hledat..

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:20d7:...–
Kit+11
Guru
15. 11. 2015   #6
-
0
-

#5 santa58
Stačí v dokumentaci otočit jednu stránku zpět: 

Statement dotaz = spojeni.createStatement();
ResultSet result = dotaz.executeQuery("SET NAMES utf8");
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
15. 11. 2015   #7
-
0
-

Díky, ale bohužel to i tak vypisuje otazníky(?eka) a občas mi to hodilo chybu  

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xEDm' for column 'anglicky' at row 1
Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:20d7:...–
Kit+11
Guru
15. 11. 2015   #8
-
0
-

#7 santa58

Ještě jsem našel jednu radu: Na SET NAMES zapomeň a z toho URL vyhoď tohle: 

"&characterEn­coding=utf8_czech_ci"

Podle oficiální dokumentace to tam nepatří. Tím by se to samo mělo uvést do pořádku. Metody Connection::createStatement() a Statement::executeQuery() se ti budou hodit ještě mnohokrát.

Chtěl jsem si to vyzkoušet, ale vůbec se mi nedaří rozhýbat driver mysql.jar. Jsi tedy momentálně o krok přede mnou. Viz

http://programujte.com/forum/vlakno/30184-problem-s-pristupem-k-databazi-mysql/

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
15. 11. 2015   #9
-
0
-

To jsem tam přidal až potom, jak jsem zase hledal já, byl to jen takový pokus jestli se něco nezmění, nicméně to nefunguje pořád :( Ještě jsem zjistil že velké "Ž" funguje..  :( Asi se budu muset spokojit s tím, že to prostě nejde a vysvětlí mi to někdo až na škole, protože je mi 14 a javu se učím sám protože mně prostě baví a dokážu u toho sedět hodiny... :D

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:20d7:...–
Kit+11
Guru
15. 11. 2015   #10
-
0
-

#9 santa58
Musí to jít. Používají to tisíce programátorů na celém světě. Správně by v tom URL mělo být jen tohle: 

String url = "jdbc:mysql://localhost/db_slovnicek";

a víc nic. Podle dokumentace si Java sama nastaví vše ostatní.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
15. 11. 2015   #11
-
0
-

Ale něaké "username" tam být musí ne? Nebo si to samo nastaví defaultní root?

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:20d7:...–
santa58
~ Anonymní uživatel
31 příspěvků
15. 11. 2015   #12
-
0
-

#11 santa58
nenastaví :(, když jsem to dal bez ?user=root tak mi to hází chybu, a stejně je to bez diakritiky, ale chyba musí být v databázi, protože jsem tento kod viděl na hodně forech jak jsem to hledal, ale zase když to zadám přímo v administraci tak to funguje :(

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:20d7:...–
Kit+11
Guru
15. 11. 2015   #13
-
0
-

#12 santa58
Pokud je to chybně uloženo v databázi, tak s tím už nic moc neuděláš. Musíš postiženou tabulku smazat a vytvořit znovu se správnou znakovou sadou utf8_czech_ci. Do Javy se to však nikde neukládá, je to záležitostí databázového serveru.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
15. 11. 2015   #14
-
0
-

#13 Kit
U tabulky to nastavené mám, už jsem kvůli tomu dělal druhou tabulku kde jsem si na to dal fakt pozor - výsledek je pořád stejný :(

Připojen obrázek.

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:20d7:...–
santa58
~ Anonymní uživatel
31 příspěvků
15. 11. 2015   #15
-
0
-

#14 santa58
Mi nevadí že přijdu o data, téhle chyby jsem si všimnul už dávno jak jsem s aplikací začínal, nyní mám aplikaci zhruba hotovou a tohle je jedna z "menších" chyb které tam jsou.. Jde mi jen o to zjistit, čím by to mohlo být :)

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:20d7:...–
Kit+11
Guru
15. 11. 2015   #16
-
0
-

#15 santa58
Chyba v kódování je velkou chybou, kterou je nutné najít a opravit.

Zkus se ještě podívat, jak to vypadá s daty, které uložíš přes admina a zobrazíš v Javě. Jako testovací string můžeš použít třeba příšerně žluťoučkého koně.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+11
Guru
16. 11. 2015   #17
-
0
-

#15 santa58
Tak jsem vyřešením svého problému mohl začít řešit tvůj problém. Výsledkem je tohle: 

private static final String dbClassName = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost/test" +
    "?useUnicode=true&characterEncoding=UTF-8";
private Connection db;

public JdbcTest() {
    try {
        Class.forName(dbClassName);
        db = DriverManager.getConnection(url, "root", "");
        String sql = "INSERT INTO barva (nazev) VALUES (?)";
        PreparedStatement dotaz = db.prepareStatement(sql);
        dotaz.setString(1, "příšerně žluťoučká barvička");
        dotaz.executeUpdate();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Takže nakonec jsem tam ty parametry do URL dát musel, jen ta hodnota se změnila na "UTF-8". V této podobě mi to ukládá string správně. Zkus to také.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
2547 příspěvků
16. 11. 2015   #18
-
0
-

1. php header() musi byt utf, protoze server default kodovani muze byt treba win1250)
2. mysql (nebo jine sql) SET NAMES musis mit taky utf, protoze mysql default kodovani pro connection nemusi byt utf
3. mysql tabulka collate musi byt utf

INSERT INTO slovo (anglicky, cesky) VALUES ('river', '?eka')' at line 1
Jo, to znamena, ze sql posilas nejakou hatmatilku v nespravnem kodovani.

Jeste muzes udelat to, ze to budes kodovat do base64. Ale pak musis pocitat s delkou sloupce asi o 1/3 vic.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:f42b:97...–
Kit+11
Guru
16. 11. 2015   #19
-
0
-

#18 peter
Pokud sis nevšiml, tak zde neřešíme PHP, ale Javu.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
16. 11. 2015   #20
-
0
-

Díky, vyzkouším to, je štěstí že Java je "objektový" programovací jazyk, protože tohle psát v "neobjektováném" programovacím jatzyce by asi nešlo :D

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:59aa:...–
santa58
~ Anonymní uživatel
31 příspěvků
16. 11. 2015   #21
-
0
-

Jo, funguje to! :D moc Díky :)

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:59aa:...–
Kit+11
Guru
16. 11. 2015   #22
-
0
-

#20 santa58
Jde to samozřejmě i v jiných typech jazyků. Když se na ten můj zápis podíváš pozorně, tak zjistíš, že je napsán částečně funkcionálně. Můžeš si to vyzkoušet napsat i v jazyce Scala, což je funkcionální odnož Javy. Produkuje .class, které můžeš spouštět v JVM stejně, jako kdyby byl napsán v Javě.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
16. 11. 2015   #23
-
0
-

#22 Kit
Učím se podle knížek a tutoriálu a tam žádná zmínka o characterEncoding není(u knížky se není čemu divit - není od českého autora, ale v tom tutoriálu mně to celkem překvapilo).

Tabulku jsem vyprázdnil pomocí TRUNCATE a všechno funguje jak má, takže ještě naposled Díky :)

Ještě bych měl jednu otázku ale na to si založím další příspěvěk.

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:59aa:...–
Kit+11
Guru
16. 11. 2015   #24
-
0
-

#23 santa58
Znalosti je dobré kombinovat. Základy z knížek, podrobnosti z Internetu.

Znakové sady zpravidla bývají pod rozlišovací schopností zejména anglicky píšících autorů. To najdeš jen v českých knížkách nebo třeba když se Francouz ptá na StackOverflow.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
16. 11. 2015   #25
-
0
-

#24 Kit
A máš něakou dobrou knížku na JavaFx?

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:9d0:6...–
Kit+11
Guru
16. 11. 2015   #26
-
0
-

#25 santa58
Javu jsem se učil hlavně od Bruce Eckela: Thinking in Java, ale tam o JavaFX nic není - je hlavně o OOP.

Desktopovými aplikacemi se nezabývám, zajímají mě spíš servery a utility. Když už potřebuji něco desktopového, tak většinou sáhnu po jednodušším jazyce, ve kterém docílím totéž s menším úsilím.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
16. 11. 2015   #27
-
0
-

#26 Kit
Mi java na desktopové aplikace složitá nepřijde(Jaký je teda jednodušší? Jen mně to zajímá), ale třeba nevím jak je event na změnu výběru v comboboxu atd. ale to už je off-topic :D

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:9d0:6...–
Kit+11
Guru
16. 11. 2015   #28
-
0
-
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+11
Guru
16. 11. 2015   #29
-
0
-

#27 santa58
Když jsem třeba dělal utilitku na vaření čaje (po 3 minutách se otevře okno s textem, že je čaj hotov), tak v Tcl/Tk to bylo na 3 řádky a nic se nemuselo kompilovat. Podobného výsledku dosáhneš i v Pythonu.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
santa58
~ Anonymní uživatel
31 příspěvků
16. 11. 2015   #30
-
0
-

#29 Kit
Díky, určitě se na to podívám..

a tak proč je teda Java s C "Sharpem" nejpoužívanější programovací jazyk?

Nahlásit jako SPAM
IP: 2a00:1028:9194:e616:9d0:6...–
Kit+11
Guru
16. 11. 2015   #31
-
0
-

#30 santa58
Výhody jazyků Java a C# se projeví až v rozsáhlejších projektech. To, co je na počátku opruz (silné a statické typování, houští ze složených závorek, složitější syntaxe) se u složitějších aplikací stává výhodou, protože se tím zmenší prostor pro chyby.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý