sybase ase + C# AseClient 读写数据库乱码

wenjunqianli 2009-06-03 02:50:34
数据库为12.5,字符集为cp850
连接字符串设置过cp850,iso_1均不可以。
用SQL语句可以正常操作中文,但是用sybase官方提供的AseClient访问则会写入乱码。

尝试将服务器字符集设为cp936,但cp936必需要用区分大小写的排序,无果。。。
...全文
1000 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
luito 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 iihero 的回复:]
引用 11 楼 luito 的回复:

string ss = "2010-04-21";//测试数字
string sss = "@#!@#&*^%()@!@12133";//测试特殊符号
string s = rd.GetString(1);//数据库读取中文字段 ……

用的是我昨天邮件里的方法?:-)
传入值到数据库端,你用:
System.Text.Enc……
[/Quote]
中文乱码 可能与数据库的平台有关系,如果直接使用你昨天给的方法的话,读出的中文不是乱码的话,会被转成乱码,这里我加了一个判断,是乱码则转,不是乱码则不转;是数字与特殊符号 也不会被转成乱码,这样更加适用些。
iihero 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 luito 的回复:]
引用 12 楼 iihero 的回复:
引用 11 楼 luito 的回复:

string ss = "2010-04-21";//测试数字
string sss = "@#!@#&*^%()@!@12133";//测试特殊符号
string s = rd.GetString(1);//数据库读取中文字段 ……

用的是我昨天邮件里的方法?:-)
传入值到……
[/Quote]

Good news!
luito 2010-04-28
  • 打赏
  • 举报
回复

[Quote=引用 12 楼 iihero 的回复:]
引用 11 楼 luito 的回复:

string ss = "2010-04-21";//测试数字
string sss = "@#!@#&*^%()@!@12133";//测试特殊符号
string s = rd.GetString(1);//数据库读取中文字段 ……

用的是我昨天邮件里的方法?:-)
传入值到数据库端,你用:
System.Text.Enc……
[/Quote]

嗯!~用了那个方法,然后加了正则判断,这样不是中文乱码也可以了,特殊字符与数字也测试了的,没问题。
iihero 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 luito 的回复:]

string ss = "2010-04-21";//测试数字
string sss = "@#!@#&*^%()@!@12133";//测试特殊符号
string s = rd.GetString(1);//数据库读取中文字段 ……
[/Quote]
用的是我昨天邮件里的方法?:-)
传入值到数据库端,你用:
System.Text.Encoding.GetEncoding("latin1").GetString(System.TextEncoding.Default.GetBytes("李勇"));
从数据端取出值时用:
Console.WriteLine("name = " + System.Text.Encoding.GetEncoding("gbk").GetString(System.Text.Encoding.GetEncoding("latin1").GetBytes(rs.GetString(1))));

其实,这应该是一个bug,也许最新的EBF里包含有相关的fix。没时间试了。

luito 2010-04-28
  • 打赏
  • 举报
回复
string ss = "2010-04-21";//测试数字
string sss = "@#!@#&*^%()@!@12133";//测试特殊符号
string s = rd.GetString(1);//数据库读取中文字段 if (Regex.IsMatch(sss, "[^\u4E00-\u9FA5]", RegexOptions.IgnoreCase | RegexOptions.Multiline))//判断中文是否为乱码
{
s = System.Text.Encoding.GetEncoding("gbk").GetString(System.Text.Encoding.GetEncoding("latin1").GetBytes(sss));//中文乱码问题
}
经测试皆正常,并能正确获取中文信息。
luito 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shino_wu 的回复:]
将字符集设为 UTF-8也可以
[/Quote]
UTF-8 是肯定不得行,直接运行就报错!~
谁还有更好的办法,指教哈!
shino_wu 2009-07-12
  • 打赏
  • 举报
回复
将字符集设为 UTF-8也可以
leedeqing 2009-07-08
  • 打赏
  • 举报
回复
关注cp936之外的方法
shino_wu 2009-07-03
  • 打赏
  • 举报
回复
DataSource = myserver;Database='aaa'; UID='sa';pwd='XXXX'; port='5000';charset='cp936'
注意要将 disable character set conversions 设为1
树莓派centos 2009-06-09
  • 打赏
  • 举报
回复
你试下在连接字符串那加入使用CHARSET.我试过,之前用VB,反回的记录集是乱码,后来把CONNECTIONSTRING改为DSN=LOCALM;CHARSET=eucgb就可以了
cqhweb 2009-06-04
  • 打赏
  • 举报
回复
按照下面的步骤操作更改数据库上的字符集

更改SYBASE默认字符集为CP936

注意:更改字符集后要重新建立数据库。

1、在isql状态下查看原来数据库字符集使用情况,服务器和客户端的都要查看,方法是:
获得服务器端的字符集情况:
1>sp_helpsort
2>go

输出结果应为:
Character Set = 2, cp850
Code Page 850 (Multilingual) character set.
Sort Order = 50, bin_cp850
Binary Sort Order for Code Page 850 (cp850).

获得客户端字符集情况:
1>select @@client_csname
2>go
输出结果应为:iso_1

说明:很多时候应用程序报错,客户端和服务器端字符集不相匹配。


2、将数据库的缺省字符集设置为cp936:
C:\>cd sybase
C:\sybase>cd charsets
C:\sybase\charsets>cd cp936
C:\sybase\charsets\cp936>charset -Usa -Psybase -Sdiren binary.srt cp936

charset –U用户名 –P密码 –SPORTALSERVER服务名(不可为ip) binary.srt cp936

你将看到下面的信息,表示这时你已经成功添加了cp936字符集到你的系统中。
Loading file 'binary.srt'.
Found a [sortorder] section.
This is Class-1 sort order.
Finished loading the Character Set Definition.
Finished loading file 'binary.srt'.
1 sort order loaded successfully

3、接着是将添加的cp936设置为你的缺省值。方法是:
C:\sybase\charsets\cp936>isql -Usa -Psybase -Sdiren
1> select name,id from syscharsets
2> go
ascii_8 0
iso_1 1
cp850 2
bin_iso_1 50
bin_cp850 50
bin_cp936 50
cp936 171
这样知道你的cp936的ID号是171

4、将server的数据库缺省的字符集设置为cp936
1> sp_configure 'default character set id',171
2> go
In changing the default sort order, you have also reconfigured SQL Server's default character set.
Parameter Name Default Memory Used Config Value Run Value
------------------------------ ----------- ----------- ------------ -----------
default character set id 1 0 171 2
(1 row affected)
Configuration option changed. Since the option is static, Adaptive Server must be rebooted in order for the change to take effect.
(return status = 0)

5、重新启动服务器两次(参考使用DOS命令net start SYBSQL_diren)。第一次启动报错“服务器SYBSQL_diren不能启动,请检查它的配置”很正常,第二次正确启动,表明你的设置成功了。

6、在DOS下用edit修改客户端缺省字符集文件c:\sybase\locales\locales.dat
c:\sybase\locales\>edit locales.dat
首先找到[NT]操作系统分组,然后定位到该分组最后一行“local = default, us_english, iso_1”,将其修改为:“local = default, us_english, cp936”。
参考步骤1,确认服务器端和客户端字符集均已修改正确。

7、在Sybase Central中,重新建立新的空数据库,仔细规划好生产数据库数据设备和日志设备的大小。
wenjunqianli 2009-06-03
  • 打赏
  • 举报
回复
用oledb则无该问题
wenjunqianli 2009-06-03
  • 打赏
  • 举报
回复
一致了。客户端和服务器一直是保持一致的。
mwmaowei 2009-06-03
  • 打赏
  • 举报
回复
服务器和客户端的字符集都要一致才行
wenjunqianli 2009-06-03
  • 打赏
  • 举报
回复
哎。无人。

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧