C# 休眠 | PL/SQL Oracle - 包含变音符号时字符串的长度不同

问题描述 投票:0回答:1

我有示例字符串,我尝试使用 nhibernate ISession 对象将其作为值放入 VARCHAR(255) 列(在 Oracle 数据库中)。

abssssssssssssssssssssssssd RRRRRRRRRRRRRRRAAAAAAAAAAAAAAAąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąassssssssssssssssss ansssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssssssssssssss

从应用程序级别我检查 string.Length ,它符合预期(255)。另外我还在对数据库进行以下查询:

            const string lengthCheckSql = @"SELECT LENGTH(:valueToCheck) as charCount FROM DUAL";
            var result = _session.CreateSQLQuery(lengthCheckSql)
                .AddScalar("charCount", NHibernateUtil.Int32)
                .SetString("valueToCheck", valueToCheck)
                .UniqueResult<int>();

这也返回预期值 (255)。

最后,当我从 ISession 对象调用 Save 时,我从数据库中收到异常,即 ,,valueToCheck" 具有数据库允许的更大长度; ,,(当前: 352, 允许: 255)"

当我将 ,ą' 更改为 ,a' 时,一切正常。

我试图找出问题所在 - Nhibernate 默认情况下是否将某些字符转换为与我的数据库允许使用的不同的 unicode?

c# oracle nhibernate fluent-nhibernate
1个回答
0
投票

字符串长度为 255 个字符。它的长度也是 352 字节:

SELECT LENGTH(
         'abssssssssssssssssssssssssd RRRRRRRRRRRRRRRAAAAAAAAAAAAAAAąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąassssssssssssssssss ansssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssssssssssssss' 
       ) AS charCount,
       LENGTHB(
         'abssssssssssssssssssssssssd RRRRRRRRRRRRRRRAAAAAAAAAAAAAAAąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąassssssssssssssssss ansssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssssssssssssss'
       ) AS byteCount
FROM   DUAL

输出:

字符计数 字节数
255 352

如果你这样做:

CREATE TABLE table_name (value VARCHAR2(255 /*BYTE*/));

INSERT INTO table_name (value) VALUES ('abssssssssssssssssssssssssd RRRRRRRRRRRRRRRAAAAAAAAAAAAAAAąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąassssssssssssssssss ansssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssssssssssssss');

然后你会得到错误:

ORA-12899: value too large for column "SCHEMA_NAME"."TABLE_NAME"."VALUE" (actual: 352, maximum: 255)

如果将列更改为 255 个字符(而不是 255 个字节):

ALTER TABLE table_name MODIFY value VARCHAR2(255 CHAR);

然后:

INSERT INTO table_name (value) VALUES ('abssssssssssssssssssssssssd RRRRRRRRRRRRRRRAAAAAAAAAAAAAAAąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąąassssssssssssssssss ansssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssssssssssssss');

有效。

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.