【问题标题】:Oracle underscore: JDBC query result order on linux different then result on MAC-OS or windowsOracle 下划线:Linux 上的 JDBC 查询结果顺序与 MAC-OS 或 Windows 上的结果不同
【发布时间】:2012-08-02 21:34:27
【问题描述】:

我有一个包含两列的表:

ID      描述
1       第一行
2       第二行
3       _
4       1 个第一个数字行

我有一个问题

SELECT * FROM TABLE ORDER BY DESCRIPTION

问题是我根据运行代码的机器检索不同的结果。 如果我在

上运行代码
  • linux (centos) 我得到以下结果
    ID      DESCRIPTION
    4       1 个第一个数字行
    3       _
    1       第一行
    2       第二行

  • windows (7) 我得到以下结果
    ID      DESCRIPTION
    3       _
    1       第一行
    2       第二行
    4       第一个数字行

  • MAC OS(Snow Leopard) 我得到以下结果
    ID      DESCRIPTION
    3       _
    1       第一行
    2       第二行
    4       第一个数字行

如您所见,下划线“_”的处理方式因我运行查询的机器而异:(。
这是司机的问题吗?为什么我没有得到相同的结果?

【问题讨论】:

  • 可能是客户端环境问题在会话中设置了不同的 NLS_LANG 或 NLS_SORT?如果您可以在两个环境中从 sqlplus 运行查询,看看结果是否相同,如果是,那么在查询之前在两个环境中使用相同的“alter session set nls_lang ...”再次尝试。
  • 我假设数据库是集中式的,所有客户端都在调用同一个数据库?
  • 请参阅the documentation 了解有关 Glenn 评论的更多信息。您的 Java 语言环境会影响此设置;例如看到这个question

标签: java oracle jdbc collation


【解决方案1】:

10 倍的提示。 确实问题出在 locale 的设置上,我有:

  • 在 Linux 上

    LANG=en_US.UTF-8

    LC_CTYPE="en_US.UTF-8"

  • 在 Mac 上

    LANG=de_DE.UTF-8

    LC_CTYPE="de_DE.UTF-8"

在德国 ut​​f-8 的 linux 机器上设置 locale 后,我在 linux 上的结果与在另一台机器(mac 和 windows)上的结果相同,现在构建恢复稳定 :)。

我将尝试使用 NLS_LANG 的配置,以便能够将 linux 机器的 locale 设置回英文 utf-8。

【讨论】:

    【解决方案2】:

    顺序取决于您的 NLS 设置。 See the NLS_LANG and NLS_SORT setting。 如果您在所有环境中提供相同的 NLS 设置,则顺序将相同。

    您也可以明确指定顺序:

    SELECT * 
      FROM TABLE 
     ORDER BY NLSSORT(Description, 'NLS_SORT = BINARY')
    

    我预计排序的性能在这里并不重要,因为如果列被索引,查询可能不会使用描述列上的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2018-07-06
      • 2013-09-07
      相关资源
      最近更新 更多