ssh2 + mysql 数据入库乱码问题

ssh2+mysql数据入库乱码问题

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

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

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

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

--------------------------------------

struts2:struts.xml里:

<constantname="struts.i18n.encoding"value="utf-8"></constant>

--------------------------------------

tomcat6:confserver.xml:

<connectorport="8080"protocol="http/1.1"

connectiontimeout="20000"

redirectport="8443"uriencoding="utf-8"/>

--------------------------------------

mysql:my.ini:

default-character-set=utf8

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

--------------------------------------

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

<%@pagelanguage="java"import="java.util.*"pageencoding="utf-8"%>

--------------------------------------

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

哪需要修改?

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

1.开发工程相关

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

2.tomcat相关

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

<Connectorport="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编码

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"

pageEncoding="UTF-8"%>

或者

<%@pagecontentType="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)看看是你插入数据库之前是乱码还是之后是乱码

publicvoidcheckEncode()throwsSQLException{

ResultSetrs=this.conn.createStatement().executeQuery("SHOWVARIABLESLIKE'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也用Latin1解析也无法还原。当然如果设置default-character-set=utf8,是不会出现乱码的。

*/

(2).在mysql的my.ini中添加

default-character-set=utf8

(3)建成的数据库、表、字段全部统一编码:utf-8

也即整理为utf8_general_ci

相关推荐