ssh2 + mysql 数据入库乱码有关问题

ssh2 + mysql 数据入库乱码问题

ssh2 + mysql 数据入库乱码问题

数据库直接放入中文,显示正常。

通过web工程向数据库查询中文,页面显示正常。

通过web工程向数据库插入,修改中文,数据库内显示不正常。出现乱码【??】,页面反映出来的也是【??】问号乱码

我的工程整个接触到乱码解决的地方如下:

————————————–

struts2:struts.xml里:

<constant name=”struts.i18n.encoding” value=”utf-8″></constant>

————————————–

tomcat6:confserver.xml:

  <connector port=”8080″ protocol=”http/1.1″

connectiontimeout=”20000″

redirectport=”8443″ uriencoding=”utf-8″/>

————————————–

mysql:my.ini:

default-character-set=utf8

数据库检查也确认是utf-8

————————————–

页面:所有页面只都是utf-8编码,没有额外编码冲突:

<%@ page language=”java” import=”java.util.*” pageencoding=”utf-8″%>

————————————–

试问为啥会出现数据入库乱码问题?

哪需要修改?

核心思想是“所有编码要统一”:以统一成utf-8为例

1. 开发工程相关

选中工程,点击右键,properties,看你工程的编码是不是也是UTF-8

2. tomcat相关

(1)在tomcat的conf/server.xm中改写为

<Connector port=”8080″ protocol=”HTTP/1.1″

  connectionTimeout=”20000″

  redirectPort=”8443″ URIEncoding=”UTF-8″/>

也就是增加URIEncoding=”UTF-8″

3. 应用相关

(1)web.xml 中写一个监听器:

<filter>

<filter-name>CharacterEncodingFilter</filter-name>

<filter-class>

<!– lee.AuthorityFilter –>org.springframework.web.filter.CharacterEncodingFilter

</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

  </filter>

  <filter-mapping>

<filter-name>CharacterEncodingFilter</filter-name>

<url-pattern>/*</url-pattern>

  </filter-mapping>

(2) 在applicationContext.xml里配置

jdbc.url=jdbc:mysql://localhost:3306/dddddd?useUnicode=true&characterEncoding=utf8

的时候出了问题,后来改成了

jdbc.url=jdbc:mysql://localhost:3306/dddddd?useUnicode=true&amp;characterEncoding=utf8

PS:将&改成了&amp;

之后通过了,应该是xml的问题

(3)所有的jsp网页全部采用uft-8编码

<%@ page language=”java” contentType=”text/html; charset=UTF-8″

pageEncoding=”UTF-8″%>

或者

<%@ page contentType=”text/html; charset=UTF-8″%

3. 数据库相关

在向mysql插入中文字符时,经常会出现乱码问题,经分析如下:

       核心问题就是数据库服务器无法从URL中获知Client使用了哪个编码。于是就使用数据库服务器上默认编码(default-character-set来解析用户发送的sql语句。这样,原本用户是用操作系统的编码(java 是以unicode编码保存),但是服务器硬给转成default-character-set,所以就乱码了。

Client端只要配置好

useUnicode=true

characterEncoding=utf-8

即:DBURL=jdbc:mysq://localhost/test?useUnicode=true&characterEncoding=utf-8

这两个属性。只要指定了,就不会乱码。utf-8可以,gb2312可以,gbk可以。指定了什么,Client就默认以这种

编码转换SQL语句,服务器也就知道怎么转会去。相当于告诉服务器,我客户端是以什么编码发送的,你可以看着办吧。

(1)看看是你插入数据库之前是乱码还是之后是乱码

  public void checkEncode() throws SQLException {

ResultSet rs = this.conn.createStatement().executeQuery(“SHOW VARIABLES LIKE ‘character_set_%'”);

while(rs.next()){

System.out.println(rs.getString(1) +”, ” +  rs.getString(2));

}

rs.close();

}

结果用select()方法查询结果如下:

character_set_client,latin1    //将按latin1进行编码转换,此时插入中文当然会有乱码问题

character_set_connection,latin1

character_set_database,utf8

character_set_filesystem,binary

character_set_results,

character_set_server,latin1    //服务器default-character-set的设置

character_set_system,utf8

character_sets_dir,/usr/local/mysql-standard-5.0.27-Linux-i686/share/mysql/charsets/

注意第一行就可以了,可见使用的是latin1。

而latin1本身就无法表示汉字,经过这个编码打包的SQL语句发给Server,Server也用Lat

ssh2 + mysql 数据入库乱码有关问题

相关文章:

你感兴趣的文章:

标签云: