MySQL

MySQL provides utf8 encoding for support of international characters. The SQL-92 specification defines nchar (national character) and nvarchar datatypes for Unicode text fields. MySQL does not distinguish between nchar and char, but the national version is recommended to maintain code portability amongst different DBMSes. If you specify the default character set at the server level, you do not need to specify the charset again at the database, table, or column level. Once the MySQL server is configured properly with utf8, programming with Unicode is pretty straight forward conversion between its internal utf8 representation and Java UTF-16 string will be handled automatically. Be sure to designate Unicode string literals with an "N" (for National) prefix.

MySQL cung cấp utf8 encoding cho hỗ trợ ký tự quốc tế. Đặc tả SQL-92 định nghĩa nchar (national character) và nvarchar datatypes cho các Unicode text fields. Tuy MySQL không phân biệt giữa ncharchar, nhưng kiểu national được khuyến khích để duy trì tính code portability giữa các DBMS khác nhau. Nếu bạn đặt default character set ở cấp server, bạn không cần đặt charset lần nữa ở cấp database, table, hoặc column. Một khi MySQL server được cấu hình đúng với utf8, lập trình Unicode sẽ đơn giản hoán chuyển giữa MySQL internal utf8 representation và Java UTF-16 string sẽ được thực thi tự động. Hãy nhớ chỉ định Unicode string literals với "N" (cho National) prefix.

The program example queries test database from MySQL DBMS and displays the resultset on JTable. If you run on Java prior to 1.5 or on Linux, you will need to modify font.properties file (Windows | Linux) to enable display of Vietnamese on standard Swing components.

Chương trình thí dụ query test database từ MySQL DBMS và liệt kết quả ra trên JTable. Nếu bạn chạy trên Java trước 1.5 hay trên Linux, cần modify font.properties file (Windows | Linux) để Tiếng Việt có thể hiển thị đầy đủ trên standard Swing components.

Configuration:

  1. MySQL 4.1.14
  2. MySQL Connector/J 3.1.10 (.jar file copied into <JDK_HOME>/jre/lib/ext and/or <JRE_HOME>/lib/ext)

You can use MySQL Query Browser to view/modify content of MySQL database.

Bạn có thể dùng MySQL Query Browser để view/modify nội dung của MySQL database.

Coffees.java:

import java.sql.*;
import javax.swing.*;
import java.awt.Font;

/**
 * Modify and query MySQL database
 *
 */
public class Coffees {
    public Coffees() {   
        String url = "jdbc:mysql://localhost/test?user=root&password=root&useUnicode=true&characterEncoding=utf8";
               
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(url);
            Statement stmt = con.createStatement();
            
            String createString = "DROP TABLE IF EXISTS Coffees";
            stmt.executeUpdate(createString); 
            
            createString = "CREATE TABLE Coffees (CoffeeName NVARCHAR(32), Price INTEGER, Location NCHAR(20))";
            stmt.executeUpdate(createString);
        
            stmt.executeUpdate("INSERT INTO Coffees VALUES(N'Java Thượng Hạng', 5000, N'Thượng Nguồn')");
            stmt.executeUpdate("INSERT INTO Coffees VALUES(N'Café Trung Nguyễn', 7000, N'Đà Lạt')");            
            stmt.executeUpdate("INSERT INTO Coffees VALUES(N'Ảo Ảnh Cốc', 10000, N'Đắc Lắc')");            
            
            String update = "UPDATE Coffees SET Location=N'Lâm Đồng' WHERE Location=N'Thượng Nguồn'";
            stmt.execute(update);
            
            String query = "SELECT CoffeeName AS 'Thức uống', CONCAT(CAST(Price AS CHAR(8)), N' ₫') AS 'Giá cả', Location AS 'Địa điểm' FROM Coffees";    
            ResultSet rs = stmt.executeQuery(query);
            displayResult(rs, "Thực Đơn");
            
            rs.close();
            stmt.close();
            con.close();      
        } catch(Exception exc) {
            System.err.println(exc.getMessage());
        }
    }
    
    /** 
     * Shows resultset 
     */
    void displayResult(ResultSet rs, String tableName) {
        ResultsModel model = new ResultsModel();     // Create a table model
        model.setResultSet(rs);
        JTable table = new JTable(model);            // Create a table from the model
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);   // Use scrollbars
        Font font = table.getTableHeader().getFont().deriveFont(Font.BOLD);
        table.getTableHeader().setFont(font); // Bold header font
        
        JFrame jf = new JFrame(tableName);
        jf.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jf.setSize(300, 200);
        JTextArea jt = new JTextArea();
        jf.getContentPane().add(new JScrollPane(table));        
        jf.setVisible(true);
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Coffees();
    }
}
ResultsModel.java:
import java.sql.*;
import javax.swing.table.*;

class ResultsModel extends DefaultTableModel {
    public void setResultSet(ResultSet results) {
        try {
            ResultSetMetaData metadata = results.getMetaData();
            int columns =  metadata.getColumnCount();
            
            // Get the column names and set header names
            for(int i = 0; i < columns; i++) {
                addColumn(metadata.getColumnLabel(i+1));
            }
            
            // Get all rows
            while(results.next()) {
                String[] rowData = new String[columns];    // Create array to hold the data
                for(int i = 0; i < columns; i++) {         // For each column
                    rowData[ i ] = results.getString(i+1);   // retrieve the data item
                }
                addRow(rowData);    // Add a row
            }
            fireTableChanged(null);           // Signal the table there is new model data
        } catch (SQLException sqle) {
            System.err.println(sqle.getMessage());
        }
    }
}
Save source files in UTF-8 format to retain Unicode characters, and then execute the following commands:

Lưu mã nguồn trong UTF-8 format để giữ Tiếng Việt Unicode, rồi thực thi các lệnh sau:

javac -encoding utf8 *.java
java Coffees

References: