第12章 JDBC详解中Mysql中文乱码问题

前言:这篇日志关于我在学习《java web 整合开发 王者归来》这本书中第十二章 jdbc详解中遇到的MySQL乱码的问题,解决问题的过程中,学习到了一些mysql知识点,想把这些知识点总结起来。
一、问题简述
    一个例子是列出人员信息,需要先建立数据表,并且插入相关内容,原来的sql语句中提供的如下:
DROP DATABASE IF EXISTS databaseWeb;    -- 如果存在,则删除模式 databaseWeb

CREATE DATABASE databaseWeb CHARACTER SET utf8; -- 创建模式 databaseWeb。使用 utf8 编码

USE databaseWeb;    -- 切换到模式 databaseWeb,以下操作均在 databaseWeb 下

set NAMES 'gbk';    -- 控制台使用 gbk 编码

DROP TABLE IF EXISTS tb_person; -- 如果存在,删除表 tb_person

CREATE TABLE tb_person (        -- 创建表

  id INTEGER AUTO_INCREMENT COMMENT 'id',

  name VARCHAR(45) COMMENT '姓名',

  english_name VARCHAR(45) COMMENT '英文名',

  age INTEGER UNSIGNED COMMENT '年龄',

  sex VARCHAR(45) COMMENT '性别',

  birthday DATE COMMENT '出生日期',

  description TEXT COMMENT '备注',

  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP() COMMENT '创建时间',

  PRIMARY KEY (id)

);

 

INSERT INTO tb_person   -- 插入数据

( name, english_name, age, sex, birthday, description ) values

( '刘京华', 'Helloweenvsfei', '25', '', '1982-08-09', '无备注' );

 

INSERT INTO tb_person

( name, english_name, age, sex, birthday, description ) values

( '科特柯本', 'Kurt Cobain', '27', '', '1967-02-20', 'Nirvana' );

 

INSERT INTO tb_person

( name, english_name, age, sex, birthday, description ) values

( '王菲', 'Faye', '31', '', '1969-08-08', '狮子座' );

 

INSERT INTO tb_person

( name, english_name, age, sex, birthday, description ) values

( '艾薇儿', 'Avril Lavigne', '24', '', '1984-09-27', '星座:天秤座' );

 

INSERT INTO tb_person

( name, english_name, age, sex, birthday, description ) values

( 'W. AXL ROSE', 'W. AXL ROSE', '45', '', '1962-02-06', 'GNR' );

 

INSERT INTO tb_person

( name, english_name, age, sex, birthday, description ) values

( '柯蒂斯', 'Ian Curtis', '50', '', '1956-07-15', 'Joy Division' );

 

INSERT INTO tb_person

( name, english_name, age, sex, birthday, description ) values

( '巴菲特', 'Warren Buffett', '78', '', '1930-08-30', 'Stock' );

 

INSERT INTO tb_person

( name, english_name, age, sex, birthday, description ) values

( '比尔盖茨', 'Bill Gates', '18', '', '1955-10-28', 'Microsoft' );

 

 

DROP TABLE IF EXISTS tb_book;   -- 如果存在,删除表 tb_person

 

CREATE TABLE tb_book (      -- 创建表

  id INTEGER AUTO_INCREMENT COMMENT 'id',

  person_id INTEGER,

  name VARCHAR(45) COMMENT '数目',

  publish_date DATE COMMENT '出版日期',

  description TEXT COMMENT '备注',

  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP() COMMENT '创建时间',

  PRIMARY KEY (id)

);
SQL代码

    创建tb_person表之后,使用insert into语句之后总会出现问题,因为插入的是汉字,所以一直会报告各种各样的错误,在网上查找了一下相关原因,主要是编码问题,最开始的解决方案是把MySQL的编码换成gbk类型的,但是始终不成功,知道都改变成了utf8这种格式,才解决问题,解决问题的过程中,学习到了不少知识点,想把这些知识点总结起来。

MySQL字符集支持:

    MySQL的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。

    排序方式指的如何比较大小,对于a,A和B,来说如果采用字典序排序原则那么A,a>B,b,但是采取二进制ascii码的情况下,'A'<'B'<'a'<'b'。

    对于字符集的支持细化到四个层次:服务器(server),数据库(database),数据表(table)和连接(connection)。 通俗的讲就是服务器默认的字符集类型,数据库默认的数据类型,数据表默认的数据类型,连接默认的数据类型。

    可以使用SHOW VARIABLES LIKE 'character%';这个命令查看各个层次的字符串的配置信息。

     

    1character_set_client代表客户端使用的编码,character_set_connection代表查询时使用的编码,character_set_resultlts代表返回结果时使用的编码格式,如果编码设置的不正确就可能产生乱码现象。

    当需要修改编码类型时,可以通过set character_set_connection=GBK,这样的方式修改编码类型。

   3 在网上经常能看到set names= utf8 这类的命令,这个命令的它相当于下面的三句指令:
    SET character_set_client = utf8;
    SET character_set_results = utf8;
    SET character_set_connection = utf8;

   4 utf8可以应用于绝大多数的语言,包括中文,人们一般都推荐使用utf8作为默认的字符集,一些MySQL中文工具在utf8上,可能出现乱码,因此需要设置成gbk编码
如果全站都是中文类型的话,
则可以设置为gbk编码,但是需要把数据库服务器的编码格式都设置为gbk,使用set命令。
但是我在实践过程中发现gbk也没有办法解决
我的中文乱码问题,采用utf8编码才解决的问题
   5 通过show create table 命令可以知道表的编码
   6修改表中某列的编码方式
                                                                
                                                                菜包子
                                                  2013年6月11日15:49:43于宿舍

       
原文地址:https://www.cnblogs.com/CaiBaoZi/p/3131844.html