Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Установка кодировки при работе с БД, SET NAMES,  
:(
    Опции темы
initmax
Дата 5.11.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Как задать кодировку после установки соединения с БД
I have the class for connection:

Код

/*
 * Class CreateBaseConnection provide connect to base MySQL
 * 
 */
package MySQL;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author initmax
 */
public class MySQLConnect {

private String url = null;
private String name = null;
private String password = null;

    public MySQLConnect() {
      url = "jdbc:mysql://127.0.0.1:3030/initmax?autoReconnect=true";
      name = "root";
      password = ":Lkf)93450LJfelffnnv><Nf.,mn:LKJfdf><Mn,nfg89o";
    }

    public MySQLConnect(String a_url, String a_name, String a_password){
        url = a_url;
        name = a_name;
        password = a_password;
    }
//***********************************************************************
private Connection CurrentConnect;

//this line need out to txt file

//***********************************************************************
//first need download driver, for work MySQL connect
    public void downloadDriver(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
//            System.out.println("Driver loading success!");
        }
        catch (ClassNotFoundException e){
            e.printStackTrace();
        }
    }

//***********************************************************************
//Connected to MySQL Base use download driver
     public void connected(){
            try {
                CurrentConnect = DriverManager.getConnection(url, name, password);
//                System.out.println("Connected.");
            }

            catch (SQLException e) {
                    e.printStackTrace();
            }
     }      
    
//*********************************************************************
//disconnected base after finish work, get object connect
     public int disConnected() {
         try {
          CurrentConnect.close();
          System.out.println("Disconnected.");
         }
         catch (SQLException e) {
                e.printStackTrace();
         }

         return 0;
      }
//get current connection
      public Connection getConnection() {
          return this.CurrentConnect;
      }
} 
 



Class for set char set and other query 

Код

package MySQL;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.util.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author initmax
 */
public class MySQLQuery {

    private Connection CurrentConnect; //obj for connect to databae
  

    public MySQLQuery() {}

//constructor accept current conection database
    public MySQLQuery(Connection CurrentConnectBase) {
    CurrentConnect = CurrentConnectBase;
    }



    public void setEncoding(String Encoding) {

 //       out.print("MySQLConnectObj.GetConnection() = "+MySQLConnectObj.getConnection());

        try{
         Statement st = CurrentConnect.createStatement();
         String query0 = ("SET NAMES "+Encoding);
          String query1 = ("SET character_set_client = "+Encoding);
           String query2 = ("SET character_set_connection = "+Encoding);
            String query3 = ("SET character_set_database = "+Encoding);
             String query4 = ("SET character_set_results = "+Encoding);
              String query5 = ("SET character_set_server = "+Encoding);
               String query6 = ("SET character_set_system = "+Encoding);

         st.executeQuery(query0);
         st.executeQuery(query1);
         st.executeQuery(query2);
         st.executeQuery(query3);
         st.executeQuery(query4);
         st.executeQuery(query5);
        }

        catch (SQLException e) {
         e.printStackTrace();
        }



    }

//*****************************************************************
//method accept name table and link on List, after work return all info on this table inside List
public List<GenPageMySQL> selectAllField(String NameTable, List<GenPageMySQL> ListPageObj) {
       try {
         Statement st = CurrentConnect.createStatement();
         String query = ("select * from "+NameTable);
         ResultSet resultQuery = null;
         resultQuery = st.executeQuery(query);


//step in cycle after execution query, and create Vector object
           while (resultQuery.next()) {
              GenPageMySQL PageObj = new GenPageMySQL();

              PageObj.setId(resultQuery.getInt("id"));
              PageObj.setTheme(resultQuery.getString("theme"));
              PageObj.setPage(resultQuery.getString("page"));

              ListPageObj.add(PageObj); //add obj in tail vector
           }
       }
       catch (SQLException e) {
         e.printStackTrace();
      }
       return ListPageObj;        
}
    /**
    *@set the CurrentConnect
    */
    public void setConnection(Connection CurrentConnectBase) {
         CurrentConnect = CurrentConnectBase;
    }
}



After connection in start servlet, I set char set my database, executing this method   MySQLQueryObj.setEncoding("utf8");

Код

import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import MySQL.*;

public class indexServlet extends HttpServlet {

    private  String getpage;
    //Connected MySQL
    private MySQLConnect MySQLConnectObj = new MySQLConnect();
    private MySQLQuery MySQLQueryObj = new MySQLQuery();

    public void init() {
          MySQLConnectObj.downloadDriver();
          MySQLConnectObj.connected();
          
          //Use current connection, for execution query
          MySQLQueryObj.setConnection(MySQLConnectObj.getConnection());
          MySQLQueryObj.setEncoding("UTF8");     
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, NullPointerException {

          init();
        

        PrintWriter out = response.getWriter();
       out.print("MySQLConnectObj.GetConnection() = "+MySQLConnectObj.getConnection());

            List<GenPageMySQL> ListPageObj = new ArrayList();
            //get List<RowObject>

            MySQLQueryObj.setEncoding("utf8");
            ListPageObj = MySQLQueryObj.selectAllField("up_menu",ListPageObj);
  
            out.print("!!!!!!!!!--- "+ListPageObj.get(1).getPage());

            MySQLConnectObj.disConnected();
    //        request.setAttribute("upMenu",ListPageObj);
    //        RequestDispatcher Dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/index.jsp");
    //        Dispatcher.forward(request, response);
      }
}


but words in browser printed so
"???????????????????..?????????...?????????..."

if I connect to MySQL server in console, and execute 
SET NAMES UTF8;
text my tables in console printing correctly...

I call in main servlet method 
Код

public void setEncoding(String Encoding)
  why it does not work?
PM MAIL   Вверх
ivanovpv
Дата 5.11.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 2
Всего: 28



На мой взгляд проблема не в кодировке БД, поскольку судя по всему кодировка мускула устанавливается (иначе был бы эксепшн при выполнении запроса).

Проблема в кодировке ответа сервлета. Кодировка ответа сервлета устанавливается либо setContentType() (эквивалентно заданию text/html;charset=...) либо setLocale() или же через setCharacterEncoding() (но перед вызовом response.getWriter())

В любом случае я бы проверил что выдает response.getCharacterEncoding() - он должен совпадать с кодировкой БД.

Ну и последнее установка кодировки собственно БД на лету из сервлета - как то не очень хорошо. Кодировка БД обычно задается при ее создании.


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
initmax
Дата 5.11.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



На лету, задавать кодировку не верно, согласен, это было в качестве тэста. Верно ли задавать кодировку в момент подключения к БД в методе init ?


Код


import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import MySQL.*;

public class indexServlet extends HttpServlet {

    private  String getpage;
    //Connected MySQL
    private MySQLConnect MySQLConnectObj = new MySQLConnect();
    private MySQLQuery MySQLQueryObj = new MySQLQuery();

    public void init() {
          MySQLConnectObj.downloadDriver();
          MySQLConnectObj.connected();
          
          //Use current connection, for execution query
          MySQLQueryObj.setConnection(MySQLConnectObj.getConnection());
          MySQLQueryObj.setEncoding("UTF8werwer");
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, NullPointerException {

        MySQLConnectObj.disConnected();
        init();
        

        PrintWriter out = response.getWriter();

//GET case useer
      getpage = request.getParameter("page");
      out.print("MySQLConnectObj.GetConnection() = "+MySQLConnectObj.getConnection());

//Check curent connect to database
      if(MySQLConnectObj.getConnection() != null) {
          
            List<GenPageMySQL> ListPageObj = new ArrayList();
            //get List<RowObject>


            ListPageObj = MySQLQueryObj.selectAllField("up_menu",ListPageObj);
  

      //     out.print("!!!!!!!!!--- "+ListPageObj.get(0).getPage());

        
            request.setCharacterEncoding("UTF8");
            out.print("char set == "+request.getCharacterEncoding());

            request.setAttribute("upMenu",ListPageObj);
            RequestDispatcher Dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/index.jsp");
            Dispatcher.forward(request, response);
      }
    
}

 out.print("char set == "+request.getCharacterEncoding());
кодировка отображается как UTF8

Когда попытался установить кодировку как    MySQLQueryObj.setEncoding("UTF8werwer");
ислючения не последовалось, как ранее вместо русского отображаются ?????????????????????
исходя из этоно, мне кажется пробелема в методое установки кодировки

Код

  public void setEncoding(String MyEncoding) {

 //       out.print("MySQLConnectObj.GetConnection() = "+MySQLConnectObj.getConnection());

        try{
         Statement st = CurrentConnect.createStatement();
         String query0 = ("SET NAMES "+MyEncoding);
          String query1 = ("SET character_set_client = "+MyEncoding);
           String query2 = ("SET character_set_connection = "+MyEncoding);
            String query3 = ("SET character_set_database = "+MyEncoding);
             String query4 = ("SET character_set_results = "+MyEncoding);
              String query5 = ("SET character_set_server = "+MyEncoding);
               String query6 = ("SET character_set_system = "+MyEncoding);

         st.executeQuery(query0);
         st.executeQuery(query1);
         st.executeQuery(query2);
         st.executeQuery(query3);
         st.executeQuery(query4);
         st.executeQuery(query5);
         st.executeQuery(query6);
        }

        catch (SQLException e) {
         e.printStackTrace();
        }

    }



Но что не так? всё же написано корректно....

Добавлено через 1 секунду
На лету, задавать кодировку не верно, согласен, это было в качестве тэста. Верно ли задавать кодировку в момент подключения к БД в методе init ?


Код


import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import MySQL.*;

public class indexServlet extends HttpServlet {

    private  String getpage;
    //Connected MySQL
    private MySQLConnect MySQLConnectObj = new MySQLConnect();
    private MySQLQuery MySQLQueryObj = new MySQLQuery();

    public void init() {
          MySQLConnectObj.downloadDriver();
          MySQLConnectObj.connected();
          
          //Use current connection, for execution query
          MySQLQueryObj.setConnection(MySQLConnectObj.getConnection());
          MySQLQueryObj.setEncoding("UTF8werwer");
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, NullPointerException {

        MySQLConnectObj.disConnected();
        init();
        

        PrintWriter out = response.getWriter();

//GET case useer
      getpage = request.getParameter("page");
      out.print("MySQLConnectObj.GetConnection() = "+MySQLConnectObj.getConnection());

//Check curent connect to database
      if(MySQLConnectObj.getConnection() != null) {
          
            List<GenPageMySQL> ListPageObj = new ArrayList();
            //get List<RowObject>


            ListPageObj = MySQLQueryObj.selectAllField("up_menu",ListPageObj);
  

      //     out.print("!!!!!!!!!--- "+ListPageObj.get(0).getPage());

        
            request.setCharacterEncoding("UTF8");
            out.print("char set == "+request.getCharacterEncoding());

            request.setAttribute("upMenu",ListPageObj);
            RequestDispatcher Dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/index.jsp");
            Dispatcher.forward(request, response);
      }
    
}

 out.print("char set == "+request.getCharacterEncoding());
кодировка отображается как UTF8

Когда попытался установить кодировку как    MySQLQueryObj.setEncoding("UTF8werwer");
ислючения не последовалось, как ранее вместо русского отображаются ?????????????????????
исходя из этоно, мне кажется пробелема в методое установки кодировки

Код

  public void setEncoding(String MyEncoding) {

 //       out.print("MySQLConnectObj.GetConnection() = "+MySQLConnectObj.getConnection());

        try{
         Statement st = CurrentConnect.createStatement();
         String query0 = ("SET NAMES "+MyEncoding);
          String query1 = ("SET character_set_client = "+MyEncoding);
           String query2 = ("SET character_set_connection = "+MyEncoding);
            String query3 = ("SET character_set_database = "+MyEncoding);
             String query4 = ("SET character_set_results = "+MyEncoding);
              String query5 = ("SET character_set_server = "+MyEncoding);
               String query6 = ("SET character_set_system = "+MyEncoding);

         st.executeQuery(query0);
         st.executeQuery(query1);
         st.executeQuery(query2);
         st.executeQuery(query3);
         st.executeQuery(query4);
         st.executeQuery(query5);
         st.executeQuery(query6);
        }

        catch (SQLException e) {
         e.printStackTrace();
        }

    }



Но что не так? всё же написано корректно....
PM MAIL   Вверх
Bandit
Дата 5.11.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 27.11.2007
Где: Минск

Репутация: нет
Всего: нет



На jsp-ине всё прописано? аля:
Код

 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

в контексте веб контейнера прописано?
аля:

Код

<Connector port="8181" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443"  URIEncoding="UTF-8" />

PM MAIL   Вверх
garbuz
Дата 5.11.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Используйте для кодировки сервлет фильтр, как раз хорошая возможность познакомиться с фальтрами, если конечно еще не знакомы. Суть - мапите все запросы на фильтр, в фильтре выставляете реквесту нужную кодировку.
Если возникнут трудности, пишите. код выложим smile
PM MAIL   Вверх
initmax
Дата 5.11.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Цитата

Используйте для кодировки сервлет фильтр, как раз хорошая возможность познакомиться с фальтрами, если конечно еще не знакомы. Суть - мапите все запросы на фильтр, в фильтре выставляете реквесту нужную кодировку.
Если возникнут трудности, пишите. код выложим 


Про фильтры только слыхал, просто думал не утягощать программу дополнительными классами, поскольку точно знаю в какой кодировке данные в БД

В JSP на который идёт редирект прописан:
Код

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>


на офф сайте SUN посоветовали ещё добавить

Код

 request.setCharacterEncoding("UTF-8");
 response.setContentType("text/html; charset=UTF-8");

но это так же ничего не дало..

У меня подозрение на то что метод установки кодировки в БД не работает корректно

MySQLQueryObj.setEncoding("UTF8werwer"); обратите внимание какую я пытаюсь установить кодировку UTF8werwer
метод отрабатыват, программа не валится....


с какого боку тулить это, не понял.
Код

<Connector port="8181" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443"  URIEncoding="UTF-8" />


З.Ы.
кому интересно что говорят по этому поводу живущие в SUN ходи СЮДА

Это сообщение отредактировал(а) initmax - 5.11.2009, 20:38
PM MAIL   Вверх
initmax
Дата 5.11.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Решил посмотреть какая кодировка устанавливается в БД и написал следующий метод

Код

/**
    *@get Show local variables database
    */
    public String getShowVariables(){
        String StrResultQuery=null;

        try{
            Statement st = CurrentConnect.createStatement();
            String query = ("SHOW WARIABLES");
            ResultSet resultQuery = null;
            resultQuery = st.executeQuery(query);
            StrResultQuery = resultQuery.toString();
            return StrResultQuery;
        }

        catch (SQLException e) {
            e.printStackTrace();
        }

         return null;

    }
}

если данный метод вызываю с main Servlet 
Код

 ListPageObj = MySQLQueryObj.selectAllField("up_menu",ListPageObj);


возврадается null.
У меня вовсе такое впечатление что выполняется только один метод MySQLQueryObj.selectAllField("up_menu",ListPageObj);
а все остальные будь то  MySQLQueryObj.setEncoding("utf8"); или MySQLQueryObj.getShowVariables(); попросту ингнорируются

если вызываю 
PM MAIL   Вверх
initmax
Дата 5.11.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Даже при завдомо ложной ошибке в запросе, например так
Код

 public String getShowVariables(){
        String StrResultQuery=null;

        try{
            Statement st = CurrentConnect.createStatement();
            String query = ("SELECT * SHOW WARIABLES234");
            ResultSet resultQuery = null;
            resultQuery = st.executeQuery(query);
            StrResultQuery = resultQuery.toString();
            return StrResultQuery;
        }

        catch (SQLException e) {
            e.printStackTrace();
        }

         return null;

    }


и при таком вызове в стартовом сервлете 
Код

  String showVar;
            showVar = MySQLQueryObj.getShowVariables();


Исключения не происходит, я уже совсем в шоке...

PM MAIL   Вверх
initmax
Дата 10.11.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Установил NetBeans 6.8 если запускаю его от ROOT, шрифты отображаются корректно.
если с правами обычного пользователя вместо русских ??????? ???????
Странные вещи творятся в нашем королевтве...

Это сообщение отредактировал(а) initmax - 10.11.2009, 12:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.