Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблема с русским языком


Автор: lavan 16.10.2011, 14:33
народ подскажите кто знает!
имею базу данных с значениями полей как на русском так и на англ создавал так
Код

SET character_set_client=cp1251;
SET charachter_set_server=cp1251;
SET character_set_results=cp1251;
...
INSERT INTO TABLES VALUES('engleash text','русский текст');

если работаю через консоль mysql все отображается как надо,а когда подключаюсь через JDBC русский текст отображается кряказябрами  подключаюсь так
Код

Class.forName("com.mysql.jdbc.Driver");
        Properties p=new Properties();
    String url="jdbc:mysql://localhost/adept_system",pas="1234",name="root";
    p.put("user",name);
    p.put("password",pas);
    //p.put("useUnicode", "true");//и использовал и нет
    p.put("charSet","Cp1251");//писал и так "chracterEncoding","Cp1251"
    con=DriverManager.getConnection(url,p);

Делеал нужные установки
Код

st.executeUpdate("set character_set_client=cp1251");
    st.executeUpdate("set character_set_server=cp1251");
    st.executeUpdate("set character_set_results=cp1251");
    st.executeUpdate("set character_set_connection=cp1251");

ничего не помагает,русский язык не отображается
Код

ArrayList<String>tmp=new ArrayList<String>();
      try{
      while(rs.next()){
          int size=rs.getMetaData().getColumnCount();
          for(int i=1;i<size;i++){
              tmp.add(rs.getString(i));//ЗДЕСЬ кряказябры
          }


КАК ЭТО ИСПРАВИТЬ? smile 

Автор: Stolzen 16.10.2011, 15:29
Используйте utf8

Автор: lavan 16.10.2011, 15:33
 smile 

Автор: lavan 17.10.2011, 13:12
Добрался до возврата русских букв,только возвращаются не те буквы которые в базе! все это выполняю в консоли mysql
Код

character_set_database=utf8

для того чтобы заполнить таблицу делаю
Код

SET names cp1251

теперь могу вносить русский текст!и при работе в консоли все работает.
Теперь подключаюсь через JDBC использую драйвер mysql-connector-java-5.1.6-bin.jar
Код

public void dbConnect() throws ClassNotFoundException,SQLException{//подкл к б.д
        Class.forName("com.mysql.jdbc.Driver");
        Properties p=new Properties();
    String url="jdbc:mysql://localhost/adept_system",
            pas="1234",name="root";
    p.put("user",name);
    p.put("password",pas);
    //p.put("useUnicode", "true");//подключал и отключал
    p.put("charSet","Cp1251");//вставлял и utf8
    con=DriverManager.getConnection(url,p);
    }

Настройка для текущего подключения
Код

public void localAdjust()throws SQLException{
    st.executeUpdate("set names 'cp1251'");//заменяет client,server,results
    st.executeUpdate("set character_set_connection=cp1251");
    st.executeUpdate("set collation_connection='cp1251_general_ci'");
}

Теперь здесь 
Код

while(rs.next()){
          int size=rs.getMetaData().getColumnCount();
          for(int i=1;i<=size;i++){
              String s=rs.getString(i);
              String ss=new String(rs.getBytes(i),"Cp1251");
          }

отображаются русские буквы,но я ввел(например) "ячс" а отобразилось "пзб" ЧТО за фигня? smile 

Автор: math64 17.10.2011, 13:46
Будь проще:
Код

    private static final String host = "localhost";
    private static final String database = "database";
    private static final String dbEncoding = "Cp1251";
    private static final String user = "user";
    private static final String password = "password";
    private static final String driver = "com.mysql.jdbc.Driver";
    private static final String url =
            "jdbc:mysql://" + host + "/" + database +
            "?useUnicode=true&characterEncoding=" + dbEncoding;
    private Connection connection;
    {
      try {
        Class.forName(driver).newInstance();
        connection = DriverManager.getConnection(url, user, password);
      } catch (SQLException ex) {
        ex.printStackTrace();
      } catch (Exception ex) {
        ex.printStackTrace();
      }
    }

и больше никакой возни с кодировками - в select все String получаешь с русскими буквами, при insert пишется в 1251.

Автор: lavan 17.10.2011, 14:03
Я простой как три копейки.Только это тоже не работает,опять возвращаются символы русского языка,но только не те,
что лежат в базе.
Не понимаю,когда заполнял строки через консоль,явно указал кодировку
Код

set character_set_client=cp1251

а теперь когда делаю запрос через JDBC полчить нужную строку получилось только так
Код

String sss=new String(rs.getBytes(i),"Cp866");

т.е получается что mysql тупо забил на мое указание кодировки и все положил в его родной Cp866? Либо это как-то связанно с сессиями?

Автор: Pawl 17.10.2011, 20:50
Вот сервлетик с jsp, работающий с mySql, который я как-то делал в учебно-воспитательных целях. Он у меня работал как часы. Надеюсь, тебе это поможет!

Автор: math64 18.10.2011, 07:52
Цитата(lavan @  17.10.2011,  14:03 Найти цитируемый пост)
т.е получается что mysql тупо забил на мое указание кодировки и все положил в его родной Cp866? Либо это как-то связанно с сессиями?

Как ты забивал данные в сервер? Из консоли? А консоль работает в Cp866. И передает серверу в Cp866, который считает, что данные идут в Cp1251 и спокойно складывает из базу без перекодировки. Смени кодировку консоли или правильно настрой сервер (т.е. вероятно кодировку клиента нужно установить в Cp866).
В Яве никаких set character_set_...=cp1251 делать не нужно - кодировки задаются при коннекте.

Добавлено через 1 минуту и 37 секунд
А родная кодировка для mysql - это latin1

Автор: lavan 18.10.2011, 15:44
Цитата

А консоль работает в Cp866

секунду,а если я когда ложил данные в консоли,явно указал кодировку
Код

set character_set_client=cp1251

все равно сохранится в кодировке Cp866?

Автор: math64 18.10.2011, 19:14
Нужно в косоли (до входа в базу) набрать chcp. Она выдаст:
Текущая кодовая страница: 866
Теперь набери chcp 1251, ответ: 
Текущая кодовая страница: 1251
Вот теперь можешь входить в базу и сообщать ей, что у тебя кодировка 1251. А раньше ты обманывал её, говоря что у тебя кодировка 1251, а на самом деле 866.
Но это если работать через консоль.
Если таблицы создавать и записывать с помощью java, нужен только тот код который я привёл выше.
А лучше настроить mysql в файлах конфигурации (по умолчанию mysql работает в кодировке latin1), но для этого нужны права администратора, и что для этого делать не скажу - у меня сейчас mysql не установлена.


Автор: Skipy 19.10.2011, 17:12
lavan, почитайте вот это:

http://www.skipy.ru/technics/encodings.html
http://www.skipy.ru/technics/encodings_webapp.html
http://www.skipy.ru/technics/encodings_console_comp.html

Там про кодировки вообще, работающий пример с MySQL в частности, ну и про консоль есть.

Автор: langzi 19.10.2011, 17:21
Модератор: Сообщение скрыто.

Автор: lavan 19.10.2011, 19:59
Всем спасибо за помощь,буду разбираться

Автор: lavan 20.10.2011, 14:06
Никак не могу въехать smile 
Хорошо с консолью разобрались.Данные хранятся в Cp866.При подключении к б.д из проги я должен указать в какой кодировке у меня там хранятся данные? Т.е эта строка
Код

String url="jdbc:mysql://localhost/mydb"+"?useUnicode=true&characterEncoding=Cp866"

говорит,что данные хранятся в characterEncoding=Cp866 ? и все дальнейшие вызовы getXXX должны правильно декодировать данные.Но реальность показывает что я ошибаюсь
Код

String s=rs.getString(i);//Не возвр строку в нужной кодировке.Декодирование происходит правильно(нет ?) и
//попытки интерпретировать двухбайтовую строку как однобайтовую не происходит

И без этого
Код

st.executeUpdate("set character_set_client=cp1251");
    st.executeUpdate("set character_set_results=cp1251");
............

Тоже не работает

Автор: math64 20.10.2011, 19:02
У тебя консольное приложение или гуи? Как смотришь результаты? Если через System.out.println() то увидишь кракозябры - по той же причине - кодировка консоли 866, а не 1251.
(В отладчике или при выводе в гуи вывод должен быть нормальным, если не нашаманил с настройками - я, например set character_set_... не пользовался).
В jsp тоже можно получить кракозябры - tomcat по умолчанию тоже работает в latin1.

Автор: lavan 20.10.2011, 22:34
Данные в базу заносились напрямую в mysql.А читаю из базы GUI прогой.Данные ложу в ArrayList.На крякозябры проверяю в пошаговой отладке до вывода на экран они не доходят

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)