• JDBC 中文编码


    在使用JDBC开发的过程中,通常会遇到中文保存到数据库乱码的问题。

    这个问题的产生有3个方面:

    1. 数据库,包括数据库编码、表编码、字段编码等
    2. 在Java Web 程序中,请求对象(Request)未进行编码处理
    3. JDBC连接数据的URL未加字符编码参数

     下面们从3个方向演示一些解决方法。


    MySQL数据库编码

    在创建数据库时,在创建表时,在创建字段时,留意下编码是不是UTF-8。

    如下面的创建数据库脚本将字符编码设置为UTF-8

    1
    CREATE DATABASE `northwind` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;

    下面的建表脚本将表字符编码和字段字符编码设置为UTF-8

    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `bigtb` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(45) COLLATE utf8_bin DEFAULT NULL,
      `file` mediumtext COLLATE utf8_bin DEFAULT NULL,
      `images` longblob DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    在使用MySQL Workbench工具创建数据库、表、字段时可以下拉选择字符编码,非常方便。


    请求对象编码

    在Java Web 程序中,可以拦截请求对象(Request),设置UTF-8编码。

    只在写一个过滤器Filter,所有请求编码都生效。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;
     
    /**
     * Servlet Filter implementation class CharsetEncodingFilter
     */
    @WebFilter(urlPatterns = {"/*"}, initParams = {
        @WebInitParam(name = "encoding", value = "UTF-8")})
    public class CharsetEncodingFilter implements Filter {
     
        private FilterConfig config;
     
        public CharsetEncodingFilter() {
        }
     
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
        }
     
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            request.setCharacterEncoding(config.getInitParameter("encoding"));
            chain.doFilter(request, response);
        }
     
        @Override
        public void init(FilterConfig fConfig) throws ServletException {
            this.config = fConfig;
     
        }
     
    }

    JDBC URL参数编码

    只要在连接URL字符里添加参数 ?useUnicode=true&characterEncoding=utf-8

    完整的URL字符串如下:

  • 相关阅读:
    关于打开或关闭Windows功能呈现空白的问题
    顺序表(C++)
    新的旅途
    javascript初识——初学1
    读:程序员成长路线图.后感
    学习之路十六:自定义数据库通用类 → 模仿+改进
    20120716 → 20120722 周总结
    工作的思考五:冷静分析SQL
    20120708 → 20120715 周总结
    20120813 → 20120819 周总结
  • 原文地址:https://www.cnblogs.com/q2546/p/11505283.html
Copyright © 2020-2023  润新知