第12章 JDBC详解中Mysql中文乱码问题
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) );
创建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代表返回结果时使用的编码格式,如果编码设置的不正确就可能产生乱码现象。
2 当需要修改编码类型时,可以通过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于宿舍