今天在做Hibernate案例,往mysql中写记录的时候,出现ERROR: Incorrect string value: '\xE5\x8A\xA0\xE5\x86\x85...' for column 'content' at row 1

后来发现在程序中写的字符串编码采用的是utf-8,但是由于我是通过非安装方式装的mysql,没有设置数据库默认的码表,所以数据库默认的码表不是utf-8,而是latin1:

找到原因后通过修改数据库码表的方式问题解决,成功向数据库存入记录。下面通过查看网上相关细聊,总结下修改MySQL字符集的问题:

首先,MySQL的字符集问题主要是两个概念,一个是Character Sets,一个是Collations,前者是字符内容
及编码,后者是对前者进行比较操作的一些规则。这两个参数集可以在数据库实例、单个数据库、表、列等四个级
指定。

  对于使用者来说,一般推荐使用utf8编码来存储数据。而要解决乱码问题,不单单是MySQL数据的存储问题,还
和用户的程序文件的编码方式、用户程序和MySQL数据库的连接方式都有关系。

首先,MySQL有默认的字符集,这个是安装的时候确定的,在编译MySQL的时候可以通过DEFAULT_CHARSET=
utf8和DEFAULT_COLLATION=utf8_general_ci这两个参数(MySQL5.5版本,5.1版本用--with-charset=
utf8 --with-collation=utf8_general_ci)来指定默认的字符集为utf8,这也是最一劳永逸的办法,这样指定后,
客户端连接到数据库的编码方式也默认是utf8了,应用程序不需要任何处理。

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

如 default-character-set = utf8 
character_set_server = utf8

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

使用 mysql> SHOW VARIABLES LIKE 'character%';查看,发现数据库编码均已改成utf8

  1. +--------------------------+---------------------------------+
  2. | Variable_name | Value |
  3. +--------------------------+---------------------------------+
  4. | character_set_client | utf8 |
  5. | character_set_connection | utf8 |
  6. | character_set_database | utf8 |
  7. | character_set_filesystem | binary |
  8. | character_set_results | utf8 |
  9. | character_set_server | utf8 |
  10. | character_set_system | utf8 |
  11. | character_sets_dir | D:"mysql-5.0.37"share"charsets" |
  12. +--------------------------+---------------------------------+

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

  1. mysql> SET character_set_client = utf8 ;
  2. mysql> SET character_set_connection = utf8 ;
  3. mysql> SET character_set_database = utf8 ;
  4. mysql> SET character_set_results = utf8 ;
  5. mysql> SET character_set_server = utf8 ;
  6. mysql> SET collation_connection = utf8 ;
  7. mysql> SET collation_database = utf8 ;
  8. mysql> SET collation_server = utf8 ;

一般就算设置了表的mysql默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

  1. SET NAMES 'utf8';

它相当于下面的三句指令:

    1. SET character_set_client = utf8;
    2. SET character_set_results = utf8;
    3. SET character_set_connection = utf8;

(3)最后,如果不想通过以上两种方式的修改字符集,可以在创建数据库的时候明确指定当前数据库要采用的编码方式:

create database hibernate character set  utf8;

----------------------------------------------------------------------------------------------------------

注:本文部分参考http://database.51cto.com/art/201010/229167.htm

MySQL数据库中字符集的问题的更多相关文章

  1. MySQL数据库指定字符集

    mysql 创建数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题. 我们遵循的标准是,数据库,表,字段和页面或文本的编 ...

  2. MySQL数据库中delimiter的作用概述

    以下的文章主要是向大家描述的是MySQL数据库中delimiter的作用是什么?我们一般都认为这个命令和存储过程关系不大,到底是不是这样的呢?以下的文章将会给你相关的知识,望你会有所收获. 其实就是告 ...

  3. PHP往mysql数据库中写入中文失败

    该类问题解决办法就是 在建立数据库连接之后,将该连接的编码方式改为中文. 代码如下: $linkID=@mysql_connect("localhost","root&q ...

  4. MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述

    MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...

  5. 从Mysql数据库中导入导出表结构

    1.从Mysql数据库中导入sql表 很简单,只需要一个命令即可搞定:[root@localhost ~]# mysql -uroot -piweb_xxx_mysql iweb < modif ...

  6. 从SQLSERVER/MYSQL数据库中随机取一条或者N条记录

    从SQLSERVER/MYSQL数据库中随机取一条或者N条记录 很多人都知道使用rand()函数但是怎麽使用可能不是每个人都知道 建立测试表 USE [sss] GO ,NAME ) DEFAULT ...

  7. 在mysql数据库中制作千万级测试表

    在mysql数据库中制作千万级测试表 前言: 最近准备深入的学一下mysql,包括各种引擎的特性.性能优化.分表分库等.为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张 ...

  8. Oracle数据库中实现mysql数据库中auto-increment功能

    在Mysql数据库中,想要实现一条数据的自增一功能(即插入此数据时填写null即可,系统自动+1),可直接在所在列使用语句auto-increment. id int primary key auto ...

  9. 查看MYSQL数据库中所有用户及拥有权限

    查看MYSQL数据库中所有用户 mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM m ...

随机推荐

  1. 【python 下载】-各种版本都有!

    python 是一种全功能的语言,2.7很稳定,成熟的版本,且有很多开源的模块. 小编个人觉得python有一个很大的优点,就是语法简练,甚至可以说简单.比起pascal或者 C什么的,简单的难以置信 ...

  2. 《Programming with Objective-C》第三章 Working with Objects

    Object和普通变量的区别 If you’re used to using terms like the stack and the heap, a local variable is alloca ...

  3. 用Python开始机器学习(7:逻辑回归分类) --好!!

    from : http://blog.csdn.net/lsldd/article/details/41551797 在本系列文章中提到过用Python开始机器学习(3:数据拟合与广义线性回归)中提到 ...

  4. SuperSocket 1.6.4 通过FixedHeaderReceiveFilter解析自定义协议

    SuperSocket 提供了一些通用的协议解析工具, 你可以用他们简单而且快速的实现你自己的通信协议: TerminatorReceiveFilter (SuperSocket.SocketBase ...

  5. Unity 模型导入导出

    从3DMAX导出,参考: http://tieba.baidu.com/p/2807225555 -> 使用3dmax 2013,会自带导出 fbx 的功能 -> 从 3dmax 导出 - ...

  6. 后端码农谈前端(HTML篇)第一课:HTML概述

    一.什么是HTML? HTML不是编程语言,是用来描述网页文档(页面结构)的一种标记语言: HTML指超文本标记语言(Hyper Text Markup Language),之所以称为超文本标记语言, ...

  7. DDD:整理了一些关于验证方面的文章

    http://msdn.microsoft.com/en-us/library/ff664356(v=pandp.50).aspx http://gorodinski.com/blog/2012/05 ...

  8. left join on

    问题: select * from A left join  f on e.cust=f.account_id where f.status='0' 与 select * from A left jo ...

  9. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)

    计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓 ...

  10. 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析

    当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...