SQL Server 2005 中文乱码解决

原创 2009年04月21日 14:52:00

 中文存到数据库中总是显示乱码。DEBUG发现页面中文到Service都是正确的中文。试着在数据库中把字段值改为中文(字段类型为Nvarchar),结果页面上可以正确显示,说明页面设置正确。 问题出在数据库层。

后来检查数据库连接字段,发现一个参数

sendStringParametersAsUnicode=false

将其改为 sendStringParametersAsUnicode=true 问题解决。

查MSDN资料

 

如果 sendStringParametersAsUnicode 属性设置为“true”,则字符串参数将以 Unicode 格式发送给服务器。

如果 sendStringParametersAsUnicode 属性设置为“false”,则字符串参数将以非 Unicode 格式(例如 ASCII/MBCS 而不是 Unicode)发送给服务器。

sendStringParametersAsUnicode 属性的默认值为“true”。

 

注意注意:
在 JDBC Driver 2.0 中,只有在发送 CHARVARCHARLONGVARCHAR JDBC 类型的参数值时才检查 sendStringParametersAsUnicode 属性。新的 JDBC 4.0 区域字符方法(例如 SQLServerPreparedStatement 类和 SQLServerCallableStatement 类的 setNStringsetNCharacterStreamsetNClob 方法)始终以 Unicode 格式将参数值发送给服务器,而与此属性的设置无关。 为了获得 CHARVARCHARLONGVARCHAR JDBC 数据类型的最佳性能,使用 JDBC Driver 2.0 的应用程序应将 sendStringParametersAsUnicode 属性设置为“false”,并使用 SQLServerPreparedStatementSQLServerCallableStatement 类的 setStringsetCharacterStreamsetClob 非区域字符方法。 当应用程序将 sendStringParametersAsUnicode 属性设置为“false”,并在服务器端使用非区域字符方法访问 Unicode 数据类型(例如,ncharnvarcharntext)时,如果数据库排序规则不支持非区域字符方法传递的字符串参数中的字符,则有些数据可能会丢失。 请注意,对于 NCHARNVARCHARLONGNVARCHAR JDBC 数据类型,应用程序应使用 SQLServerPreparedStatementSQLServerCallableStatement 类的 setNStringsetNCharacterStreamsetNClob 区域字符方法 
问题解决,原来是字符集问题。
附:Struts2中可能会出现的中文问题
注:在当前项目中我只是把页面字符全部设为UTF-8,没有做别的设置,中文字段工作良好。
. 在struts2里面,最好将所有字符都设成utf-8。 <%@ page contentType="text/html; charset=UTF-8"%> <%@ page pageEncoding="UTF-8" %>1.1 在jsp页面设定字符编码。这边有必有说明的是如果是jsp+java bean+servlet的方案,中文乱码很好解决,统一设成gb2312就可以了。    1.2 使用struts框架字符集不能设成gb2312,要改成utf-8。
 2. 在struts.properties 添加:
struts.devMode=false struts.enable.DynamicMethodInvocation=true struts.i18n.reload=true struts.ui.theme=simple
struts.locale=zh_CN struts.i18n.encoding=UTF-8
struts.serve.static.browserCache=false struts.url.includeParams=none
其中locale、encoding就是字符集的设定了。
  3. 在web.xml加个filter
  <!-- zh-cn encoding -->    <filter>        <filter-name>struts-cleanup </filter-name>        <filter-class>            org.apache.struts2.dispatcher.ActionContextCleanUp        </filter-class>    </filter>      <filter-mapping>        <filter-name>struts-cleanup </filter-name>        <url-pattern>/* </url-pattern>    </filter-mapping>
     跟上述方法,类似还有在action中设定字符编符.
    HttpServletResponse response = null;    response = ServletActionContext.getResponse();    request.setCharacterEncoding("utf-8");    response.setContentType("text/html;charset=utf-8");


    通过上述方法,基本就可以搞定中文乱码的问题了。当然,也有例外(如web server的版本/数据库的版本等等)。象在我的一个项目碰到一个中文乱码,tomcate5.5是会乱码的,而在tomcate6中就不会。这边就涉及到tomcate connector字符的设置了。
    <Connector port="80" maxHttpHeaderSize="8192"                maxThreads="150" minSpareThreads="25" maxSpareThreads="75"                enableLookups="false" redirectPort="8443" acceptCount="100"                connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />

--------------------------------------------------------------------
后记之一:在使用struts2时,仍是遇到一种乱码。后来调试才发现,struts2的web.xml配置是有顺序的。
  在web.xml中EncodingFilter的位置应该在Struts2的FilterDispatcher之前,因为要先调整字符集,然后进入Action。
按照Struts2的API,filter的顺序是 struts-cleanup filter SiteMesh filter FilterDispatcher
--------------------------------------------------------------------
  后记之二:这个方法是下下策了,只有在前面的方法都无效时才使用。
在action中直接使用request.getParameter()时;还是出现乱码。原因分析如下:
  1、getParameter()是有带字符参数的。例:
String s = (String)request.getParameter("txt").getBytes("iso-8859-1");
    2、String也可以带有字符参数。
String(byte[] bytes, String charsetName) 构造一个新的 String,方法是使用指定的字符集解码指定的字节数组。
例:String s = new String("中文","utf-8");
  3、综合上述两点,编写一个类来完成此项任务
  public class ConvertCharacter{
        public String Convert(String s){
            String result;
            byte[] temp ;
            try{
                temp = s.getBytes("iso-8859-1");
                result = new String(temp,"utf-8");
            }
            return result;
        }
  }

request.getParameter乱码的问题
方法一:
通过设置tomcat的配置文件server.xml
Connector port="8080" maxHttpHeaderSize="8192"
      maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
      enableLookups="false" redirectPort="8443" acceptCount="100"
      connectionTimeout="20000" disableUploadTimeout="true" uRIEncoding="gbk"/>

方法二:
1: String id=new String(request.getParameter("id").getBytes("ISO8859-1"),"UTF-8"); 

 

 

后记:  
jsp部分 html部分
如:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

如果连接了数据库, 最好把数据也考虑在内,

相关文章推荐

在SQL Server 2005(2008)中用T-SQL插入中文数据时出现的问号或乱码的解决方案

病症表现为:主要表现为用 T-SQL 语句插入中文数据时数据库显示全是问号“???” 解决办法: 第一种办法:先选中出错的数据库→选中以后右键点击属性会弹出数据库属性 对话框→选中数据库属性对...

C#处理MySQL数据库和SQL Server数据库的区别(存储过程的编写与调用、中文乱码、二进制图片存储与调用)

最近忙着用利用webservice做一个信息查询、增加、删除、修改的应用程序。起初数据库用的是SQL server 2005,操作起来什么问题也没遇到过,一路都很顺畅。 但是转到MySQL数据库中时...

sql中文乱码问题解决方法

  • 2012年09月06日 21:12
  • 33KB
  • 下载

java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)

====================================================== 注:本文源代码点此下载 =============================...

Linux下安装ROracle及rstudio-server使用ROracle中文乱码解决

该安装文档在red hat 6.3及centos 6.5有过测试且成功。 一、oracle-instantclient的安装 (1)      Oracle Instant Client下载(与数据库...
  • xwydq
  • xwydq
  • 2015年02月11日 16:29
  • 1791

Ubuntu Server 命令行下的中文乱码(菱形图标)的解决方案

Ubuntu Server 命令行下的中文乱码(菱形图标)的解决方案 blog.itechol.com View Original ...

解决ubuntu server11.10英文环境显示中文乱码问题---调试通过

解决ubuntu server11.10英文环境显示中文乱码问题---调试通过 ubuntu server11.10英文环境显示中文乱码,把网上所有方法都试了,都没用...

关于PL/SQL Developer 中文乱码的解决

关于PL/SQL Developer 中文乱码的解决      前天项目的开发数据库换到另一台服务器了,不知道哪位大仙把新数据库的编码改变了,大家使用PL/SQL Developer...
  • haiross
  • haiross
  • 2015年07月03日 11:54
  • 9797

navicat 导入sql 中文乱码解决

一,右键数据库链接,点击链接属性如图:     二,修改以下信息,如图: 选择高级选项页签==》去掉使用MySQL字符集复选框==》选择GB2312字符编码==》点击确定 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL Server 2005 中文乱码解决
举报原因:
原因补充:

(最多只允许输入30个字)