这个问题应该说是关于MS2005的问题。
问题起因是:我的网站系统有这样一个功能:
要通过查询用户帐号来查询用户信息。
当用户名为英文的时候的没有任何问题,但是当用户名为中文的时候,始终查不出任何信息。
于是我做了一下工作,发现了一些问题。(1)我检查拉存储过程,并直接在数据库中以中文名验证,没有什么问题。
执行的语句如下
.....
exec 过程名称, @用户名过程参数 = N'用户名称'--N代表unicode编码
.....
(2)于是我打开sql server profiler来监测。然后我访问网页,发现显示的调用语句如下:
.....
exec 过程名称, @用户名过程参数 = '???' --跟上面的差别在于少了一个N,导致产生乱码。
.....
(3)现在解决问题的关键就是如何能让数据库在直接来自于网站的查询时,能执行(1)中的语句。
问题起因是:我的网站系统有这样一个功能:
要通过查询用户帐号来查询用户信息。
当用户名为英文的时候的没有任何问题,但是当用户名为中文的时候,始终查不出任何信息。
于是我做了一下工作,发现了一些问题。(1)我检查拉存储过程,并直接在数据库中以中文名验证,没有什么问题。
执行的语句如下
.....
exec 过程名称, @用户名过程参数 = N'用户名称'--N代表unicode编码
.....
(2)于是我打开sql server profiler来监测。然后我访问网页,发现显示的调用语句如下:
.....
exec 过程名称, @用户名过程参数 = '???' --跟上面的差别在于少了一个N,导致产生乱码。
.....
(3)现在解决问题的关键就是如何能让数据库在直接来自于网站的查询时,能执行(1)中的语句。
//这句是直接用sql 写的还是用参数添加的形式写的?
(1)我检查拉存储过程,并在数据库中执行过程,输入中文名参数验证,没有什么问题。
产生的执行的语句如下
.....
exec 过程名称, @用户名过程参数 = N'用户名称'--N代表unicode编码
.....
(2)于是我打开sql server profiler来监测。然后我访问网页,发现sql server profiler显示的调用语句如下:
.....
exec 过程名称, @用户名过程参数 = '???' --跟上面的差别在于少了一个N,导致产生乱码。
.....
(3)现在解决问题的关键就是如何能让数据库在完成来自于网站的查询时,能执行(1)中的语句。
encoding.getstring()作一下转换
过程参数是nvarchar另外在sql server profiler监测过程中发现这么有趣的现象:
asp.net自带的控件查询数据库时,执行存储过程时,数据库执行时会自动给参数类型是nvarchar的参数在执行时加上N,所以不会遇到以上问题。
意思就是说我自己写的存储过程在执行时,数据库就会把应该加的N给去掉,所以导致乱码。经cpp2017(慕白兄) 兄提醒最后解决方案是,在网站程序中组成sql语句,在语句中加上N,然后执行。不过这个问题到底出在那里,还有待研究。