Проблема Java JDBC с международным фонетическим алфавитом (IPA)

Я работаю с базой данных, в которой есть одна таблица с полем, которое написано с помощью символов IPA, например, одно поле: / iː / - / ɪ /

Я делаю подготовленный оператор, и набор результатов пуст и не должен (я проверил запрос), и когда я печатаю подготовленный оператор, возникает проблема с кодировкой символов:

com.mysql.cj.jdbc.ClientPreparedStatement: SELECT Id, sound, pair, IPA, writed_word, pair_name FROM minimal_pair WHERE dismised <> 1 AND pair_name = '/i?/ - /?/'

Значение pair_name должно быть: / iː / - / ɪ /

Код метода для запроса базы данных:

public static ArrayList<Word> returnRandomWordsFromPair(String pair_name) {

        ArrayList<Word> pairNameList = new ArrayList<Word>();

        // Connection variables
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        // Calling the connection
        conn = Dataconn.conn();

        String sql = "SELECT Id, sound, pair, IPA, writed_word, pair_name FROM minimal_pair WHERE dismised <> 1 AND pair_name = ?";
        System.out.println(sql);
        try {
            pstmt = conn.prepareStatement(sql);
            // The next line are the parameters
            pstmt.setString(1, pair_name);
            System.out.println(pstmt);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                Word word = new Word();
                word.setId(rs.getInt("Id"));
                word.setSound(rs.getString("sound"));
                word.setPair(rs.getString("pair"));
                word.setIpa(rs.getString("IPA"));
                word.setWrited_word(rs.getString("writed_word"));
                word.setPair_name(rs.getString("pair_name"));
                
                pairNameList.add(word);
                System.out.println(word);
            }

            if (rs != null)
                System.out.println("result set is null");
                try {
                    rs.close();
                } catch (SQLException logIgnore) {
                }
            if (pstmt != null)
                System.out.println("prepared statement is null");
                try {
                    rs.close();
                } catch (SQLException logIgnore) {
                }
            if (conn != null)
                System.out.println("connection is null");
                try {
                    rs.close();
                } catch (SQLException logIgnore) {
                }

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (rs != null)
                try {
                    rs.close();
                } catch (SQLException logIgnore) {
                }
            if (pstmt != null)
                try {
                    rs.close();
                } catch (SQLException logIgnore) {
                }
            if (conn != null)
                try {
                    rs.close();
                } catch (SQLException logIgnore) {
                }
        }

        Dataconn.closeConn(conn);

        return pairNameList;
    }

И я вызываю это из этого кода:

public static void main(String[] args) {

        ArrayList<Word> wordList = new ArrayList<Word>();

        wordList = DatabaseMethods.returnRandomWordsFromPair("/iː/ - /ɪ/");

        String name = wordList.getClass().getSimpleName();
        System.out.println(name);

        System.out.println(wordList);
        
        for (Word smallWord : wordList)
          {               
               System.out.println(smallWord.toString());        
          }
    }

Стандартный выходной результат:

SELECT Id, sound, pair, IPA, writed_word, pair_name FROM minimal_pair WHERE dismised <> 1 AND pair_name = ?
com.mysql.cj.jdbc.ClientPreparedStatement: SELECT Id, sound, pair, IPA, writed_word, pair_name FROM minimal_pair WHERE dismised <> 1 AND pair_name = '/i?/ - /?/'
result set is null
prepared statement is null
connection is null
Connection closed
ArrayList
[]

Я проверил, что в функции строка / iː / - / ɪ / правильно напечатана, но при выполнении подготовленного оператора отображается '/ i? / - /? /'

Кто-нибудь знает, почему это происходит и как я могу это решить?

Заранее большое спасибо!


person RandomGuy9    schedule 28.12.2020    source источник
comment
Это может помочь stackoverflow.com/questions/3828818 /   -  person Marc    schedule 28.12.2020
comment
См. Вопросительный знак в stackoverflow.com/questions/38363566/   -  person Rick James    schedule 28.12.2020


Ответы (1)


Используя ссылку Марка на проблему с символом UTF-8 в Java PreparedStatement, я решил проблема с использованием этого:

Количество способов облажаться на самом деле впечатляет. Если вы используете MySQL, попробуйте добавить параметр characterEncoding = UTF-8 в конец URL-адреса подключения JDBC:

jdbc: mysql: // сервер / база данных? characterEncoding = UTF-8

person RandomGuy9    schedule 28.12.2020