I am trying to save some values in a MySQL database using Hibernate, but most Lithuanian characters will not be saved, including ąĄ čČ ęĘ ėĖ įĮ ųŲ ūŪ (they are saved as ? ), However šŠ žŽ .
If I insert manually, these values will be saved correctly, so the problem is most likely in the Hibernate configuration.
What I have tried so far:
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, "/*"); }
As described here
I tried adding ?useUnicode=true&characterEncoding=utf-8 to the db connection url.
As described here
I guaranteed that my db is set to UTF-8 encoding. phpmyadmin > information_schema > schemata
def db_name utf8 utf8_lithuanian_ci NULL
This is how I save in db:
//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); } }
The first set of println contains all Lithuanian characters, and the second replaces most ?
EDIT: Added Information
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
EDIT: I did not find the right solution, so I came up with a workaround. I ended up hiding / undoing characters, storing them like this: \uXXXX .