关于ASP提交到MSSQL数据库乱码的问题

时间:2022-10-13 17:18:33
用ASP编程,输入到SQL的数据是乱码,asp页面的编码方式都是gb2312,sql的编码方式不知道在哪改,但是我记得安装的时候是设置成gb2312的了,sql数据库中改字段的格式是nvarchar,在网上查的方法都试过了,在页面开始加CodePage="936"的方法试过了,不起作用。
另外一种在插入的数据前面加N的方法倒是能解决乱码的问题,
代码:
sql="insert into article (id,sortId,title,content,strDate,noteNum,viewNum) values("&id&","&sortId&","&“N”&sqlstr(strTitle)&","&sqlstr(strContent)&","&sqlstr(strDate)&","&"'0'"&","&"'0'"&")"

注:sqlstr是一个单双引号转换函数。
这样输入的数据没有乱码了,
但是这样又出现了另外一个问题:
sql="select * from article where title="&sqlstr(strTitle)
rs.open sql
sqlstr(strTitle)='标题1'
但是数据库中明明有“标题1”的这条数据,查询却查询不出来。
然后我测试成
sql="select * from article where title='标题1'"
仍然没反应,不知道是不是因为ASP和SQL的编码方式不同,导致ASP不能识别SQL的汉字。
最后我又测试:
sql="select * from article where id='21'"
response.write(strTitle)
response.write(rs("title"))
if strTitle=rs("title") then
response.write("aaa")
end if
这样能输出“aaa”,这样就彻底糊涂了。
仍然没反应,不知道是不是因为ASP和SQL的编码方式不同,导致ASP不能识别SQL的汉字。

后来又做了一个测试代码
test1.asp
<form name="publishForm" action="test2.asp" method="post">
标题:<input type="text" name="title"  size="60"/>
<input type="submit" value="确定" name="submit"/>
</form>
test2.asp
<!--#include file="config.inc"-->
<%
strTitle=trim(request.form("title"))

set conn=server.createobject("adodb.connection")
conn.open dsn,dbName,dbPwd
set rs=server.createobject("adodb.recordset")
rs.activeconnection=conn
sql="select * from article where title="&sqlstr(strTitle)
rs.open sql

if not rs.eof then
response.write("<script>alert('请不要重复发表文章!');window.history.back();</script>")
else

rs.close

rs.locktype=3
sql="select top 1 * from article order by id desc"
rs.open sql
id=rs("id")+1
sql="insert into article (id,title,content,strDate,noteNum,viewNum) values

("&id&","&"N"&sqlstr(strTitle)&","&sqlstr(strContent)&","&sqlstr(strDate)

&","&"'0'"&","&"'0'"&")"

conn.execute(sql)
end if
%>
config.inc
<%
const dsn="blog"
const dbName="sa"
const dbPwd=""

function sqlstr(data)
sqlstr="'" & data & "'"
end function
%>

提交测试的结果让人匪夷所思,输入“个人日志”,能重复再次输入,也就是说检查文章标题重复的功能不起作用,或者说ASP中test1.asp中提交的文章标题与sql中所对应的文章标题对不上(字是一样的)
而我输入“啊啊啊”,却能提示文章标题重复,真是糊涂了!
望解答,多谢!

13 个解决方案

#1


该回复于2011-03-19 21:22:49被版主删除

#2


把文件编码改一下。
将文件另存为utf-8,或者ansi,或者unicode 
我以前遇到这个问题。
把utf-8换成ansi
一切都OK

#3


还有你设置的是全局变量。
最好程序结束时清空一下。

#4


好像不是你说的那个问题啊,
我总结了一下,大概是这样:
1.ASP的编码是GB2312
2.SQL的编码是GB2312,存储格式为nvarchar
3.为什么2个编码方式一样,还会出现乱码,这个暂时没弄明白
4.按照网上的方法,先解决了乱码问题,可以将SQL的中文数据放置在数据的最后一列,另外在ASP往数据库中写入数据的时候,要加"N",例如:sql="insert into article (title) values ("&"N"&sqlstr(strTitle)&")",这里sqlstr()是一个单双引号转换函数,这样写入数据库的数据为正常中文。乱码解决了,但是为什么加N不清楚原因。
5.最主要的问题出来了:虽然乱码问题解决了,但是在ASP中调用查询语句的时候确出问题了,
 sql="select * from article where title="&sqlstr(strTitle)
 if not rs.eof then
 response.write("<script>alert('文章标题重复!');</script>") 
 end if
 这个文章标题重复的检测不起作用,我后来测试了一下,从ASP获取的strTitle值没有问题,能用response正常输出,比如strTitle="今天",sql数据库中也有"今天"这个title值,但是用sql语句查询的时候确无法找到该数据sql="select * from article where title="&sqlstr(strTitle),这句sql不起作用。这是我的症结所在,百思不得其解。
6.flymyhelp说的那个编码问题,我也试过了,都是正常的,ASP都是ANSI编码格式。而且我还重新另存为ANSI格式把他们覆盖了一遍,问题依旧。
7.疯了。。。

#5


的确疯了。。关注。没遇到过。

#6


貌似这个错了。
sql="select * from article where title="&sqlstr(strTitle)
改成
sql="select * from article where title='"&sqlstr(strTitle)&"'"
title字段是字符类型
值也要用单引括起来

#7


拜托,你没好好看啊,我在第4条中已经交代了,sqlstr()是我自定义的一个单引号双引号转换函数。
function sqlstr(data)
sqlstr="'" & data & "'"
end function
这里已经做了转换了。。

#8


不一样的。。
这样转换。数据库查询语句是
select * from article where title="'data'"
而不是
select * from article where title='data'
两个截然不同的查询结果。

#9


引用 4 楼 over_flow 的回复:
好像不是你说的那个问题啊,
我总结了一下,大概是这样:
1.ASP的编码是GB2312
2.SQL的编码是GB2312,存储格式为nvarchar
3.为什么2个编码方式一样,还会出现乱码,这个暂时没弄明白
4.按照网上的方法,先解决了乱码问题,可以将SQL的中文数据放置在数据的最后一列,另外在ASP往数据库中写入数据的时候,要加"N",例如:sql="insert into arti……

  你的问题真的挺奇怪的,居然还要在数据前面加N?把数据放最后一列,太怪了,关注一下,我用了段时间MSSQL,但是从没有出现你说的这个问题,我用的是MSSQL2000的老版本!

#10


程序还是需要循规蹈矩的。。。按照平常的方法,不会出现这种奇怪的问题。

#11


顺便说一下

不知道是不是因为ASP和SQL的编码方式不同,导致ASP不能识别SQL的汉字。


不知道这种结论你是怎么出来的

不管asp是怎么编码,数据库自己有自己的编码。具体的你先谷歌一下吧

#12


....我就是百度完了,在网上才了很多网友的答案才在这边发布的帖子啊,SQL是有它自己的编码方式,那个我已经设置过了,是GB2312,ASP设置的也是GB2312,而且文件时按照ANSI方式保存的。
在数据前面加N?把数据放最后一列,如果不这么做的话,的的确确是出现了乱码,在百度上搜索也有很多这样类似的提问,
按照“flymyhelp”的回答,把单双引号转换重新改了一下,但是问题依旧,主要是这样,同一列数据,例如:"title"字段,含有数字或字母的话,比如数据1中含有“111”或“aaa”,用SQL语句查询能够查询的到,但是数据中如果有汉字,比如含有“阿上达到撒”这样的数据,查询不到。
更离谱的是这样,我录入了一个文章字段,格式为ntext,中含有“打造个性化”这样一句话,搜索“打造”能搜索到,搜索“个性化”搜索不到。搜索其中包含的数字和字母,能搜索到。郁闷中,不解。

#13


问题总算解决了,是数据库的排序规则错误导致。之前根本没注意到这块,因为每次创建数据库都选的默认排序规则。在没进行任何操作时,创建的数据库的属性中的排序规则显示为空,或者“默认规则”
谁知道,在ASP执行SQL查询语句的时候,再次查看数据库的排序规则变成了Chinese_*_Stroke_CI_AS,
排序规则错误,自然查询不到。
我连续创建了几个数据库都是这样。看来默认规则已经设置成了Chinese_*_Stroke_CI_AS
然后我又重新创建了数据库,强制将排序规则选择为Chinese_PRC_CI_AS。再查询后问题解决了。
感谢回答我问题的两位网友,会给你们加分的。谢谢!

#1


该回复于2011-03-19 21:22:49被版主删除

#2


把文件编码改一下。
将文件另存为utf-8,或者ansi,或者unicode 
我以前遇到这个问题。
把utf-8换成ansi
一切都OK

#3


还有你设置的是全局变量。
最好程序结束时清空一下。

#4


好像不是你说的那个问题啊,
我总结了一下,大概是这样:
1.ASP的编码是GB2312
2.SQL的编码是GB2312,存储格式为nvarchar
3.为什么2个编码方式一样,还会出现乱码,这个暂时没弄明白
4.按照网上的方法,先解决了乱码问题,可以将SQL的中文数据放置在数据的最后一列,另外在ASP往数据库中写入数据的时候,要加"N",例如:sql="insert into article (title) values ("&"N"&sqlstr(strTitle)&")",这里sqlstr()是一个单双引号转换函数,这样写入数据库的数据为正常中文。乱码解决了,但是为什么加N不清楚原因。
5.最主要的问题出来了:虽然乱码问题解决了,但是在ASP中调用查询语句的时候确出问题了,
 sql="select * from article where title="&sqlstr(strTitle)
 if not rs.eof then
 response.write("<script>alert('文章标题重复!');</script>") 
 end if
 这个文章标题重复的检测不起作用,我后来测试了一下,从ASP获取的strTitle值没有问题,能用response正常输出,比如strTitle="今天",sql数据库中也有"今天"这个title值,但是用sql语句查询的时候确无法找到该数据sql="select * from article where title="&sqlstr(strTitle),这句sql不起作用。这是我的症结所在,百思不得其解。
6.flymyhelp说的那个编码问题,我也试过了,都是正常的,ASP都是ANSI编码格式。而且我还重新另存为ANSI格式把他们覆盖了一遍,问题依旧。
7.疯了。。。

#5


的确疯了。。关注。没遇到过。

#6


貌似这个错了。
sql="select * from article where title="&sqlstr(strTitle)
改成
sql="select * from article where title='"&sqlstr(strTitle)&"'"
title字段是字符类型
值也要用单引括起来

#7


拜托,你没好好看啊,我在第4条中已经交代了,sqlstr()是我自定义的一个单引号双引号转换函数。
function sqlstr(data)
sqlstr="'" & data & "'"
end function
这里已经做了转换了。。

#8


不一样的。。
这样转换。数据库查询语句是
select * from article where title="'data'"
而不是
select * from article where title='data'
两个截然不同的查询结果。

#9


引用 4 楼 over_flow 的回复:
好像不是你说的那个问题啊,
我总结了一下,大概是这样:
1.ASP的编码是GB2312
2.SQL的编码是GB2312,存储格式为nvarchar
3.为什么2个编码方式一样,还会出现乱码,这个暂时没弄明白
4.按照网上的方法,先解决了乱码问题,可以将SQL的中文数据放置在数据的最后一列,另外在ASP往数据库中写入数据的时候,要加"N",例如:sql="insert into arti……

  你的问题真的挺奇怪的,居然还要在数据前面加N?把数据放最后一列,太怪了,关注一下,我用了段时间MSSQL,但是从没有出现你说的这个问题,我用的是MSSQL2000的老版本!

#10


程序还是需要循规蹈矩的。。。按照平常的方法,不会出现这种奇怪的问题。

#11


顺便说一下

不知道是不是因为ASP和SQL的编码方式不同,导致ASP不能识别SQL的汉字。


不知道这种结论你是怎么出来的

不管asp是怎么编码,数据库自己有自己的编码。具体的你先谷歌一下吧

#12


....我就是百度完了,在网上才了很多网友的答案才在这边发布的帖子啊,SQL是有它自己的编码方式,那个我已经设置过了,是GB2312,ASP设置的也是GB2312,而且文件时按照ANSI方式保存的。
在数据前面加N?把数据放最后一列,如果不这么做的话,的的确确是出现了乱码,在百度上搜索也有很多这样类似的提问,
按照“flymyhelp”的回答,把单双引号转换重新改了一下,但是问题依旧,主要是这样,同一列数据,例如:"title"字段,含有数字或字母的话,比如数据1中含有“111”或“aaa”,用SQL语句查询能够查询的到,但是数据中如果有汉字,比如含有“阿上达到撒”这样的数据,查询不到。
更离谱的是这样,我录入了一个文章字段,格式为ntext,中含有“打造个性化”这样一句话,搜索“打造”能搜索到,搜索“个性化”搜索不到。搜索其中包含的数字和字母,能搜索到。郁闷中,不解。

#13


问题总算解决了,是数据库的排序规则错误导致。之前根本没注意到这块,因为每次创建数据库都选的默认排序规则。在没进行任何操作时,创建的数据库的属性中的排序规则显示为空,或者“默认规则”
谁知道,在ASP执行SQL查询语句的时候,再次查看数据库的排序规则变成了Chinese_*_Stroke_CI_AS,
排序规则错误,自然查询不到。
我连续创建了几个数据库都是这样。看来默认规则已经设置成了Chinese_*_Stroke_CI_AS
然后我又重新创建了数据库,强制将排序规则选择为Chinese_PRC_CI_AS。再查询后问题解决了。
感谢回答我问题的两位网友,会给你们加分的。谢谢!