基于字节的CLR字符串长度

Hum*_*rto 1 .net string oracle varchar

问题的简短版本:有没有办法计算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)
Run Code Online (Sandbox Code Playgroud)

我的C#应用​​程序将字符串存储在Oracle数据库中,我不能只将列类型更改为NVARCHAR2(10),这将起作用.应用程序应该将任何较大的字符串修剪为10个字符的限制,因此Oracle不会抱怨它的长度.但String.Length基于a- based的修剪是一种非常天真的策略:它会盲目地将"ábcdefghij"保留为其所有10个CLR字符.

如何检测'á'将占用数据库行中的2个字节,以便在发出语句之前将字符串修剪为"ábcdefghi"INSERT

编辑:这个问题类似于基于字节长度缩短UTF8字符串的最佳方法

Ego*_*off 5

Oracle函数length(string)返回字符lengthb(string)数,返回字节数.