I have a web application that accepts data in a browser and writes lines to the MySQL database. In the browser, Russian characters are displayed correctly, the fields are also filled in correctly, and they fall into the base in the form of hieroglyphs. I understand that there is a problem with encodings, but I cannot find a solution. The database is encoding utf8_general_ci . In jsp pages, utf8 everywhere. How to make Russian characters spell correctly in the database?

Example of a jsp page sending data:

 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html> <head> <title>ОИТ</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="styles.css" /> </head> <body id="altbody"> <div id="wrapper-header"> <div id="header"> <h1>Отдел информационных технологий</h1> </div> </div> <div id="wrapper-menu"> <div id="menu"> <ul> <li><a href="index.jsp">Главная</a></li> <li><a href="oio.jsp">ОИО</a></li> <li><a href="ooz.jsp">ООЗ</a></li> <li><a href="oit.jsp">ОИТ</a></li> <li><a href="okkio.jsp">ОККИО</a></li> </ul> </div> </div> <div id="content"> <form action="Controller" enctype="multipart/form-data" method="post"> <input type="hidden" id="department" name="department" value="Отдел информационных технологий"> <input name="computerProblem" id="computerProblem" placeholder="Укажите имя компьютера на котором возникла техническая проблема!" class="textbox" required /><br> <input name="problem" id="problem" placeholder="Опишите техническую проблему!" class="textbox" type="text" required /><br> <input type="file" id="file" name="file"><br> <input name="submit" class="button" type="submit" value="Отправить" /> </form> </div> </body> </html> 

The servlet that handles it all:

 @WebServlet(name="Controller",urlPatterns={"/Controller"}) @MultipartConfig(fileSizeThreshold=1024*1024, maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5) public class Controller extends HttpServlet { private Executor executor; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String userName = System.getProperty("user.name"); String department = new String(req.getParameter("department").getBytes("windows-1251"), "utf-8"); String computerProblem = new String(req.getParameter("computerProblem").getBytes("windows-1251"), "utf-8"); String descriptionProblem = new String(req.getParameter("problem").getBytes("windows-1251"), "utf-8"); Part part = req.getPart("file"); executor = new Executor(); if (part.getSize() != 0){ String type = part.getContentType(); if (type.equals("image/png") || type.equals("image/jpeg")){ String path = executor.saveImage(part, executor.getMaxIdFromDb()); executor.writeProblemToDbWithImage(new User(userName, department), new Problem(computerProblem, descriptionProblem, path, new Date())); req.getRequestDispatcher("/ok.jsp").forward(req, resp); }else { req.getRequestDispatcher("/error.jsp").forward(req, resp); } }else{ executor.writeProblemToDb(new User(userName, department), new Problem(computerProblem, descriptionProblem, new Date())); req.getRequestDispatcher("/ok.jsp").forward(req, resp); } if(executor != null) { executor.closeDb(); } } } 

Connect to database:

 public class ConnectionDb { private String hostName; private Properties properties; public ConnectionDb(String hostName, String userName, String password) { this.hostName = hostName; properties=new Properties(); properties.setProperty("user", userName); properties.setProperty("password", password); properties.setProperty("useUnicode", "true"); properties.setProperty("characterEncoding","utf8"); } /* Метод возвращает подключение к базе данных */ public Connection getConnection(){ Connection connection = null; try{ //Class.forName("org.postgresql.Driver"); Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection(hostName, properties); }catch (Exception ex){ ex.printStackTrace(); } return connection; } } 

Executor:

 public class Executor { private Connection connection; private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public Executor(){ connection = new ConnectionDb("", "", "").getConnection(); //connection = new ConnectionDb("", "", "").getConnection(); } public void writeProblemToDb(User user, Problem problem) { try { PreparedStatement ps = connection.prepareStatement("INSERT INTO trubleshutting (user_Name, department, computer_Name, description_Problem, date) VALUES (?, ?, ?, ?, ?)"); ps.setString(1, user.getName()); ps.setString(2, user.getDepartment()); ps.setString(3, problem.getComputerName()); ps.setString(4, problem.getDescription()); ps.setTimestamp(5, Timestamp.valueOf(String.valueOf(dateFormat.format(new java.util.Date())))); ps.execute(); ps.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } public void writeProblemToDbWithImage(User user, Problem problem){ try { PreparedStatement ps = connection.prepareStatement("INSERT INTO trubleshutting (user_Name, department, computer_Name, description_Problem, path_Image, date) VALUES (?, ?, ?, ?, ?, ?)"); ps.setString(1, user.getName()); ps.setString(2, user.getDepartment()); ps.setString(3, problem.getComputerName()); ps.setString(4, problem.getDescription()); ps.setString(5, problem.getPathToImage()); ps.setTimestamp(6, Timestamp.valueOf(String.valueOf(dateFormat.format(new java.util.Date())))); ps.execute(); ps.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } public int getMaxIdFromDb(){ int result = 0; try { PreparedStatement ps = connection.prepareStatement("SELECT trubleshutting.id as 'id' FROM sboi.trubleshutting ORDER BY sboi.trubleshutting.id DESC LIMIT 1"); ResultSet resultSet = ps.executeQuery(); if (resultSet.next()){ result = resultSet.getInt(1); } } catch (Exception e) { e.printStackTrace(); } return ++result; } public String saveImage(Part part, int id){ String path = "C:\\screenshots\\" + "image" + id + ".png"; try { part.write(path); } catch (IOException e) { e.printStackTrace(); } return path; } public void closeDb(){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } 
  • What do you get on every new user edit? :) - αλεχολυτ

2 answers 2

  1. Check how requests come to you from the jsp page (before sending to the database, display the value in the System.out.println () console, hieroglyphs or Russian characters?
  2. Also check the table encoding and the encoding of a specific column in the table (SHOW FULL COLUMNS FROM trubleshutting), make sure that Collation = utf8_general_ci is for string columns.

    Try these changes in the servlet.

     @WebServlet (name = "Controller", urlPatterns = {"/ Controller"})
     @MultipartConfig (fileSizeThreshold = 1024 * 1024,
             maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5)
     public class Controller extends HttpServlet {
    
         private Executor executor;
    
         @Override
         protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             super.doGet (req, resp);
         }
    
         @Override
         protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             request.setCharacterEncoding ("UTF-8");
             response.setContentType ("text / html; charset = UTF-8");
             response.setCharacterEncoding ("UTF-8");        
             String userName = System.getProperty ("user.name");
             String department = new String (req.getParameter ("department"));
             String computerProblem = new String (req.getParameter ("computerProblem"));
             String descriptionProblem = new String (req.getParameter ("problem"));
             Part part = req.getPart ("file");
             executor = new Executor ();
             if (part.getSize ()! = 0) {
                 String type = part.getContentType ();
                 if (type.equals ("image / png") || type.equals ("image / jpeg")) {
                     String path = executor.saveImage (part, executor.getMaxIdFromDb ());
                     executor.writeProblemToDbWithImage (new User (userName, department), new Problem (computerProblem, descriptionProblem, path, new Date ()));
                     req.getRequestDispatcher ("/ ok.jsp"). forward (req, resp);
                 } else {
                     req.getRequestDispatcher ("/ error.jsp"). forward (req, resp);
                 }
             } else {
                 executor.writeProblemToDb (new User (userName, department), new Problem (computerProblem, descriptionProblem, new Date ()));
                 req.getRequestDispatcher ("/ ok.jsp"). forward (req, resp);
             }
    
             if (executor! = null) {
                 executor.closeDb ();
             }
         }
     }