PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy sterownik JDBC Postgres ma sposób na ustawienie client_encoding, aby połączyć się z bazą danych?

Ponieważ Java używa wewnętrznie kodowania UNICODE (UTF-16), użycie client_encoding byłoby nienaturalne różni się od UTF8 w sterowniku PostgreSQL JDBC.

W konsekwencji wymusza client_encoding do tych wartości, patrz org.postgresql.core.v3.ConnectionFactoryImpl.getParametersForStartup :

private List<String[]> getParametersForStartup(String user, String database, Properties info) {
  List<String[]> paramList = new ArrayList<String[]>();
  paramList.add(new String[]{"user", user});
  paramList.add(new String[]{"database", database});
  paramList.add(new String[]{"client_encoding", "UTF8"});
  paramList.add(new String[]{"DateStyle", "ISO"});
  [...]

W rzeczywistości, jeśli kodowanie klienta zostanie zmienione na cokolwiek innego, sterownik JDBC wyraża swoje nieszczęście w jasnych słowach:

public void receiveParameterStatus() throws IOException, SQLException {
  // ParameterStatus
  pgStream.receiveInteger4(); // MESSAGE SIZE
  String name = pgStream.receiveString();
  String value = pgStream.receiveString();

  [...]

  if (name.equals("client_encoding")) {
    if (allowEncodingChanges) {
      if (!value.equalsIgnoreCase("UTF8") && !value.equalsIgnoreCase("UTF-8")) {
        LOGGER.log(Level.FINE,
            "pgjdbc expects client_encoding to be UTF8 for proper operation. Actual encoding is {0}",
            value);
      }
      pgStream.setEncoding(Encoding.getDatabaseEncoding(value));
    } else if (!value.equalsIgnoreCase("UTF8") && !value.equalsIgnoreCase("UTF-8")) {
      close(); // we're screwed now; we can't trust any subsequent string.
      throw new PSQLException(GT.tr(
          "The server''s client_encoding parameter was changed to {0}. The JDBC driver requires client_encoding to be UTF8 for correct operation.",
          value), PSQLState.CONNECTION_FAILURE);

    }
  }

Prawdopodobnie masz problem z konwersją kodowania podczas wczytywania danych do programu Java; spróbuj tam rozwiązać problem.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego dostęp do tablicy PostgreSQL jest znacznie szybszy w C niż w PL/pgSQL?

  2. Czy powinienem określić zarówno INDEX, jak i UNIQUE INDEX?

  3. Łączenie tablic w klauzuli group by

  4. Czy istnieje funkcja, której utworzenie daty w PostgreSQL zajmuje rok, miesiąc i dzień?

  5. PostgreSQL - BŁĄD:data kolumny nie może być rzutowana na wpisanie daty