我有示例字符串,我尝试使用 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?
字符串长度为 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');
有效。