zoukankan      html  css  js  c++  java
  • 第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于宿舍

           
  • 相关阅读:
    python实现kNN(最近邻)
    拉格朗日对偶
    拉格朗日乘子法和KKT约束
    python实现支持向量机之具体实现
    python实现支持向量机之非线性支持向量机和核函数(理论五)
    Python 装饰器实例
    Linux 系统下 matplotlib 中文乱码解决办法
    Python logging 模块学习
    Matplotlib 知识点整理
    Python Matplotlib 中文显示参数设置
  • 原文地址:https://www.cnblogs.com/CaiBaoZi/p/3131844.html
Copyright © 2011-2022 走看看