[导入][AppFuse] AppFuse使用手记--数据库中文问题(四) [原]

[导入][AppFuse] AppFuse使用手记--数据库中文问题(四) [原]

    先按以前的经验, [MYSQL] 三步解决MysSQL中文问题 。

    修改pom.xml:
    <jdbc.url><![CDATA[jdbc:mysql://localhost/reda?createDatabaseIfNotExist=true&amp;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>

    结果,查询显示正确,但是更新和插入都出现乱码。
   
    反复折腾了好久,更新和插入还是乱码,估计是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\ |
    +--------------------------+-----------------------------------------------+

    经过上面的修改,中文问题就解决了,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)



     附一: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

你可能感兴趣的:([导入][AppFuse] AppFuse使用手记--数据库中文问题(四) [原])