Delphi XE2 のユニコード (ワイド) 文字列フィールドで問題が発生しています。文字列の最後の部分が返されず、データベース コントロール コンポーネントも文字列全体が最後まで完全に表示されません。
以下に簡単なテストを示します。
with TOracleDataSet.Create(self) do
try
Session := OraSession;
SQL.Text := 'CREATE TABLE test1 (fsString10 VARCHAR2(10))';
ExecSQL;
SQL.Text := 'INSERT INTO test1 (fsString10) VALUES ('''1234567890''')';
ExecSQL;
SQL.Text := 'INSERT INTO test1 (fsString10) VALUES ('''й234567890''')';
ExecSQL;
SQL.Text := 'INSERT INTO test1 (fsString10) VALUES ('''йцукенгшщз''')';
ExecSQL;
SQL.Text := 'SELECT fsString10 FROM test1';
Open;
while not Eof do
ShowMessage(FieldByName('fsString10').AsString);
// '1234567890' turned into '1234567890'
// 'й234567890' turned into 'й23456789'
// 'йцукенгшщз' turned into 'йцуке'
SQL.Text := 'DROP TABLE test1';
ExecSQL;
finally
Free;
end;
ご覧のとおり、Unicode 文字列が正しく読み込まれていません。
一方、「Direct Oracle Access 4.1.3」コンポーネントは、レコードの半分の後に文字列に文字を保存しませんでした。とにかく、前半の半弦だけを保存します。
それを修正する方法はありますか?
- BytesPerCharacter は bcAutoDetect に設定されています。
- NoUnicodeSupport と他のすべてのオプションを切り替えようとしましたが、うまくいきませんでした。
これを修正する方法について誰かアイデアがありますか?
PS: 多くの理由で、実稼働データベース スキーマを変更できません。
DB Server NLS_DATABASE_PARAMETERS NLS_CHARACTERSET = CL8MSWIN1251
DB Client NLS_LANG=AMERICAN_AMERICA.UTF8
DB Client NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251 <- the same thing