遇到这种情况,现有项目的数据库已经建好,数据表也已经创建完成。

问题来的,数据库不能插入中文,调试时候发现中文数据从发送请求到最后请求处理完成这些步骤,中文还没有发生乱码。

只有在存储到数据库后查询数据并显示才会乱码。

那么到此可以确定是mysql出现问题了。

那么应该怎么办呢?哈哈,当然是看我们的度娘啦!

看的下度娘解决方法是:

将数据库的编码修改为utf8编码格式,因为安装mysql默认使用的字符编码latin1

what?这个编码是什么鬼,见都没见过。

查了下,Latin1是ISO-8859-1的别名。因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃

这个latin1编码是单字节编码,而一般汉字是需要两个字节存储,所以这个编码格式不支持汉字。

接下来就看怎么改吧

数据库字符优先级有:系统级、数据库级、表级、字段。这5个优先级中字段优先级最高。举个列子。我们要向表中存储中文数据。如果表的字符编码是utf8,而字段的字符编码是latin1。那么如果我们存储中文还是会出现乱码,因为使用的编码是字段的字符编码latin1

在数据库创建时如果不设置数据库的默认字符编码,即缺省时会使用系统的字符编码latin1。创建表缺省时使用数据库的字符编码,字段同理。

从上面可以得出一个重要结论,创建数据库时一定要指定默认字符编码!

1、

首先我们查看mysql数据库服务器,客户端,数据库连接,文件系统等的字符编码
show variables like '%char%';
+--------------------------+-------------------------------------+------
| Variable_name | Value |......
+--------------------------+-------------------------------------+------
| character_set_client | utf8 |...... -- 客户端字符集
| character_set_connection | utf8 |......
| character_set_database | latin1|...... -- 数据库字符集
| character_set_filesystem | binary |......
| character_set_results | utf8 |......
| character_set_server | latin1|...... -- 服务器字符集
| character_set_system | utf8 |......
| character_sets_dir | D:\MySQL Server 5.0\share\charsets\ |......
+--------------------------+-------------------------------------+------

默认安装完mysql数据库时,服务器和数据库使用的编码是latinn1编码格式。

这个上面没有问题,可以先不用考虑

网上看到很多人要修改这个系统级的字符编码,我也不知道什么原因,改完之后中文乱码问题就得到解决了

2、

查看数据库的创建语句。以默认的数据库mysql为例

show create database mysql

可以发现其的default character set默认字符编码格式是latin1。由此可以看出,缺省时会自动使用latin1

所以我们需要在创建数据库时指定默认的编码格式

create database 数据库名 CHARACTER SET utf8 COLLATE utf8_general_ci;

修改已创建的数据库的编码

alter database 数据库表名 CHARACTER SET utf8 COLLATE utf8_general_ci;

3、

查看数据库中匹配到的表的编码格式。

show table status from 数据库名 like 'pattern/匹配模式';

查看数据库中所有表的编码格式
show table status from mysql like '%%';

4、

修改表的默认编码格式。有两种方法

  • alter table 表名 character set utf8 COLLATE utf8_general_ci;
  • alter table 表名 convert to character set utf8;

第一种是仅仅修改表的字符编码,而字段的字符编码还是latin1编码格式,这种改变没有意义

    可以查看数据表中所有列的字符编码,就可以发现字段的字符编码是否发生改变。
    show full columns from 表名;

第二种会将表和字段的编码都更改为utf8编码格式。

5、

中文乱码问题得到解决的,但是数据库里那么多表,我们总不可能一个表一个表的进行修改吧,所以我们要使用存储过程,

加动态sql语句的方式使用循环自动修改数据库内的所有数据表的编码格式。

注意:如果修改完后中文存储还是乱码。将连接数据库的连接后面指定编码格式为utf8

如果还是不行,那么将mysql默认的字符编码进行修改,即下面的characterEncoding

jdbcUrl = jdbc:mysql://主机域名:3306/数据库名?characterEncoding=utf8&useSSL=false&useUnicode=true

useSSL:与服务器进行通信时使用SSL,默认值为“假

参考主要参数,表数据来源Mysql JDBC Url参数说明

参数名称 参数说明 缺省值 最低版本要求
user 数据库用户名(用于连接数据库)   所有版本
password 用户密码(用于连接数据库)   所有版本
useUnicode 是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true false 1.1g
characterEncoding 当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk false 1.1g
autoReconnect 当数据库连接异常中断时,是否自动重新连接? false 1.1
autoReconnectForPools 是否使用针对数据库连接池的重连策略 false 3.1.3
failOverReadOnly 自动重连成功后,连接是否设置为只读? true 3.0.12
maxReconnects autoReconnect设置为true时,重试连接的次数 3 1.1
initialTimeout autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒 2 1.1
connectTimeout 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本 0 3.0.1
socketTimeout socket操作(读写)超时,单位:毫秒。 0表示永不超时

mysql数据库修改字符编码问题的更多相关文章

  1. 前端页面汉子显示为问号,需修改 linux下面修改mysql 数据库的字符编码为utf8

    设置MySQL数据库编码为UTF-8 登陆后查看数据库当前编码:SHOW VARIABLES LIKE 'char%'; 修改/etc/mysql/my.cnf (默认安装路径下) (标签下没有的添加 ...

  2. mysql之修改字符编码

    目录 统一修改字段编码 修改单个字段编码 修改表字符编码 统一修改字段编码: alter table `tablename` convert to character set utf8; 修改表字符编 ...

  3. mysql命令行修改字符编码

    1.修改数据库字符编码 mysql> alter database mydb character set utf8 ; 2.创建数据库时,指定数据库的字符编码 mysql> create ...

  4. MySQL查看和修改字符编码

    MySQL的默认编码是Latin1,不支持中文,要支持中午需要把数据库的默认编码修改为gbk或者utf8. 1.需要以root用户身份登陆才可以查看数据库编码方式(以root用户身份登陆的命令为:&g ...

  5. MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) - 转载

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...

  6. mysql5.6修改字符编码,ERR:Illegal mix of collations for operation 'concat'

    mysql5.6修改字符编码,ERR:Illegal mix of collations for operation 'concat' 1.问题起因:搭建环境初始化mysql的时候看到mysql配置文 ...

  7. MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码)

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...

  8. centos中文乱码修改字符编码使用centos支持中文

    如何你的centos显示中文乱码,只要修改字符编码使centos支持中文就可以了,没有这个文件可以创建它,下面是修改步骤 一.中文支持 安装中文语言包: 复制代码 代码如下: yum groupins ...

  9. 查看MySQL数据库的默认编码

    查看MySQL数据库的默认编码 1.使用status命令能够显示数据库的相关系信息,示例如下: mysql> status;————–mysql Ver 14.12 Distrib 5.0.77 ...

随机推荐

  1. hdu 5009 离散化

    http://acm.hdu.edu.cn/showproblem.php?pid=5009 有一段序列,涂连续一段子序列的代价为该子序列出现不同数字个数的平方,求最小代价涂完整个序列. ai有10^ ...

  2. 【最大流之ek算法】HDU1532 求最大流

    本来是继续加强最短路的训练,但是遇到了一个最短路 + 最大流的问题,最大流什么鬼,昨天+今天学习了一下,应该对ek算法有所了解,凭借学习后的印象,自己完成并ac了这个最大流的模板题 题目大意:都是图论 ...

  3. 网页程序 vs 桌面程序

    网页程序 vs 桌面程序 阅读:  评论:  作者:Rybby  日期:  来源:rybby.com 所谓的网页程序就是指以网页作为程序的操作界面,通过脚本语言“javascript”或其它客户端语言 ...

  4. sqlserver 实现数据变动触发信息

    1.建立存储过程,功能是动态写入文件中信息,可以在触发器或存储过程调用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO create proc [d ...

  5. Android-ColorsUtil工具类

    颜色工具类 public class ColorsUtil { private ColorsUtil() { throw new Error("Do not need instantiate ...

  6. NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(转载)

    原文地址:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_FluentValidation_1.html 阅读目录 1.基本介绍 ...

  7. 用ndp部署storm应用

    本文由作者余宝虹授权网易云社区发布. 使用户ndp部署一个Java应用大家都非常熟悉的,但是看到某些同学用非常繁琐的方式部署storm应用的时候,我觉得很有必要整一个帮助教程,ndp帮助文档里面没有, ...

  8. Day 27 类的进阶-反射

    11. __new__ 和 __metaclass__ 阅读以下代码: 1 2 3 4 5 6 class Foo(object): def __init__(self): pass obj = Fo ...

  9. eclipse代码中使用到Launcher获取类加载器,找不到启动器类。

    解决:移除系统依赖的jar包,重新导入. 只需要在project build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了 ...

  10. 电脑网络IP固定地址自动改变!

    今天电脑的固定IP地址每次重启设备,会自动改变一次.所以每次重启电脑都要手动重设IP地址.网关.DNS及高级选项中的ip设置. 高级选项中的ip设置每次都有2个ip,都要我删除一个.我都崩溃了,还以为 ...