【发布时间】:2015-06-02 14:51:15
【问题描述】:
我正在尝试使用 Hibernate 在 MySQL 数据库中保存一些值,但大多数立陶宛字符不会被保存,包括 ąĄ čČ ęĘ ėĖ įĮ ųŲ ūŪ(它们被保存为 ?),但是,šŠ žŽ 会被保存.
如果我手动插入,那么这些值会正确保存,因此问题很可能出在 Hibernate 配置中。
到目前为止我所尝试的:
hibernate.charset=UTF-8
hibernate.character_encoding=UTF-8
hibernate.use_unicode=true
---------
properties.put(PROPERTY_NAME_HIBERNATE_USE_UNICODE,
env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_USE_UNICODE));
properties.put(PROPERTY_NAME_HIBERNATE_CHARSET,
env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_CHARSET));
properties
.put(PROPERTY_NAME_HIBERNATE_CHARACTER_ENCODING,
env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_CHARACTER_ENCODING));
---------
private void registerCharachterEncodingFilter(ServletContext aContext) {
CharacterEncodingFilter cef = new CharacterEncodingFilter();
cef.setForceEncoding(true);
cef.setEncoding("UTF-8");
aContext.addFilter("charachterEncodingFilter", cef)
.addMappingForUrlPatterns(null, true, "/*");
}
如here所述
我尝试将?useUnicode=true&characterEncoding=utf-8 添加到数据库连接网址。
如上所述here
我确保我的数据库设置为 UTF-8 字符集。 phpmyadmin > information_schema > schemata
def db_name utf8 utf8_lithuanian_ci NULL
这是我保存到数据库中的方式:
//Controller
buildingService.addBuildings(schema.getBuildings());
List<Building> buildings = buildingService.getBuildings();
System.out.println("-----------");
for (Building b : schema.getBuildings()) {
System.out.println(b.toString());
}
System.out.println("-----------");
for (Building b : buildings) {
System.out.println(b.toString());
}
System.out.println("-----------");
//Service:
@Override
public void addBuildings(List<Building> buildings) {
for (Building b : buildings) {
getCurrentSession().saveOrUpdate(b);
}
}
第一组 println 包含所有立陶宛字符,第二组用 ? 替换大部分字符
编辑:添加详细信息
insert into buildings values (11,'ąĄčČęĘ', 'asda');
select short, hex(short) from buildings;
//Šalt. was inserted via hibernate
//letters are properly displayed:
ąĄčČęĘ | C485C484C48DC48CC499C498
MIF Šalt. | 4D494620C5A0616C742E
select address, hex(address) from buildings;
Šaltini? <...> | C5A0616C74696E693F20672E2031412C2056696C6E697573
//should contain "ų"
--------
show create table buildings;
buildings | CREATE TABLE `buildings` (
`id` int(11) NOT NULL,
`short` varchar(255) COLLATE utf8_lithuanian_ci DEFAULT NULL,
`address` varchar(255) COLLATE utf8_lithuanian_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci
编辑:
我没有找到合适的解决方案,所以我想出了一个解决方法。我最终转义/取消转义字符,像这样存储它们:\uXXXX。
【问题讨论】:
-
这似乎不是您的具体问题,但我们遇到了类似的问题,Ant 构建脚本正在运行 sql 任务并且默认为主机的编码方案,即 cp1252在 windows server 2008 上。尽管我们的其余配置在整个过程中都指定了 UTF-8,但在生产机器上运行时,此构建脚本默认为 cp1252(但不是在开发环境中)。超级神秘,直到我们弄清楚发生了什么。
标签: java mysql hibernate utf-8