gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:30:54 25 4
gpt4 key购买 nike

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

当执行一个简单的查询时,例如 SELECT 'Варна'; 相当于 SELECT 'Варна' from DUAL;,其中包含保加利亚语,SQLDeveloper 返回 ' ??????”。这使得从我使用保加利亚语的数据库中选择返回 NULL,因为它们的 where 子句(包含保加利亚语)与 uft8 保加利亚语不匹配数据库中的字符。 (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.)

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 上没有任何修改和/或设置摆弄的情况下工作得很好。

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

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

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

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

最佳答案

所以直到几个月前遇到这个问题我自己才知道这一点,但 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

关于mysql - 使用 SQLDeveloper 查询 mysql 数据库不返回正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13643063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com