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 连接。
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)
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)
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)
我很确定这是 SQL Developer 的问题...\n发出以下命令后重试 desc 表:
\n\nalter 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\n\nSQLPLUS>alter session set NLS_LENGTH_SEMANTICS=\'CHAR\';\n SQLPLUS>descowner.table
\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注意:我没有找到有关 Oracle 官方文档,但这个 wiki 更好地解释了 sql 开发人员的这种行为:
\n\n\n\n过去我在 plsqldeveloper 和其他客户端上发现了同样的问题。也许最新版本可以正常工作。
\n