Şimdi Ara

[Çözüldü] JDBC ile MySQL'den cekilen verilerde Türkçe karakter sorunu

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
8
Cevap
0
Favori
1.082
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
1 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Linux sunucumdaki MySQL veritabanımda Türkçe karakter içeren tablolar var. Mac laptop'taki MySQL-5.1.71 ile komut satırından bağlandığımda ve tabloları görüntülediğimde örneğin SELECT id, isim FROM kullanicilar gibi komut ile, komut satırına tüm Türkçe karakterler doğru geliyor.

    Ancak Java programı içinden JDBC ile bağlanıp aynı vt'deki aynı tabloları cekince Türkçe karakterler bozuk geliyor.
    Kullandığım parametreler:
    quote:


    String param = "useUnicode=true&characterEncoding=utf8&characterSetResults=latin1";
    String param = "useUnicode=yes&characterEncoding=UTF-8";


    Bunun gibi birkaç değişik parametre denedim ancak bana mısın demedi, Türkçe karakterler hep bozuk.

    Mac laptoptaki /etc/my.cnf

    quote:


    [mysqld_safe]
    socket = /tmp/mysql.sock

    [mysqld]
    character-set-server=utf8
    character-sets-dir=/usr/local/mysql/share/charsets

    [client]
    default-character-set=utf8

    [mysql]
    default-character-set=latin1



    < Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 22 Mart 2018; 23:57:43 >
    < Bu ileti mini sürüm kullanılarak atıldı >







  • Linux server uzerinde MySQL in collation i nedir? ( SELECT default_character_set_name FROM information_schema.SCHEMATA
    WHERE schema_name = "schemaname"; )

    Database'de Turkce karakterler duzgun kaydedildiyse eger, JDBC ile connection yaparken dogru encoding parametresi veriyor musun? Ornek: jdbc:mysql://localhost:3306/admin?characterEncoding=utf8

    Son olarak da, Java programi icerisinde kontrolu nasil yapip, String in dogru encode edilmedigi kanaatine variyorsun? Apache Tika kullanarak, mevcut Java String objesinin hangi charset ile encode edildigini gorebilirsin:

    Eger String utf-8 ile encode edilmediyse, fakat MySQL collation utf-8 ise muhtemelen JDBC connection sirasinda bu parametreyi duzgun set etmiyorsun. Linux server'larinda MySQL default olarak utf-8 ile degil Latin ile collate ediyordu schema'lari yanlis hatirlamiyorsam.
    Eger String utf-8 ile encode edilmis ise, muhtemelen database encoding'inde hata var.

    String degerini kontrol ederken, konsola yazdirmak yerine debug edip kontrol edersen, aradan 1 tane layer eksiltmis olursun. Bir de JDBC connection yaptigin kod blogunu ve String'i kontrol ettigin kod blogunu yazarsan daha net anlasilabilir.

    < Bu ileti tablet sürüm kullanılarak atıldı >




  • Mephalay M kullanıcısına yanıt
    Önceki yorumumu sildim, cok uzundu.



    Tika ile 'deki detectCharsetImpl metodunu kullanarak ResultSet 'in karakter setini yokladım ve UTF-8 çıktı. İşin ilginci, jdbc:mysql:// String'indeki characterEncoding ve CharacterSetResults 'ı latin1 yapsam da yine UTF-8 geliyor. Tam emin değilim fakat Linux sunucudaki MySQL'deki veritabanı latin1 diye biliyorum. Yani JDBC'deki ResultSet'i latin1 olacak şekilde ayarlama imkanı olsa Türkçe karakterler belki düzgün gelecek.

    < Bu ileti mini sürüm kullanılarak atıldı >




  • Mephalay M kullanıcısına yanıt
    Az önce Linux sunucuya phpMyAdmin kurup baktım, şunlar cıktı:



    Sunucu Bağlantısı Karşılaştırması: utf8mb4_unicode_ci

    Türkçe kar bozuk gelen tablo: Tip: InnoDB, Karşılaştırma: latin1_swedish_ci



    Aynı vt OSX laptopumda da kurulu:



    Sunucu Bağlantısı Karşılaştırması: Karşılaştırma (Collation)

    sözkonusu tablo: Tip: InnoDB, Karşılaştırma: latin1_swedish_ci (Linux'la aynı)



    Laptop'taki vt'den aynı JDBC kodu ile cekince Türkçe kar bozuk geliyor.



    phpMyAdmin'le girip tablo yanındaki Browse seçeneği ile bakınca phpMyAdmin web sayfasında da JDBC'nin çıktısı ile bire bir aynı şekilde Türkçe kar bozuk cıkıyor.



    Bu durumda sormak istediğim şey şu



    1- Terminal içinden mysql komut satırı ile aynı vt aynı tabloyu sorgulayınca Türkçe kar tamamen doğru gösteriyor. JDBC veya phpMyAdmin ile öyle doğru göstermek imkanı olabilir mi?

    2- Sorunu kökünden halletmek üzere Karşılaştırma: latin1_swedish_ci olan tabloyu, Türkçe kar doğru dönüştürecek şekilde utf8'e dönüştürmek üzere önerebileceğin bir yöntem var mı?

    < Bu ileti mini sürüm kullanılarak atıldı >




  • Evet problem collatation. Linux serverda defaul utf-8 degil MySQL icin ve neden boyle bir karar aldiklarini anlamak pek mumkun degil. Windows ve Mac'te MySQL server kurarsan default schema collation utf-8 mesela.

    Java tarafinda, String icin encoding degistirip deneyebilirsin. Ama bu kulagi ters taraftan gostermek olacak. Kodu denemedim, ezberden yaziyorum ama soyle bir sey:
    byte[] stringBytes = bozukString.getBytes("latin");
    String utf8String = new String(stringBytes,"utf-8");
    Bu 2 satir kod sunu yapiyor:
    1) Elindeki bozuk stringi, encode edildigi protokole gore byte arraye donusturuluyor. Burada "latin" i kafadan salladim, mysql deki collation'in Java tarafindaki charset equivalentini bulup buraya yazmak gerekiyor.
    2) Elindeki raw datayi, utf-8 ile yeniden encode ederek duzeltiyorsun.
    Ben ustteki yontem ile EBCDIC ile encode edilmis ve Cobol ile yazilmis uygulama ile calismayi basarmistim. Puf noktasi ilgili charset'in Java equivalentini bulmak. Ben o zamanlar IBM den bulmustum bunu.

    En kokten cozum de tabi ki elimizde var olan tablonun collation'ini degistirmek olacak. Bunun icin de ( yine ezberden yaziyorum kontrol et lutfen ) soyle bir komut:
    alter database <seninDB> character set <mevcutCharset> collate <utf-8 general ya da turkish_ci >

    Not: Yazdiktan sonra aklima geldi, collation degistirdikten sonra, mevcut tablonun tum string field'larini yeniden encode edip etmeyecegini bilmiyorum. InnoDB bu konuda nasil calisiyor merak ediyorum. Tahminim arkada zaten byte bloklariyla tuttugu icin cevirebilecegi yonunde olsa da, cok buyuk bir dataset icin bu islem uzun da surebilir. Emin olamadim. Her turlu kod tarafinda normalize edip her row icin yeniden update etmek gerekebilir diye dusunmuyor degilim : )



    < Bu mesaj bu kişi tarafından değiştirildi Mephalay -- 22 Mart 2018; 20:57:22 >
    < Bu ileti tablet sürüm kullanılarak atıldı >




  • Mephalay M kullanıcısına yanıt
    Orada önerdiğin 2 satırlık kod ile düzeldi hacı. Kodu şöyle düzenledim:



    byte[] bozuk = null;

    String duzgun = null;



    --ResultSet döngüsü içinde isim = rs.getString("isim") olmak üzere:



    bozuk = isim.getBytes("Cp1252");

    duzgun = new String(bozuk,"utf-8");



    İlk başta 'latin1' yazdım, ü ve ö gibi karakterler düzeldi ancak Türkçeye has olan ğ ş gibi harfler düzelmedi ancak doğru yolda olduğumu anladım ve
    dev.mysql.com
    MySQL :: MySQL Connector/J 5.1 Developer Guide :: 5.6 Using Character Sets and Unicode
    https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-charsets.html
    'de latin1'in Java karşılığı olan Cp1252 deneyince sonunda tüm Türkçe karakterler düzeldi. Şu anda mutluyum.



    Dediğin gibi bu yöntemle uyumsuz tabloların collation'larını değiştirerek Türkçe karakter düzeltmesini tablolarda kalıcı hale getirmek en köklü çözüm ancak onu denemek ve ayarlamak biraz zaman ister, başka bir zamanda belki yaparm. öyle bi durumda büyük ihtimalle Perl'i kullanırım cunku hem değişiklik gereken kısmı bulduk hem de Perl o tür işlemlerde cok pratik.

    < Bu ileti mini sürüm kullanılarak atıldı >




  • Sevindim problemin cozuldugune : ) Kolay gelsin

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • Mephalay M kullanıcısına yanıt
    Türkçe karakterler yanlış çıkan yerde huzur olmaz :|

    < Bu ileti mini sürüm kullanılarak atıldı >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.