Kết nối PostgreSQL với Java cho phép in ra các dòng có Tiếng Việt không bị lỗi

Chào anh chị, em mới tìm hiểu về cách kết nối Java với PostgreSQL và đang gặp vấn đề về việc in các dòng có Tiếng Việt ra. Cụ thể như hình bên dưới:


Đáng lẽ kết quả phải in ra Lê Thị Nhật.

package jdbc;
import java.sql.*;
import java.util.Properties;
import java.math.*;
public class Main {
    static final String URL = "jdbc:postgresql://localhost:5432/jdbc?seUnicode=yes&characterEncoding=UTF-8";
    static final String USER = "postgres";
    static final String PASS = "12341234";
    static final String QUERY = "SELECT * FROM account";
    static final String UPDATE_QUERY = "insert into account values('Lê Thị Nhật', '45678')";
    public Main() {
        // TODO Auto-generated constructor stub
    }
    public static void main(String[] args) throws SQLException {
        // start loading driver class
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException ex) {
            System.out.println("Error: unable to load driver class!");
            System.exit(1);
        }
        // finish loading driver class
        // start get connection
        Properties props = new Properties();
        props.setProperty("user", "postgres");
        props.setProperty("password", "12341234");
        Connection conn = null;
        conn = DriverManager.getConnection(URL, props);
        // conn = DriverManager.getConnection(URL, USER, PASS);
        // finish get connection
        // create stmt
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(QUERY);
        while (rs.next()) {
            System.out.print(rs.getString(1) + " " + rs.getString(2) + "\n\n");
           
        }
        // stmt.executeUpdate(UPDATE_QUERY);
        rs.close();
        System.out.println("Closed ResultSet!");
        stmt.close();
        System.out.println("Closed Statement!");
        conn.close();
        System.out.println("Closed connection!");
    }
}

Em đã thử một số cách như ?useUnicode=yes&characterEncoding=UTF-8 ở sau URL nhưng không có kết quả, em có tìm trên mạng nhưng chưa tìm được giải pháp ạ.
Database của em có encoding UTF8 rồi ạ


Trong PgAdmin4 thì nó vẫn hiện đúng Tiếng Việt:
image
Rất mong được anh chị giúp đỡ ạ. Em cảm ơn nhiều!

hàm System.out.println chỉ đọc 8 bit cuối nên chỉ in đúng được ký tự ASCII.
Bạn muốn in ký tự mã hóa kiểu Unicode thì nên dùng PrintWriter

PrintWriter printWriter = new PrintWriter(System.out);
...
printWriter.println(...)

Đọc thêm về ý nghĩa tham số của PrintWriter construtor tại PrintWriter (Java Platform SE 7 ) (oracle.com)

Về cơ bản thì chỉ là cách in ra terminal sao cho hiện ký tự unicode, ko liên quan gì tới PostgreSQL (mình cũng không rõ PostgreSQL là gì).

3 Likes

Đúng rồi ạ, tại em mới học nên chưa tính đến trường hợp này. Em đã thử in ra file text thay vì in ra ở terminal và đã thành công! Em cảm ơn nhiều ạ!

chuỗi Java xài UTF-16 encoding, chuỗi em lấy từ pg là UTF-8, phải decode chuỗi UTF-8 rồi encode thành UTF-16 mới in ra đúng được :V

edit: https://stackoverflow.com/questions/39440363/how-to-encode-a-string-in-utf-8-from-a-resultset-encoded-in-latin1 ở đây bảo là nếu nhận được String thì nó bảo đảm được encode đúng UTF-16 rồi, vấn đề ở connect string sai encoding :V

?seUnicode=yes&characterEncoding=UTF-8 chuỗi này có đúng ko :V hình như phải là useUnicode chứ, thiếu mất chữ u rồi :V

3 Likes

Cái này ai mới sửa mất của e thì phải. Chứ trong code em viết đúng và chạy được.

Còn cái này em có tìm trên mạng thì thấy nó chỉ dùng cho Mysql ạ. PostgreSQL thì em không tìm được ạ

package jdbc;

import java.sql.*;

public class Main3 {

    static final String URL = "jdbc:postgresql://localhost:5432/jdbc?useUnicode=yes&characterEncoding=UTF-8";

    static final String USER = "postgres";

    static final String PASS = "12341234";

    static final String QUERY = "SELECT * FROM account";

    static final String UPDATE_QUERY = "insert into account values('Lê Thị Nhật', '45678')";

    public static void main(String[] args) throws SQLException {

        // start loading driver class

        try {

            Class.forName("org.postgresql.Driver");

        } catch (ClassNotFoundException ex) {

            System.out.println("Error: unable to load driver class!");

            System.exit(1);

        }

        // finish loading driver class

        // start get connection

        Connection conn = null;

        conn = DriverManager.getConnection(URL, USER, PASS);

        // finish get connection

        // create stmt

        Statement stmt = conn.createStatement();

        ResultSet rs = stmt.executeQuery(QUERY);

        while(rs.next()){

            System.out.println(rs.getString(1));

        }

    }

}


Em đã tìm ra giải pháp rồi ạ! Không có lỗi gì ở đây cả. Vấn đề là do terminal nó không hỗ trợ hiển thi tiếng việt

Code Page
VideoYT
Trước khi run file java, mình cần gõ chcp 65001 để terminal hiển thị đc tiếng việt ạ!image

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?