Выставил Котлин. Проблема с кодировкой кириллицы

Пробовал исправить проблему с кодировками. Итак, я отправил из «Почтальона» запрос из веб-браузера на сервер, где я ищу данные в базе данных по ключам в запросе. Запрос может быть таким:

http://localhost:8080/books.getBooksByGenre/Документальное/0/10

(в браузере). Строка приема сервера, например

http://localhost:8080/books.getBooksByGenre/%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5/0/10

затем принимает параметры из url: genreName: 'Документальное' начало: 0 count: 10. Затем эти данные отправляются в dao:

override fun findGenreByName(genreName: String): DatabaseGenre {
    return transaction(db) { getGenreByName(genreName) }
}

private fun getGenreByName(genreName: String): DatabaseGenre {
    return try {
        val foundGenre = GenreEntity.find { Genres.genre eq genreName }.single()
        DatabaseGenre(foundGenre.id.value, foundGenre.genre, foundGenre.link)
    } catch (e: Exception) {
        throw NothingFoundInDatabaseException("no one genre found by '$genreName'")
    } catch (e: NoSuchElementException) {
        val m = "Duplicates of genre with name '$genreName'"
        throw DuplicatedDataInDatabaseException(m)
    }
}

В журнале я вижу, что sql-запрос для поиска жанров правильный, но получаю исключение:

java.util.NoSuchElementException: Collection is empty.

Sql-запрос, как я уже сказал, правильный:

SELECT genres.id, genres.genre, genres.link FROM genres WHERE genres.genre = 'Документальное'

Структура таблицы жанров:

genres id: int(10) genre: varchar(100) link: varchar(100

Я попытался выбрать все жанры, и этот запрос выполнил почти правильно. Итак, я решил проверить этот запрос английским словом, и этот запрос правильно выполнился:

SELECT genres.id, genres.genre, genres.link FROM genres WHERE genres.genre = 'simpleGenre'

У меня нет исключений из этого запроса.

Итак, что я сделал не так и как исправить проблему с сопоставлениями?

UPD: как я сказал на github (проблема), я попробовал этот запрос mysql cli, и я получаю правильный ответ.

Кроме того, я попытался декодировать параметры URL (с классом java URLDecoder). Это тоже не помогает.


person Sergey Grishin    schedule 18.11.2018    source источник
comment
Ну, да. Это называется кодировкой URL. Если он не декодирует его автоматически, вам нужно будет сделать это вручную.   -  person Zoe    schedule 18.11.2018
comment
@Zoe, спасибо за ответ. Но, почему я увидел в логах sql-запрос с кириллицей (в обычном виде)? Он был без кодированных символов, просто кириллическими буквами. p.s. Попробую ваш совет и напишу здесь результаты   -  person Sergey Grishin    schedule 18.11.2018
comment
@Zoe, я попробовала твой совет. Это не здорово. Я обновил описание своего вопроса, указав свои попытки исправить эту проблему и ссылку на проблему с github, где я написал, что из mysql cli все работает нормально   -  person Sergey Grishin    schedule 19.11.2018
comment
У вас есть параметр characterEncoding=utf8 в URL-адресе подключения к MySQL? Как 2_. Еще один полезный параметр - useUnicode=true.   -  person madhead    schedule 21.11.2018
comment
@madhead, черт возьми, действительно работает. Большое тебе спасибо. На это потратил неделю. Не знаю, как отметить это как правильный ответ   -  person Sergey Grishin    schedule 23.11.2018


Ответы (1)


Спасибо, @madhead. Я пробовал использовать @madhead, и он работает. Итак, с этого момента мой URL-адрес подключения к БД выглядит так:

val connect = Database.connect(
        url = "jdbc:mysql://localhost:3306/my_database_name?characterEncoding=utf8&useUnicode=true",
        driver = "com.mysql.jdbc.Driver",
        user = user_name,
        password = password
)
person Sergey Grishin    schedule 22.11.2018