zoukankan      html  css  js  c++  java
  • MySQL相关的中文编码错误解决【转】

    在一个用Struts + Spring+ Hibernate + Mysql架构的的项目里,通过前台表单向后台MySql数据库添加

    数据,当遇到提交中文信息的时候,问题总是比较多,我见过的出错的情况有两种:

         1)错误情况1:

           ERROR 1366 (HY000): Incorrect string value

            Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1 
    Hibernate flushing: Could not execute JDBC batch update; uncategorized SQLException for SQL [insert into blog (comments, content, createdate, description, tid, title, uid, id) values (?, ?, ?, ?, ?, ?, ?, ?)]; SQL state [HY000]; error code [1366]; Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1; nested exception is java.sql.BatchUpdateException: Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1

         2)错误情况2:

          提交时不报错,但是数据库中插入的中文显示为如“???”的乱码,同时在控制台打印的也是“???”的乱码字符。

          因此涉及到中文字符的问题时,要格外注意“字符集编码”的问题。

    ====================

          总结一下,在这样一个项目里,涉及到设置字符集的地方有:

    1、JSP页面文件的编码:

           <%@ page pageEncoding="utf-8"%>

    2、Struts、Spring配置文件(XML)的编码:

           <?xml version="1.0" encoding="utf-8"?>

    3、Hibernate映射文件的编码:

            <?xml version="1.0" encoding="utf-8"?>

    4、数据源配置中jdbcurl(数据库连接)指定的编码:

           如果在spring配置文件applicationContext.xml里配置,在数据源的节点中添加jdbcUrl属性如下:

          jdbc:mysql://localhost:3306/dbname?useUnicode=true&amp;characterEncoding=utf-8

          或者,如果在hibernate配置文件中,可以添加如下两个属性的配置代码:

          <property name="connection.useUnicode">true</property>
       <property name="connection.characterEncoding">utf-8</property>

    5、Mysql默认字符集:

           在Mysql的安装根目录下,my.ini中:

    # The default character set that will be used when a new schema or table is
    # created and no character set is defined

    default-character-set=utf-8

             安装时,默认的字符集是latin1.

            Mysql默认字符集,可以在安装时配置,也可以通过Mysql自带的MySQL Server Instance Config Wizard重新配置,配置后重启服务才可生效。

    6、数据库表字段的字符集:

          MySQL对于字符集的指定可以细化到一个数据库,一张表,一列(字段),应该用什么字符集。

          通过在create语句中添加character set 参数指定相应的字符集,如果不指定,则会默认使用其上一个层

    级的字符集。

    ==============问题分析=============

         那么,来分析一下,问题可能是出现在什么地方?

          结合以上总结的可能出错的几个地方,我逐一进行了测试,最后发现和预想的结果一致:

         通过报错信息可以看出,这个问题应该是表单提交的中文字符与Mysql本身的字符集的设置有冲突导致

    的,因此排除项目中那些与页面文件相关的字符集设置。

         网上有些地方说,这个问题与下面这个配置中指定的字符集相关:

          jdbc:mysql://localhost:3306/dbname?useUnicode=true&amp;characterEncoding=utf-8

          但是,经过我的验证,问题可能并不在此。

          经过反复的测试验证,我确定问题就出在Mysql本身默认字符集的设置上。

         通过命令: mysql> SHOW VARIABLES LIKE 'character%';

    查看Mysql默认字符集的相关设置:
    +--------------------------+---------------------------------+
    | Variable_name | Value |
    +--------------------------+---------------------------------+
    | character_set_client | latin1 |
    | character_set_connection | latin1 |
    | character_set_database | latin1 |
    | character_set_filesystem | binary |
    | character_set_results | latin1 |
    | character_set_server | latin1 |
    | character_set_system | utf8 |
    | character_sets_dir        | D:\Program Files\MySQL\MySQL Server 5.1\share\charsets\ |
    +--------------------------+---------------------------------+

           由于表是根据hibernate映射文件在spring容器加载启动时自动创建的,没有为数据库、表和表的字段

    指定字符集,因此,创建时均使用Mysql默认的latin1字符集,而这个字符集显然根本不可能处理中文字符,

    上面的报错信息就是因为它而产生的。

           因此,通过修改Mysql的默认字符集或者在创建数据库、表和表的字段时指定字符集解能决这个问题。

         下面,以修改Mysql的默认字符集为例说明。

          为了让Mysql支持中文字符,可以把它的默认字符集设置为:

          utf-8     ——支持几乎所有字符

          gb2312 ——是简体中文的码

          gbk        ——支持简体中文及繁体中文

           中的任何一个。

          修改默认字符集的方法如下:


    (1) 最简单的修改方法,就是修改Mysql的my.ini文件中的字符集键值,


    如 default-character-set = utf8
    character_set_server = utf8


    修改完后,重启mysql的服务,service mysql restart。


    使用 mysql> SHOW VARIABLES LIKE 'character%';查看,发现数据库编码均已改成utf8
    +--------------------------+---------------------------------+
    | 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:\Program Files\MySQL\MySQL Server 5.1\share\charsets\ |
    +--------------------------+---------------------------------+

    (2) 还有一种修改字符集的方法,就是使用mysql的命令


    mysql> SET character_set_client = utf8 ;
    mysql> SET character_set_connection = utf8 ;
    mysql> SET character_set_database = utf8 ;
    mysql> SET character_set_results = utf8 ;
    mysql> SET character_set_server = utf8 ;

    mysql> SET collation_connection = utf8 ;
    mysql> SET collation_database = utf8 ;
    mysql> SET collation_server = utf8 ;

    修改完成后,我重启了应用,再次提交中文,搞定了!

    ===================相关文章====================

    对Mysql字符集相关知识更详细的介绍请看:

    1、Mysql字符集设置详解

    2、GBK、GB2312、UTF8区别,解决MYSQL中文乱码问题

  • 相关阅读:
    [网站设计]网站设计的流程
    教你几招如何看透一个人
    难得迷茫
    java 日期 加减 运算
    第01章 SQL Server数据库基础 读后感
    [网站设计]如何设计一个成功的网站
    [网站设计] 素材网罗
    转载个人毕业5年职业感想
    SWTDesigner
    [存档]asp.net夜话之十一:web.config详解收藏
  • 原文地址:https://www.cnblogs.com/yigerendehaibian/p/3099042.html
Copyright © 2011-2022 走看看