Java JDBC中Postgresql消息的错误编码

Java JDBC中Postgresql消息的错误编码,java,postgresql,jdbc,encoding,Java,Postgresql,Jdbc,Encoding,我有一个用Java编写的应用程序,它连接到Postgresql 9.3数据库 我连接的数据库是用UTF-8编码创建的 安装数据库的服务器的区域设置为es-uy.UTF-8 从应用程序(在Tomcat 7中运行的web应用程序)提交的所有信息也都在UTF-8中 除JDBC异常消息外,所有操作都根据编码设置进行。如果我尝试使用错误的密码连接到数据库,我会得到: org.postgresql.util.PSQLException: FATAL: la autentificaci��n password

我有一个用Java编写的应用程序,它连接到Postgresql 9.3数据库

  • 我连接的数据库是用UTF-8编码创建的
  • 安装数据库的服务器的区域设置为es-uy.UTF-8
  • 从应用程序(在Tomcat 7中运行的web应用程序)提交的所有信息也都在UTF-8中
  • 除JDBC异常消息外,所有操作都根据编码设置进行。如果我尝试使用错误的密码连接到数据库,我会得到:

    org.postgresql.util.PSQLException: FATAL: la autentificaci��n password fall�� para el usuario ��postgres��
    
    如果我从psql或pgadmin尝试相同的方法,我会得到编码正确的消息:

    psql: FATAL:  la autentificación password falló para el usuario «postgres»
    

    这里出了什么问题?

    看起来PgJDBC在经过身份验证和连接后设置客户端编码,而不是在协议启动数据包中。因此,服务器不知道PgJDBC期望的编码并使用其默认编码,但PgJDBC必须忽略服务器关于服务器编码的通知

    这显然是一个错误;如果时间允许,我会追查的

    不过,这里的协议流顺序可能有误。我认为启动包携带了编码,并在预授权时发送。如果我错了,那么这是一个协议问题,需要一个协议版本来解决-不是快速或简单

    我查一下。与此同时


    (另一方面,PostgreSQL在其日志文件中还混合了不同的文本编码,造成了可怕的混乱,因为它在
    客户端编码中向日志发送日志消息。
    。我以前曾考虑过修复此问题,但我认为唯一可能的修复方法是:每个数据库一个日志文件,然后在数据库中记录日志。)lt编码,或者最好只记录utf-8中的所有内容).

    您在哪里看到异常消息?我猜问题出在这一部分,与JDBC本身无关。异常消息在netbeans控制台和tomcat日志文件中都被错误编码。现在看来,这确实是JDBC的错,但我同意这不太可能。我现在可以确认这是r是的,因为如果我正确地进行身份验证,所有后续的错误消息都将以UTF-8编码。例如:我进行了身份验证,运行了查询“SELECT 1/0”,并得到一个异常消息“error:division por cero”(注意“o”)。感谢您的回答。我遇到了此问题的另一个实例,并给出了解释。当
    max_connections
    较低且客户端耗尽了服务器允许的连接时,驱动程序在
    ConnectionFactoryImpl.readStartupMessages
    中引发异常。在这种情况下,错误消息不以UTF-8编码(在我的例子中可能是win1252),即使客户端和服务器都设置为使用UTF-8。在驱动程序代码中设置断点并在字符缓冲区中读取“Le nombre de connexions r”后,出现了提示,这让我怀疑“r”代表“réservées”(保留[连接])。