1

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
4

2 に答える 2

1

ソースコードを変更せずに別の解決策を見つけました。

Oracle クライアントの NLS_LANG パラメータを次のように変更するだけです。

AMERICAN_AMERICA.UTF8 

AMERICAN_AMERICA.CL8MSWIN1251 

mainform create イベントで明示的に params を設定します。

Windows.SetEnvironmentVariable(PChar('NLS_LANG'),
                               PChar('AMERICAN_AMERICA.CL8MSWIN1251'));
Oracle.NoUnicodeSupport := True;

実際、アプリケーションが TWideStringField を明示的に使用している場合は、TStringField に変換する必要があります。

于 2013-08-28T17:18:53.013 に答える