質問の短いバージョン:VARCHAR(n)
Oracleデータベースの列に文字列の文字を格納するのに必要なバイト数をカウントする方法はありますか?
長いバージョン:次のOracle SQLスクリプトは、3番目のステートメントで失敗します。VARCHAR(10)
1列に10文字を挿入しようとします。ただし、これらの文字の1つは、アキュートアクセントのある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文字すべてで無傷のままにします。
ステートメントを発行する前に文字列を「ábcdefghi」にトリミングできるように、 「á」がデータベース行で2バイトかかることをどのように検出できますか?INSERT
編集:この質問は、バイト長に基づいてUTF8文字列を短縮するための最良の方法に似ています