NVARCHAR2 列的精度比 desc 命令显示的精度低 1.5 倍

Uts*_*sav 6 oracle oracle-11g datatypes oracle-sql-developer

我想更新nvarchar2列的精度并遇到了一个有趣的案例。我试图在下面复制它:

create table test_table1
 (col1 nvarchar2(100));

table TEST_TABLE1 created.

desc test_table1
Name Null Type           
---- ---- -------------- 
COL1      NVARCHAR2(150) 
Run Code Online (Sandbox Code Playgroud)

我们观察到nvarchar2列的显示精度是指定精度的 1.5 倍。因此,如果我必须复制类型为 的列的精度NVARCHAR2(375),那么我们需要将其声明为NVARCHAR2(250).

我试图寻找解释,但找不到任何解释。有没有人对此有任何想法?我们正在使用 Oracle-11g,与 Oracle SQL Developer 连接。

NLS_SESSION_PARAMETERS

select * from NLS_SESSION_PARAMETERS;

+-------------------------+------------------------------+
|        PARAMETER        |            VALUE             |
+-------------------------+------------------------------+
| NLS_LANGUAGE            | AMERICAN                     |
| NLS_TERRITORY           | AMERICA                      |
| NLS_CURRENCY            | $                            |
| NLS_ISO_CURRENCY        | AMERICA                      |
| NLS_NUMERIC_CHARACTERS  | .,                           |
| NLS_CALENDAR            | GREGORIAN                    |
| NLS_DATE_FORMAT         | YYYY.MM.DD HH24:MI:SS        |
| NLS_DATE_LANGUAGE       | AMERICAN                     |
| NLS_SORT                | BINARY                       |
| NLS_TIME_FORMAT         | HH.MI.SSXFF AM               |
| NLS_TIMESTAMP_FORMAT    | DD-MON-RR HH.MI.SSXFF AM     |
| NLS_TIME_TZ_FORMAT      | HH.MI.SSXFF AM TZR           |
| NLS_TIMESTAMP_TZ_FORMAT | DD-MON-RR HH.MI.SSXFF AM TZR |
| NLS_DUAL_CURRENCY       | $                            |
| NLS_COMP                | BINARY                       |
| NLS_LENGTH_SEMANTICS    | BYTE                         |
| NLS_NCHAR_CONV_EXCP     | FALSE                        |
+-------------------------+------------------------------+
Run Code Online (Sandbox Code Playgroud)

NLS_DATABASE_PARAMETERS

select * from NLS_DATABASE_PARAMETERS;
+-------------------------+----------------------------+
|        PARAMETER        |           VALUE            |
+-------------------------+----------------------------+
| NLS_LANGUAGE            | AMERICAN                   |
| NLS_TERRITORY           | SWITZERLAND                |
| NLS_CURRENCY            | SFr.                       |
| NLS_ISO_CURRENCY        | SWITZERLAND                |
| NLS_NUMERIC_CHARACTERS  | .'                         |
| NLS_CHARACTERSET        | AL32UTF8                   |
| NLS_CALENDAR            | GREGORIAN                  |
| NLS_DATE_FORMAT         | DD.MM.RR                   |
| NLS_DATE_LANGUAGE       | AMERICAN                   |
| NLS_SORT                | BINARY                     |
| NLS_TIME_FORMAT         | HH24:MI:SSXFF              |
| NLS_TIMESTAMP_FORMAT    | DD.MM.RR HH24:MI:SSXFF     |
| NLS_TIME_TZ_FORMAT      | HH24:MI:SSXFF TZR          |
| NLS_TIMESTAMP_TZ_FORMAT | DD.MM.RR HH24:MI:SSXFF TZR |
| NLS_DUAL_CURRENCY       | SF                         |
| NLS_COMP                | BINARY                     |
| NLS_LENGTH_SEMANTICS    | BYTE                       |
| NLS_NCHAR_CONV_EXCP     | FALSE                      |
| NLS_NCHAR_CHARACTERSET  | UTF8                       |
| NLS_RDBMS_VERSION       | 11.2.0.4.0                 |
+-------------------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)

nls_length_semantics

show parameter nls_length_semantics;
Show parameters query failed 
Run Code Online (Sandbox Code Playgroud)

解析度

谢谢你们的努力。问题确实出在SQL Developer.

我尝试在 Unix 中手动连接后运行它。得到正确的结果

create table test_table1
 (col1 nvarchar2(100));

Table created.

desc test_table1;
 Name  Null?   Type
 ---------------------------
 COL1          NVARCHAR2(100)
Run Code Online (Sandbox Code Playgroud)

感谢两位的回答。感谢Paul宣布悬赏,感谢jsapkotaGiova抽出时间帮助我。

Gio*_*ova 2

我很确定这是 SQL Developer 的问题...\n发出以下命令后重试 desc 表:

\n\n
alter session set NLS_LENGTH_SEMANTICS=\'CHAR\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在正确吗?如果没有尝试在数据库服务器上使用 sqlplus 绕过 Oracle 监听器来解析表:

\n\n
>export NLS_LANG=AMERICAN_SWITZERLAND.AL32UTF8 \n>export ORACLE_SID=<YOURINSTANCESID>\n>sqlplus / as sysdba\n>sqlplus>desc owner.table\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果结果不正确,则执行:

\n\n
\n

SQLPLUS>alter session set NLS_LENGTH_SEMANTICS=\'CHAR\';\n SQLPLUS>descowner.table

\n
\n\n

如果您无法在服务器上执行此操作,请在 sqldeveloper 上尝试相同的操作(但您不会绕过侦听器):

\n\n
>set NLS_LANG=AMERICAN_SWITZERLAND.AL32UTF8 \n>C:\\oracle\\client\\product\\12.1.0\\client\\sqldeveloper\\sqldeveloper\\bin\\sqldevelope\xe2\x80\x8c\xe2\x80\x8brW.exe\n
Run Code Online (Sandbox Code Playgroud)\n\n

改变sqldevelope\xe2\x80\x8c\xe2\x80\x8brW.exe路径。\n让我知道\n当您声明 nvarchar2 字段时,大小始终以 char 表示。使用 desc 命令您可以查看以字节为单位的大小。Sqldeveloper 以某种方式无法显示 char 中的 vlaue。您也可以尝试更新您的 sqldevleoper 版本。

\n\n

乔瓦

\n\n

注意:我没有找到有关 Oracle 官方文档,但这个 wiki 更好地解释了 sql 开发人员的这种行为:

\n\n

设置 NLS 长度语义

\n\n

过去我在 plsqldeveloper 和其他客户端上发现了同样的问题。也许最新版本可以正常工作。

\n