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