메뉴 바로가기 검색 및 카테고리 바로가기

한빛미디어

뇌를 자극하는 java 프로그래밍

뇌를 자극하는 java 프로그래밍 질의응답 게시판입니다.

전에 메일로 질문 드렸던 애플릿 데이터베이스 한글 깨지는거 해결 방법 4 파일 올려둘께요

2014-08-10

|

by 질문자

1177

// 질문

import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import java.sql.*;



class SearchActionListener implements ActionListener
{
    JTable table;
    JTextField text;



    SearchActionListener(JTable table, JTextField text)
    {  
        this.table = table;
        this.text = text;
    }

    public void actionPerformed(ActionEvent e)
    {
        String name = text.getText();
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        model.setRowCount(0);
        Connection conn = null;
        Statement stmt = null;
      
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
          
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/malldb", "root", "");

            stmt = conn.createStatement();
          
            // ResultSet rs = stmt.executeQuery("select * from goodsinfo where " + "name like \" + toLatin1(name) + "%;");

            ResultSet rs = stmt.executeQuery("select * from goodsinfo where " + "name like \" + name + "%;");   // toLatin1() 메서드를 삭제한 이 부분을 소스 코드로 사용했었습니다.



            while (rs.next())
            {
                String arr[] = new String[4];
                arr[0] = toUnicode(rs.getString("code"));
                arr[1] = toUnicode(rs.getString("name"));
                arr[2] = toUnicode(rs.getString("price"));
                arr[3] = toUnicode(rs.getString("maker"));
              
                model.addRow(arr);
            }
        }
        catch(ClassNotFoundException cnfe)
        {
            showErrorMessage("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
        }
        catch(SQLException se)
        {
            showErrorMessage("데이터베이스 에러입니다.");
        }
        catch(java.io.UnsupportedEncodingException uee)
        {
            showErrorMessage("지원되지 않는 문자셋입니다.");
        }
        finally
        {
            try
            {
                stmt.close();
            }
            catch(Exception ignored)
            {

            }
          
            try
            {
                conn.close();
            }
            catch(Exception ignored)
            {

            }
        }
    }

    // toUnicode() 메서드도 주석 처리해서 사용했었습니다.    



    private String toUnicode(String str) throws java.io.UnsupportedEncodingException
    {
        return new String(str.getBytes("ISO-8859-1"));
    }
    // toLatin1() 메서드도 주석 처리해서 사용했었습니다.  


    private String toLatin1(String str) throws java.io.UnsupportedEncodingException
    {
        return new String(str.getBytes(), "ISO-8859-1");
    }
  
    private void showErrorMessage(String str)
    {
        JOptionPane.showMessageDialog(text, str, "에러 메시지", JOptionPane.ERROR_MESSAGE);
    }
}






네, 원본 소스 코드를 사용해서 toLatin1() 메서드 존재합니다.













// 답변

SearchActionListener 클래스 안의 다음 행에서 toLatin1 메서드를 호출하도록 고치고,
toLatin1 메서드에서 주석 처리한 부분을 푼 다음에 검색이 되는지 실행해보시겠습니까?

            ResultSet rs = stmt.executeQuery("select * from goodsinfo where "
                                   + "name like \" + toLatin1(name) + "%;");

여기에서 toLatin1 메서드를 호출해야 하는 이유는 자바 프로그램에서 사용한 name 변수 값의 한글 코드와
데이터베이스에 있는 데이터의 한글 코드가 서로 맞지 않기 때문입니다.

다시 말해서 "디지털"이라는 검색어를 사용해서 검색을 하려고 하는데 데이터베이스는 "?ð???Ð" 처럼 깨진 값을 받게 되고
그 값을 이용해서 검색을 시도하게 되는 것입니다. 그렇게 되면 데이터를 제대로 검색할 수 없게 되겠죠.

그러니까 toLatin1 메서드를 제대로 호출하도록 수정한 다음에 검색 기능을 다시 사용해보십시오.
그리고 나서 결과가 제대로 나오는지 그렇지 않은지 답장 주시기 바랍니다.

답장 기다리고 있겠습니다.

김윤명
댓글 입력
자료실