9

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

当执行一个简单的查询,例如包含保加利亚语的SELECT 'Варна';等价于时,SQLDeveloper 返回. 这使得从我使用保加利亚语返回的数据库中进行选择,因为它们的子句(包含保加利亚语)与数据库中的保加利亚语字符不匹配。(When the select doesn't use Bulgarian language at all SQLDeveloper returns completely correct values and displays the Bulgarian language returned as a result of the query correctly.)SELECT 'Варна' from DUAL;'?????'NULLwhereuft8

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

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

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

编辑2:澄清。

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

Edit4:正如下面的评论所述,上面的查询SELECT 'Варна' from DUAL;工作得很好,没有任何修改和/或在 MySQL Workbench 上摆弄设置。

Edit5:如果您认为可以改进某些内容,请随时更正标题和/或标签,因为问题仍然没有答案。

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

Edit7:试图进一步澄清它,希望得到答案。

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

4

4 回答 4

1

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

SHOW VARIABLES LIKE "%char%";

您应该看到一大堆不同连接/源的编码。根据您的描述,我想其中大多数都不是 utf8。这是mysql关于这些含义的文档。您可以通过执行SET NAMES 'utf8'; 来测试这是否真的是问题所在;字符集 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

于 2013-01-16T15:29:29.227 回答
0

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

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

更多详细信息请参阅此链接,其中解释了不同语言所需的编码

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

于 2012-12-05T10:17:58.503 回答
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);

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

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

于 2013-02-08T09:07:34.953 回答
0

出口

添加[?characterEncoding=utf8]

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

进口

于 2016-09-01T10:57:10.283 回答