Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Java > Как правильно заносить строковые значения содержащие апостроф в бд mySQL?


Автор: Astrgan 13.03.18, 01:05
Здравствуйте.
Когда я выполняю SQL-запрос в своем коде на java, через driverManager, то получаю в базе вместо апострофа - \u0027.

user posted image

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    public class ParserFilms {
     
        ResultSet resultSet;
        void listFilms(){
     
            File filmsFolder = new File("/home/alex/Development/films");
            File[] films = filmsFolder.listFiles();
            Properties connInfo = new Properties();
            connInfo.put("user", "root");
            connInfo.put("password", "****");
            connInfo.put("useUnicode","true"); // (1)
            connInfo.put("charSet", "UTF8"); // (2)
            try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/films?", connInfo);
                 PreparedStatement statement = connection.prepareStatement("INSERT INTO films(name_film, rating, description, poster, path, year_of_release) VALUE (?, ?, ?, ?, ?, ?)")) {
     
                for (File film:films) {
     
                    String actors = new String(Files.readAllBytes(Paths.get(film.getPath() + "/actors.txt")));
                    String description = new String(Files.readAllBytes(Paths.get(film.getPath() + "/description.txt")));
                    String genres = new String(Files.readAllBytes(Paths.get(film.getPath() + "/genres.txt")));
                    String names = new String(Files.readAllBytes(Paths.get(film.getPath() + "/names.txt")));
                    String Producer = new String(Files.readAllBytes(Paths.get(film.getPath() + "/Producer.txt")));
                    String year = new String(Files.readAllBytes(Paths.get(film.getPath() + "/year.txt")));
     
                    String[] namesArray = names.split(" / ");
                    for (int i = 0; i<namesArray.length; i++) {
                        namesArray[i] = namesArray[i].trim();
                    }
     
     
     
                    statement.setString(1, new Gson().toJson(namesArray));
                    statement.setInt(2,5);
                    statement.setString(3, description);
                    statement.setString(4,film.getPath() + "/poster.jpg");
                    statement.setString(5, film.getPath() + "filmName");
                    statement.setInt(6,Integer.parseInt(year.trim()));
                    statement.executeUpdate();
     
                }//for
            }catch (SQLException | IOException e){
                e.printStackTrace();
            }
        }
    }


Когда я выполняю похожей запрос через Workbench, то все в порядке:
user posted image

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    INSERT INTO films(name_film, rating, description, poster, path, year_of_release) VALUE ("world's dog", 5, "Привет мир", "Пока мир", "world's dog", 2017);

Автор: Astrgan 13.03.18, 02:42
Забыл указать что поле names, имеет тип данных json. И как я узнал, для этого типа данных это нормально.

Автор: VisualProg 13.03.18, 11:25
Цитата Astrgan @
я выполняю SQL-запрос в своем коде на java

При таком подходе, вы сами обязаны взять на себя проблему экранирования кавычек, и защиту от инъекций. Либо используйте bind параметры с готовыми библиотеками для работы с SQL скриптами, либо самостоятельно проверяйте содержимое значений ваших параметров на предмет наличия кавычек или инъекций.

Автор: Астарот 13.03.18, 11:38
Цитата Astrgan @
в своем коде на java

Цитата Astrgan @
PreparedStatement statement

На дворе 2018, работать с сырым jdbc уже не надо, пользуйтесь jdbcTemplate что ли.

Автор: korvin 13.03.18, 16:00
Цитата Astrgan @
Когда я выполняю SQL-запрос в своем коде на java, через driverManager, то получаю в базе вместо апострофа - \u0027.

Видимо, потому что в БД кодировка не Unicode.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)