【发布时间】:2013-08-30 19:56:39
【问题描述】:
我遇到了一个问题,Delphi XE2 中的 unicode(宽)字符串字段没有返回字符串的最后一部分,并且任何数据库控制组件也没有完全显示整个字符串到最后。
你可以看到下面的简单测试。
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
【问题讨论】:
-
在你的调试中,你确定这是插入问题还是选择问题?
-
您的数据库中配置了哪个字符集?您是否尝试过使用
NVARCHAR2数据类型的示例? -
@Rob,问题实际上是字符串缓冲区大小。
-
@TLama, NLS_CHARACTERSET = CL8MSWIN1251 但客户端是 unicode。数据库字段很难更改。
标签: string oracle delphi unicode delphi-xe2