随心Fly的gravatar头像
随心Fly 2015-01-27 14:50:11

java读取csv格式的文件,编码是utf-8 mysql也是utf-8,读取打印正常为什么存到数据库文字乱码?

java代码如下:

String filePath = "C://***//**.csv";
        BufferedReader bufferedReader = null;
        Connection  conn = null;
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://192.168.9.90:3306/***";
        try {
            Class.forName(driver);
             conn =  DriverManager.getConnection(url, "**", "***");
     
            bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
            String line =null;
            File file=new File(filePath);
            CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
            detector.add(new ParsingDetector(false));
            detector.add(JChardetFacade.getInstance());
            detector.add(ASCIIDetector.getInstance());
            detector.add(UnicodeDetector.getInstance());
            java.nio.charset.Charset charset = null;
            try {
                charset = detector.detectCodepage(file.toURI().toURL());
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            String charsetName = null;
            if (charset != null) {
                charsetName = charset.name();
                    
            } else {
                charsetName = "UTF-8";
            }
            System.out.println(charsetName);
           while ((line = bufferedReader.readLine()) != null) {
                String[] columns = line.split("\t");
                 String last = columns[1];
                 System.out.println(last);
                 PreparedStatement pstmt = conn.prepareStatement("insert into ordernew(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13) values(?,?,?,?,?,?,?,?,?,?,?,?,?)");
                 pstmt.setString(1, columns[0]);
                 pstmt.setString(2, columns[1]);
                 pstmt.setString(3, columns[2]);
                 pstmt.setString(4, columns[3]);
                 pstmt.setString(5, columns[4]);
                 pstmt.setString(6, columns[5]);
                 pstmt.setString(7, columns[6]);
                 pstmt.setString(8, columns[7]);
                 pstmt.setString(9, columns[8]);
                 pstmt.setString(10, columns[9]);
                 pstmt.setString(11, columns[10]);
                 pstmt.setString(12, columns[11]);
                 pstmt.setString(13, columns[12]);
                 pstmt.executeUpdate();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                conn.close();
                bufferedReader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
所有回答列表(6)
最代码官方的gravatar头像
最代码官方  LV167 2015年1月27日

造成数据库存储乱码的问题很多,你正好涉及了很多流程。

1.读取文件必须是正常的utf8编码

2.写入数据库时编码也必须是正常的utf8编码

3.读取数据库时编码也必须指定。

new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));

未指定读取文件编码,改为

new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"utf-8"));

数据库连接未指定编码:

String url = "jdbc:mysql://192.168.9.90:3306/***";

改为:

String url = "jdbc:mysql://192.168.9.90:3306/***?useUnicode=true&characterEncoding=utf-8";

我记得如果是mysql5.5以上就不需要指定?useUnicode=true&characterEncoding=utf-8也可以。

评论(5) 最佳答案
随心Fly的gravatar头像
随心Fly  LV14 2015年1月27日

改了这两个地方,存到数据库还是汉字乱码的  - -  

java-北京-菜鸟的gravatar头像
java-北京-菜鸟  LV13 2015年1月28日

我也碰到这种情况了,改的是数据库编码

逝去的人的gravatar头像
逝去的人  LV6 2015年1月28日

话说你直接执行sql语句inster into乱码么,包好中文的话

j48284484的gravatar头像
j48284484  LV10 2015年1月28日

本身数据库配置是否是utf8?

billzyf的gravatar头像
billzyf  LV2 2015年1月29日

1.数据库指定编码UTF-8

2.csv文件是否以UTF-8保存的

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友