7

这是一些用一个非常简单的表设置的 SQL。

CREATE TABLE CC_TEST2 
  ("CURRENCYID" NUMBER NOT NULL ENABLE, 
"NAME" NVARCHAR2(255)) ;


insert into CC_TEST2 (select 1,'Testing issue'from dual);
commit;

然后这会重现问题

    SELECT (step.Name ||
    'Commentary of 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890            1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890
    1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 12')
 as thing  FROM CC_TEST2 step

有任何想法吗?

我认为 nVarchar2 有点奇怪?如果我将列类型更改为 varChar2 就可以了。可悲的是,我无法更改遇到问题的实际生产数据库的列类型

4

3 回答 3

2

如果将“NAME” NVARCHAR2(255) 更改为“NAME” VARCHAR2(255)(即使用varchar2),您将不会遇到任何问题。您可以在 http://sqlfiddle.com/#!4/cefd8/2进行相同的测试

于 2013-10-23T09:39:22.797 回答
2

NVARCHAR2 和字符串连接似乎有些奇怪。

http://sqlfiddle.com/#!4/936c4/2

我基于在 SQL Fiddle 中运行各种语句的理解是连接运算符右侧的字符串常量 || 也被视为 NVARCHAR2,最多可包含 1000 个字符。

于 2013-10-23T09:56:27.670 回答
0

根据 oracle 文档

NCHAR 和 NVARCHAR2 数据类型

NCHAR并且NVARCHAR2是存储 Unicode 字符数据的 Unicode 数据类型。它们也称为本机数据类型。

数据类型存储可变长度的NVARCHAR2字符串。

当您创建包含NVARCHAR2列的表时,指定的最大大小始终是字符长度语义。字符长度语义是NVARCHAR2.

例如,如果国家字符集是UTF8,则以下语句定义最大字节长度为 90 个字节:

CREATE TABLE tab1 (col1 NCHAR(30));

列的最大长度NVARCHAR2为 4000 字节。它最多可以容纳 4000 个字符。实际数据受最大字节限制 4000 的限制。两个大小限制必须在运行时同时满足。

这完全取决于您的字符集和长度语义。

你的问题的原因是

要记住的另一件重要事情是,存储在 VARCHAR2 中的字节数的上限是 4,000。但是,即使您指定 VARCHAR2(4000 CHAR),您也可能无法将 4,000 个字符放入该字段。事实上,如果在您选择的字符集中所有字符都占用 4 个字节来表示,那么您可以在该字段中放入少至 1,000 个字符!

这也适用于 Native 数据类型。

解决方案:

使用CHAR而不是BYTES作为 VARCHAR2 或 CHAR 的长度语义。

原因是单字节字符集中的 20 个字符的字符串有 20 个字节长,并且绝对适合 VARCHAR2(20)。然而,一个 20 个字符的字段在多字节字符集中可能长达 80 个字节,而 20 个 Unicode 字符可能不适合 20 个字节。

于 2013-10-23T10:29:30.543 回答