[导入][AppFuse] AppFuse使用手记--数据库中文问题(四) [原]
先按以前的经验, [MYSQL] 三步解决MysSQL中文问题 。
修改pom.xml:
修改taglibs.jsp:
修改web.xml:
结果,查询显示正确,但是更新和插入都出现乱码。
反复折腾了好久,更新和插入还是乱码,估计是AppFuse里哪部分代码做了字符转行,现在对AppFuse还不是很熟悉,也不知道该从哪里下手。
上网查了查,说UTF-8编码是一种兼容所有语言的编码方式,所以UTF-8才是王道。又绕回到UTF-8上来,既然AppFuse默认就是UTF-8,那问题就应该不是出在AppFuse上,应该是在MySQL上。
把数据库全都切换到utf8上,数据库和表的DDL都加上字符集设置:
修改MySQL的配置文件my.ini:
可以通过下面的命令查看字符集:
经过上面的修改,中文问题就解决了,AppFuse的CRUD都正常了。
如果使用MySQL Command Line Client,我们查看数据库看到是还是乱码,执行插入时还会报错:“ Data too long for column 'type_name' at row 1”。可以在执行前,先执行:set names gbk,这样就可以了。
附一:Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别
附二:
使用MySQL的命令终端时,如果输入SQL有误,将有beep声。若要关闭该功能,根据mysql --help,使用mysql --no-beep即可。
修改my.ini
在[mysql] 下加入一行 :
文章来源: http://heyday.blogcn.com/diary,15090253.shtml
修改pom.xml:
<jdbc.url><![CDATA[jdbc:mysql://localhost/reda?createDatabaseIfNotExist=true&characterEncoding=gbk]]></jdbc.url>
修改taglibs.jsp:
<%@ page language="java" errorPage="/error.jsp" pageEncoding="GBK" contentType="text/html;charset=GBK" %>
修改web.xml:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
结果,查询显示正确,但是更新和插入都出现乱码。
反复折腾了好久,更新和插入还是乱码,估计是AppFuse里哪部分代码做了字符转行,现在对AppFuse还不是很熟悉,也不知道该从哪里下手。
上网查了查,说UTF-8编码是一种兼容所有语言的编码方式,所以UTF-8才是王道。又绕回到UTF-8上来,既然AppFuse默认就是UTF-8,那问题就应该不是出在AppFuse上,应该是在MySQL上。
把数据库全都切换到utf8上,数据库和表的DDL都加上字符集设置:
CHARACTER SET utf8 COLLATE utf8_general_ci
修改MySQL的配置文件my.ini:
default-character-set=utf8
可以通过下面的命令查看字符集:
mysql> show variables like 'character_set_%';
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:\Dev\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+-----------------------------------------------+
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:\Dev\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+-----------------------------------------------+
经过上面的修改,中文问题就解决了,AppFuse的CRUD都正常了。
如果使用MySQL Command Line Client,我们查看数据库看到是还是乱码,执行插入时还会报错:“ Data too long for column 'type_name' at row 1”。可以在执行前,先执行:set names gbk,这样就可以了。
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from company_type;
+---------+-----------+--------+
| type_id | type_name | status |
+---------+-----------+--------+
| 1 | 娴嬭瘯 | |
| 2 | 鍑洪敊 | |
+---------+-----------+--------+
2 rows in set (0.00 sec)
mysql> insert into company_type(type_name,status) values('出错',1);
ERROR 1406 (22001): Data too long for column 'type_name' at row 1
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into company_type(type_name,status) values('出错',1);
Query OK, 1 row affected (0.03 sec)
mysql> select * from company_type;
+---------+-----------+--------+
| type_id | type_name | status |
+---------+-----------+--------+
| 1 | 测试 | |
| 2 | 出错 | |
| 3 | 出错 | |
+---------+-----------+--------+
3 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> select * from company_type;
+---------+-----------+--------+
| type_id | type_name | status |
+---------+-----------+--------+
| 1 | 娴嬭瘯 | |
| 2 | 鍑洪敊 | |
+---------+-----------+--------+
2 rows in set (0.00 sec)
mysql> insert into company_type(type_name,status) values('出错',1);
ERROR 1406 (22001): Data too long for column 'type_name' at row 1
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into company_type(type_name,status) values('出错',1);
Query OK, 1 row affected (0.03 sec)
mysql> select * from company_type;
+---------+-----------+--------+
| type_id | type_name | status |
+---------+-----------+--------+
| 1 | 测试 | |
| 2 | 出错 | |
| 3 | 出错 | |
+---------+-----------+--------+
3 rows in set (0.00 sec)
附一:Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别
当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。
utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß’等于‘ss’。
utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的 校对规则相比,比较正确性较差)。
例如,使用utf8_general_ci和utf8_unicode_ci两种 校对规则下面的比较相等:
Ä = A
Ö = O
Ü = U
两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:
ß = s
但是,对于utf8_unicode_ci下面等式成立:
ß = ss
对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。
utf8_general_ci也适用与德语和法语,除了‘ß’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。
附二:
使用MySQL的命令终端时,如果输入SQL有误,将有beep声。若要关闭该功能,根据mysql --help,使用mysql --no-beep即可。
修改my.ini
在[mysql] 下加入一行 :
no-beep
文章来源: http://heyday.blogcn.com/diary,15090253.shtml