公开科特林。西里尔编码问题
Exposed Kotlin. Problem with cyrillic encoding
我试图解决编码问题。所以,我从 'Postman',从 Web 浏览器请求发送到服务器,在那里我通过请求中的键在数据库中搜索数据。请求可以是这样的:
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
计数: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 = 'Документальное'
体裁结构table:
genres
id: int(10)
genre: varchar(100)
link: varchar(100
我尝试了 select 所有流派,并且此查询几乎正确执行。所以,我决定用英文单词检查这个查询,并且正确执行了这个查询:
SELECT genres.id, genres.genre, genres.link FROM genres WHERE genres.genre = 'simpleGenre'
我对这个查询没有例外。
那么,我做错了什么以及如何解决排序规则问题?
更新:
正如我在 github (issue) 中所说,我已经尝试使用 mysql cli 进行此查询,我收到了正确的答案。
此外,我尝试解码 url 参数(使用 java URLDecoder class)。也没用。
谢谢,@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
)
我试图解决编码问题。所以,我从 'Postman',从 Web 浏览器请求发送到服务器,在那里我通过请求中的键在数据库中搜索数据。请求可以是这样的:
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 计数: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 = 'Документальное'
体裁结构table:
genres
id: int(10)
genre: varchar(100)
link: varchar(100
我尝试了 select 所有流派,并且此查询几乎正确执行。所以,我决定用英文单词检查这个查询,并且正确执行了这个查询:
SELECT genres.id, genres.genre, genres.link FROM genres WHERE genres.genre = 'simpleGenre'
我对这个查询没有例外。
那么,我做错了什么以及如何解决排序规则问题?
更新: 正如我在 github (issue) 中所说,我已经尝试使用 mysql cli 进行此查询,我收到了正确的答案。
此外,我尝试解码 url 参数(使用 java URLDecoder class)。也没用。
谢谢,@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
)