Witam!
Kolejne pytanie od początkującego fana Javy ;-)
W ramach ćwiczeń napisałem sobie prosty programik w Javie do przenoszenia danych z bazy MS SQL do MySQL. Działa. Ale jedna rzecz mnie zaskoczyła: dane w MS SQL'u są zakodowane w windows-1250 a docelowa baza MySQL jest zakodowana w utf-8. W skrypcie PHP, który przenosił te dane musiałem konwertować dane przy pomocy funkcji iconv() a Java po prostu przeniosła mi te dane (nie konwertowałem ich) i są OK - polskie znaki się nie wywaliły (a przecież powinny). Poniżej podaję kod, aby było wiadomo o czym rozmawiamy.
I tu dwa pytania:
1> jakim cudem zostało to przeniesione poprawnie pomimo, że nie użyłem żadnej funkcji konwertującej? czy może jest po prostu tak, że connector do MS SQLa sam wykrywa kodowanie, a connector MySQL ma wskazane, że ma używać UTF-8 i w związku z tym dane są konwertowane?
2> gdyby zaszła potrzeba konwertowania (np. w innym skrypcie) - czy jest w Javie odpowiednik funkcji iconv()?
import java.sql.*;
public class sqlReplica {
public static void main (String[] args)
{
Connection mssql = null;
String msuser = "sa";
String mspass = "haslo";
String msurl = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=CDN_Optima2005";
Connection mysql = null;
String myuser = "root";
String mypass = "haslo";
String myurl = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
try
{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
mssql = DriverManager.getConnection (msurl, msuser, mspass);
Class.forName("com.mysql.jdbc.Driver").newInstance();
mysql = DriverManager.getConnection (myurl, myuser, mypass);
System.out.println ("Połączenie z bazami nawiązane");
}
catch (Exception e)
{
System.err.println ("Nie mogę się połączyć z bazą: " + e);
}
try
{
String msQuery = "SELECT Twr_TwrId, Twr_Kod, Twr_Nazwa, Twr_Grupa, Twr_Kategoria, Twr_JM, " +
"Twr_Masa, Twr_TwCNumer, Twr_Stawka, CONVERT(VARCHAR(19), Twr_TS_Mod, 120) AS Twr_TS_Mod, " +
"Twr_NieAktywny, TwC_Wartosc, TwC_Waluta, Twc_Typ FROM CDN.Towary, CDN.TwrCeny WHERE " +
"Twr_TwrId = Twc_TwrId AND Twr_TwCNumer = TwC_TwCNumer ORDER BY Twr_TwrId ASC";
Statement msStmt = mssql.createStatement();
ResultSet msrs = msStmt.executeQuery(msQuery);
while (msrs.next()) {
String Twr_TwrId = msrs.getString("Twr_TwrId");
String Twr_Kod = msrs.getString("Twr_Kod");
String Twr_Nazwa = msrs.getString("Twr_Nazwa");
String Twr_Opis = "Lorem ipsum dolor sit amet.";
String Twr_Grupa = msrs.getString("Twr_Grupa");
String Twr_SWW = "123456";
String Twr_EAN = "123456";
String Twr_URL = "http://www.scyzoryk.pl/";
String Twr_JM = msrs.getString("Twr_JM");
String Twr_Masa = msrs.getString("Twr_Masa");
String Twr_TwCNumer = msrs.getString("Twr_TwCNumer");
String Twr_Stawka = msrs.getString("Twr_Stawka");
String Twr_TS_Mod = msrs.getString("Twr_TS_Mod");
String Twr_NieAktywny = msrs.getString("Twr_NieAktywny");
String TwC_Wartosc = msrs.getString("TwC_Wartosc");
String TwC_Waluta = msrs.getString("TwC_Waluta");
String Twc_Typ = msrs.getString("Twc_Typ");
String Twr_Magazyn = "1200";
try
{
PreparedStatement myStmt =
mysql.prepareStatement(
"INSERT INTO `towary` (`id_cdn`, `nazwa`, `opis`, `kod`, `sww`, `ean`, `grupa`, "+
"`jm`, `masa`, `cena_detal`, `cena_hurt`, `cena_promo`, `vat`, `waluta`, `magazyn`, "+
"`url`, `data_mod_ins`, `data_mod_upd`, `data_mod_ewar`, `data_mod_cdn`, `status`) "+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
myStmt.setString(1, Twr_TwrId);
myStmt.setString(2, Twr_Nazwa);
myStmt.setString(3, Twr_Opis);
myStmt.setString(4, Twr_Kod);
myStmt.setString(5, Twr_SWW);
myStmt.setString(6, Twr_EAN);
myStmt.setString(7, Twr_Grupa);
myStmt.setString(8, Twr_JM);
myStmt.setString(9, Twr_Masa);
myStmt.setString(10, TwC_Wartosc);
myStmt.setString(11, TwC_Wartosc);
myStmt.setString(12, TwC_Wartosc);
myStmt.setString(13, Twr_Stawka);
myStmt.setString(14, TwC_Waluta);
myStmt.setString(15, Twr_Magazyn);
myStmt.setString(16, Twr_URL);
myStmt.setString(17, Twr_TS_Mod);
myStmt.setString(18, Twr_TS_Mod);
myStmt.setString(19, Twr_TS_Mod);
myStmt.setString(20, Twr_TS_Mod);
myStmt.setString(21, Twr_NieAktywny);
myStmt.executeUpdate();
}
catch (Exception e)
{
System.err.println ("Nie mogę wykonać zapytania: " + ". "+ e);
}
}
}
catch (Exception e)
{
System.err.println ("Nie mogę wykonać zapytania. "+ e);
}
finally
{
if (mssql != null) // (mysql != null)
{
try
{
mssql.close();
mysql.close();
System.out.println("Połączenia z bazami zakończone");
}
catch (Exception e) {
System.err.println ("Błąd: " + e);
}
}
}
}
}