问题的简短版本:VARCHAR(n)
有没有一种方法可以计算将字符串的字符存储在 Oracle 数据库的列中需要多少字节?
更长的版本:以下 Oracle SQL 脚本将在第三条语句处失败。它将尝试在一VARCHAR(10)
列中插入 10 个字符;但是,这些字符之一是带有重音的 A。
CREATE TABLE TESTTABLE (NAME VARCHAR(10) NULL);
INSERT INTO TESTTABLE (NAME) VALUES ('abcdefghij');
--1 rows inserted.
INSERT INTO TESTTABLE (NAME) VALUES ('ábcdefghij');
--ORA-12899: value too large for column "ACME"."TESTTABLE"."NAME" (actual: 11, maximum: 10)
我的 C# 应用程序将字符串存储在 Oracle 数据库中,我不能只将列类型更改为NVARCHAR2(10)
,这将起作用。该应用程序预计会将任何较大的字符串修剪到 10 个字符的限制,因此 Oracle 不会抱怨它的长度。但是String.Length
基于 - 的修剪是一种非常幼稚的策略:它会盲目地保留“ábcdefghij”及其所有 10 个 CLR 字符。
如何检测'á'将在数据库行中占用 2 个字节,以便在发出语句之前将字符串修剪为“ábcdefghi”INSERT
?
编辑:这个问题类似于基于字节长度缩短 UTF8 字符串的最佳方法