PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Không thể lưu trữ Euro-sign vào thuộc tính LOB String với Hibernate / PostgreSQL

Sau nhiều lần tìm hiểu về mã nguồn của Hibernate và trình điều khiển PostgreSQL JDBC, tôi đã tìm ra nguyên nhân gốc rễ của vấn đề. Cuối cùng, phương thức write () của BlobOutputStream (được cung cấp bởi trình điều khiển JDBC) được gọi để ghi nội dung của Clob vào cơ sở dữ liệu. Phương thức này trông giống như sau:

public void write(int b) throws java.io.IOException
{
    checkClosed();
    try
    {
        if (bpos >= bsize)
        {
            lo.write(buf);
            bpos = 0;
        }
        buf[bpos++] = (byte)b;
    }
    catch (SQLException se)
    {
        throw new IOException(se.toString());
    }
}

Phương thức này lấy 'int' (32 bit / 4 byte) làm đối số và chuyển nó thành 'byte' (8 bit / 1 byte) làm mất 3 byte thông tin. Các biểu diễn chuỗi trong Java được mã hóa UTF-16, có nghĩa là mỗi ký tự được biểu diễn bằng 16 bit / 2 byte. Dấu Euro có giá trị int 8364. Sau khi chuyển đổi thành byte, giá trị 172 vẫn còn (trong biểu diễn octet 254).

Tôi không chắc bây giờ giải pháp tốt nhất là gì cho vấn đề này. IMHO trình điều khiển JDBC phải chịu trách nhiệm mã hóa / giải mã các ký tự Java UTF-16 thành bất kỳ mã hóa nào mà cơ sở dữ liệu cần. Tuy nhiên, tôi không thấy bất kỳ khả năng điều chỉnh nào trong mã trình điều khiển JDBC để thay đổi hành vi của nó (và tôi không muốn viết và duy trì mã trình điều khiển JDBC của riêng mình).

Do đó, tôi đã mở rộng Hibernate với một ClobType tùy chỉnh và quản lý để chuyển đổi các ký tự UTF-16 thành UTF-8 trước khi ghi vào cơ sở dữ liệu và ngược lại khi truy xuất Clob.

Các giải pháp quá lớn để chỉ dán đơn giản vào câu trả lời này. Nếu bạn quan tâm, hãy gửi cho tôi một dòng, và tôi sẽ gửi cho bạn.

Chúc mừng, Franck




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để lệnh sao chép tiếp tục chạy trong dịch chuyển đỏ ngay cả sau khi hàm lambda khởi xướng nó đã hết thời gian chờ?

  2. PostgreSQL:cách cài đặt tiện ích mở rộng plpythonu

  3. Cách kiểm tra xem một bảng có tồn tại trong một lược đồ nhất định hay không

  4. Lỗi:Không thể tạo TypedQuery cho truy vấn có nhiều trả lại

  5. Postgres COUNT số giá trị cột với INNER JOIN