使用SQLDeveloper查询mysql数据库不会返回正确的值

时间:2012-11-30 10:11:04

标签: mysql encoding oracle-sqldeveloper

我有一个mysql数据库,其中包含所有表的字符集utf8。 我正在使用SQLDeveloper使用最新的JConnector JDBC驱动程序访问和查询数据库。

执行包含保加利亚语言的SELECT 'Варна';等效于SELECT 'Варна' from DUAL;的简单查询时,SQLDeveloper会返回'?????'。这使我从使用保加利亚语言的数据库中选择NULL,因为他们的where子句(包含保加利亚语言)与数据库中的uft8保加利亚字符不匹配。 (当select不使用保加利亚语时,SQLDeveloper会返回完全正确的值,并显示正确查询后返回的保加利亚语言。)

SQLDeveloper中的Preferences -> Environment -> Encoding目前设置为UTF-8,但我已经尝试了几乎所有适用的编码,即使最简单的查询SELECT 'Варна' from DUAL;仍然没有返回正确的值Варна

我已经考虑过设置变量NLS_LANG,认为这可能是原因但无济于事。 (也许它毕竟是关键,但我无法正确配置它。)

编辑:为了重现问题并将其可视化(因为我意识到我可能解释得不好),只需进入SQLDeveloper并连接到mysql数据库并执行查询SELECT 'Варна' from DUAL;

Edit2:澄清。

Edit3:正如@tenhouse留下的评论所示,这可能是一个错误。

Edit4:如下所述作为评论,上述查询SELECT 'Варна' from DUAL;完全正常,无需在MySQL Workbench上进行任何修改和/或设置。

编辑5:如果您认为可以改进某些内容,请随时更正标题和/或标签,因为仍然无法解决问题。

Edit6:到现在我可以假设它真的是一个bug吗?任何人都可以告诉我在哪里报告它 - 它是一个JConnector或SQLDeveloper相关的错误。我认为我必须将其报告为SQLDeveloper错误,但我宁愿在可能浪费时间之前得到确认。

编辑7:我希望得到一个答案,试图进一步澄清它。

Edit8 :(重要!)我当前的数据库托管在linux(Ubuntu 12.04,MySQL 5.5.28)服务器上。但是,如果我在新的Windows机器上安装MySQL并在那里创建utf8 db,则通过SQLDeveloper查询按预期工作,SELECT 'Варна' from DUAL;实际返回Варна。有人可以确认吗?

4 个答案:

答案 0 :(得分:1)

所以我自己不知道这个问题直到几个月前出现这个问题,但MySQL实际上提供了对客户端,数据库和连接进行不同编码的能力。 MySQL会将来自客户端的请求/响应转换(或整理)到客户端或其配置文件中指定的不同编码。因此,即使数据库存储的内容为utf8,如果客户端设置为latin1,您将看到latin1作为结果编码。检查此问题的最简单方法是启动与MySQL的连接并运行以下查询:

SHOW VARIABLES LIKE "%char%";

您应该看到针对不同连接/来源的一大堆编码。根据您的描述,我想大多数是utf8。这里有mysql's doc关于每个人的意思。您可以通过执行 SET NAMES'utf8'; charset utf8; (无法记住哪一个)并再次运行查询来测试这是否存在问题看看是否能解决问题。

总结每个人的所作所为(因为文档留下了一些东西):

  • character_set_client:指定从客户端发送到服务器时数据的编码方式。通过MySQL的API连接的任何东西都是而不是客户端(例如php的mysqli,大多数C / C ++包装器库)
  • character_set_database:指定数据库中存储数据的编码
  • character_set_filesystem:不太确定,但我相信数据是如何写入磁盘的?
  • character_set_results: MySQL返回查询结果的编码
  • character_set_server:服务器的默认设置(不太确定使用此设置的情况)
  • character_set_system:不确定
  • character_sets_dir:您的归类/编码定义所在的位置

大多数这些人都可以通过编辑你的my.cnf并在那里坚持你的默认值来指定。

我不确定JConnector是如何工作的,但我想它使用的是MySQL的C API,在这种情况下,您需要在代码中的某处执行以下操作。也许JConnector有办法通过他设置这个。我不确定,但这是MySQL API的语法:

mysql_options( myLink, MYSQL_SET_CHARSET_NAME, "utf8" );

编辑:对于MySQL 5.5

答案 1 :(得分:0)

您可以尝试这样的命令:: ALTER DATABASE CHARACTER SET WE8ISO8859P5;

更改字符集后请重新启动数据库。

更多详情请参阅此链接,其中介绍了不同语言所需的编码

http://www.csee.umbc.edu/portal/help/oracle8/server.815/a67789/ch3.htm

答案 2 :(得分:0)

连接mysql_connect后:

$dbcnx = mysql_connect($dbhost, $dbuser, $dbpass)

你做这个查询:

mysql_query("SET 
                  character_set_results = 'utf8', 
                  character_set_client = 'utf8', 
                  character_set_connection = 'utf8', 
                  character_set_database = 'utf8', 
                  character_set_server = 'utf8'", 
    $dbcnx);

现在,这将设置返回内容的编码,服务器上发生的事情 - 所以它们都具有相同的编码。

在以下查询中,指定要使用的此连接

答案 3 :(得分:0)

导出

添加[?characterEncoding=utf8]

<StringRefAddr addrType="customUrl">
    <Contents>jdbc:mysql://instance_host_name:3306/database_name?characterEncoding=utf8</Contents>
</StringRefAddr>

导入