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&characterEncoding=utf8
PS:将&改成了&
之后通过了,应该是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