2016-06-12 6 views
-1

MySQL情報を格納するためにサーブレットを使用しています。値はコンソールに正しく表示されますが、MySQLに格納しようとすると変更されます。私はさまざまなサイトで研究しています(ほとんどの文字は?と置き換えられました)。私のものは他の奇妙なutf-8文字で置き換えられます。MySQLでのutf-8の不一致への文字コード

Ádmínistrádór - >üdmnnrr¡dr(私は単語が間違っていることを知っています)ここで

は私の情報です:

のMySQL - > 5.6

enter image description here

データベース作成:

CREATE DATABASE glassfish_realm CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

表の作成:

CREATE TABLE glassfish_users (user_name varchar(20) NOT NULL PRIMARY KEY, id varchar(20) NOT NULL,name varchar(20) NOT NULL, lastname_father varchar(255) NOT NULL,lastname_mother varchar(20) NOT NULL,birthdate varchar(255) NOT NULL,password varchar(255) NOT NULL,contrasena varbinary(255) NOT NULL,photo MEDIUMBLOB,photo_name varchar(255),tipo varchar(255) NOT NULL) CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

CREATE TABLE glassfish_users_roles (user_name varchar(20) NOT NULL, role_name varchar(20) NOT NULL, PRIMARY KEY (user_name), FOREIGN KEY (user_name) REFERENCES glassfish_users (user_name) ON UPDATE CASCADE ON DELETE CASCADE) CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

は最後がmyservlet:

boolean isMultiPart = ServletFileUpload.isMultipartContent(request); 
    request.setCharacterEncoding("UTF-8"); 

    Item data=new Item(); 
    FileInputStream fis = null; 
    File file=null; 
    String filename=""; 
    String privilegio=""; 
    String message=""; 

    if (isMultiPart) { 
     ServletFileUpload upload = new ServletFileUpload(); 

     try { 
      FileItemIterator iterate = upload.getItemIterator(request); 

      while (iterate.hasNext()) { 
       FileItemStream item = iterate.next(); 

       if (item.isFormField()) { 
        String fieldName = item.getFieldName(); 
        InputStream inStream = item.openStream(); 
        byte[] b = new byte[inStream.available()]; 
        inStream.read(b); 
        String value = new String(b); 

        data.withString(fieldName,value); 
       } else { 
        //String path = "/home/ec2-user/img"; 
        String path = "C:/Users/frhec/Desktop/photos"; 

        if((item.getContentType().substring(item.getContentType().lastIndexOf("/")+1).equals("octet-stream"))){ 
         filename=data.getString("id")+".jpeg"; 
         String relativeWebPath = "/resources/img/profile.jpg"; 
         String absoluteDiskPath = this.getServletContext().getRealPath(relativeWebPath); 
         file=new File(absoluteDiskPath); 
         fis = new FileInputStream(file); 
        }else{ 
         filename=data.getString("id")+"."+(item.getContentType().substring(item.getContentType().lastIndexOf("/")+1)); 
         file=com.devcti.io.FileUpload.processFile(path, item,data.getString("id")); 
         fis = new FileInputStream(file); 
        } 
       } 
      } 
     } catch (FileUploadException e) { 
      e.printStackTrace(); 
     } 
    } 

    Statement stmt=null; 
    PreparedStatement pre=null; 
    Connection conn=null; 

    try{ 
     ResultSet rs = null; 

     ...Conection to Database... 

     if(data.get("id")==null||data.getString("id").equals("")){ 
      stmt = conn.createStatement();    
      String sql = "SELECT user_name from glassfish_users_roles;"; 
      rs = stmt.executeQuery(sql);     

      rs.next(); 
      data=data.removeAttribute("id"); 
      String id=generateID("HSUS", rs.getMetaData().getColumnCount()); 
      stmt.close();    

      conn.setAutoCommit(false); 

      pre = conn.prepareStatement("INSERT INTO glassfish_users (ser_name, password,contrasena,tipo,photo_name,photo) VALUES (?,?,?,?,?,?,SHA2(?, 256),AES_ENCRYPT(?,'key'),?,?,?)"); 
      Map<String, Object> map = data.asMap(); 
      int cont=1; 
      pre.setString(cont, id); 

      cont++; 
      pre.setString(cont, filename); 
      cont++; 
      pre.setBinaryStream(cont, fis, (int) file.length()); 
      pre.executeUpdate(); 
      conn.commit(); 
      pre.close(); 

      stmt = conn.createStatement();    
      sql = "INSERT INTO glassfish_users_roles (user_name, role_name) VALUES ('"+data.getString("user_name")+"','"+privilegio+"');"; 
      stmt.executeUpdate(sql); 

      conn.commit(); 

      stmt.close(); 
      conn.close(); 

      ....Omited Code.... 

はどうもありがとうございまし

EDIT:

誰かが、それがサーバーにアップロードファイルをどのようにアップロードするか尋ねていないときにも、重複しているとマークしています....

+0

'setString()'を 'setNString()'に変更してみてください。 JDBCドライバに依存しているかどうかわかりません。 – Andreas

+0

このスタックトレースを取得しました:メソッドcom/mysql/jdbc/PreparedStatement.setNString(ILjava/lang/String;)Vは抽象的です@Andreas – HFR1994

+0

@Andreas固定エラー、まだ何もありません – HFR1994

答えて

0

@アンドレアス観測で修正されました。代わりに

new String(b) 

を使用して、私は

new String(b, StandardCharsets.UTF_8); 

を使用ありがとうございました。私は一見al parseParameterMap()を受け取ります。

関連する問題