gpt4 book ai didi

Java EE、Hibernate、MySql UTF-8 查询不起作用

转载 作者:行者123 更新时间:2023-11-30 22:03:59 25 4
gpt4 key购买 nike

所以我已经用 Wildfly 和 MySql 设置了 hibernate 。

查询有效,但在查询 UTF-8 字符名称时出现问题。

在 MySql 上:

SELECT * FROM users WHERE firstname = "ნიკა";

不会导致空集。

在 java 中:

Session session = HibernateUtils.getSession();

String name = request.getParameter("name");

CriteriaBuilder builder = session.getCriteriaBuilder();

CriteriaQuery<UsersEntity> query = builder.createQuery(UsersEntity.class);
Root<UsersEntity> usersRoot = query.from(UsersEntity.class);
query.select(usersRoot)
.where(builder.equal(usersRoot.get("firstname"), name));

List<UsersEntity> list = session.createQuery(query).list();

session.close();

writeUsers(list, response.getWriter());

查询 localhost:8080/main?name=ნიკა 时结果为空集

我该如何解决这个问题?

更新:

我在查询所有数据并显示它们时也有问题非英文字符替换为问号。

更新 2:

此代码导致在浏览器上显示问号:

response.getWriter().write("ნიკა ჩხარტიშვილი");

虽然这个可以正常工作:

response.setCharacterEncoding("UTF-8");
response.getWriter().write("ნიკა ჩხარტიშვილი");

当使用此查询查询数据库时 SELECT * FROM users WHERE username='ნიკა' 数据库收到问号而不是 ნიკა(这就是 wireshark 中显示的内容)。

我认为这是 wildfly 问题,因为它正确接收了 UTF-8,但发送问号,除非它被指定发送 UTF-8。

最佳答案

这是因为 URL 只能使用 ASCII 字符集通过 Internet 发送。

如果您从 javascript 调用服务器,您应该使用 encodeURIComponent("ნიკა") 对您的名称值进行编码,您的调用应如下所示:

localhost:8080/main?name=%E1%83%9C%E1%83%98%E1%83%99%E1%83%90

如果您只是将 URL 粘贴到 brownser,照常操作即可

localhost:8080/main?name=ნიკა

然后在您从请求中获取名称值后,在您的服务器中再次将其编码为 UTF-8,如下所示:

 //String name = request.getParameter("name");
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");

关于Java EE、Hibernate、MySql UTF-8 查询不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42370606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com