我有一个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;
实际返回Варна
。有人可以确认吗?
答案 0 :(得分:1)
所以我自己不知道这个问题直到几个月前出现这个问题,但MySQL实际上提供了对客户端,数据库和连接进行不同编码的能力。 MySQL会将来自客户端的请求/响应转换(或整理)到客户端或其配置文件中指定的不同编码。因此,即使数据库存储的内容为utf8,如果客户端设置为latin1,您将看到latin1作为结果编码。检查此问题的最简单方法是启动与MySQL的连接并运行以下查询:
SHOW VARIABLES LIKE "%char%";
您应该看到针对不同连接/来源的一大堆编码。根据您的描述,我想大多数不是utf8。这里有mysql's doc关于每个人的意思。您可以通过执行 SET NAMES'utf8'; 或 charset utf8; (无法记住哪一个)并再次运行查询来测试这是否存在问题看看是否能解决问题。
总结每个人的所作所为(因为文档留下了一些东西):
大多数这些人都可以通过编辑你的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>
导入