对于我几乎所有的数据库,当我运行一条SELECT
语句时,显示的列的长度会调整为被查询数据的宽度。但是,我有两个数据库(同一应用程序的开发和生产)似乎将所有列大小默认为 32 个字符宽。如果数据宽于 32 个字符或使用了列别名,则默认该列为 128 个字符宽。
以下是来自众多优秀系统之一的一些示例:
>select '1234567890' XX_Identifier from dual;
XX_IDENTIF
----------
1234567890
>select '12345678901234567890' XX_Identifier from dual;
XX_IDENTIFIER
--------------------
12345678901234567890
以下是其中一个不良系统的一些示例:
>select '1234567890' XX_Identifier from dual;
XX_IDENTIFIER
--------------------------------
1234567890
>select '12345678901234567890' XX_Identifier from dual;
XX_IDENTIFIER
--------------------------------
12345678901234567890
我检查了 sqlplus 设置,它们都是一样的。我没有看到任何看起来不寻常的数据库参数,它们都具有相同的 NLS 参数。两个数据库使用相同的字符集。
我意识到我可以为要查询的每一列定义一种格式,但这不是必需的,因为它不在任何其他数据库上。
有这个问题的数据库是11.2.0.1,而我们其他的都是11.2.0.4,所以可能有一个我找不到的错误。在这两种情况下,我使用的 sqlplus 客户端都是 12.1.0.1。
更新:症状不完全匹配,但 Doc ID 330717.1 谈到了 sqlplus 中的列宽,基本上说如果不设置格式就不能保证任何事情。我可以接受,但由于行为是一致的,似乎可以确定原因。
我发现了这个问题。它记录在一个 oracle note (Doc ID 1086519.1) 中。我使用列出的第一个解决方法是将 CURSOR_SHARING 设置为精确。