Sto tentando di salvare alcuni valori nel database MySQL utilizzando Hibernate, ma la maggior parte dei caratteri lituani non verrà salvata, incluso ąĄ čČ ęĘ ėĖ įĮ ųŲ ūŪ
(vengono salvati come ?
), tuttavia , šŠ žŽ
si salva.UTF-8 non persisterà su Hibernate + MySQL
Se inserisco manualmente, tali valori vengono salvati correttamente, quindi il problema è molto probabile nella configurazione di Ibernazione.
Quello che ho provato finora:
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, "/*");
}
Come descritto here
Ho provato ad aggiungere ?useUnicode=true&characterEncoding=utf-8
al db collegamento URL.
Come descritto here
ho assicurato che il mio db è impostato su UTF-8 charset. phpmyadmin > information_schema > schemata
def db_name utf8 utf8_lithuanian_ci NULL
Questo è come mi Salva nei 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);
}
}
Prima serie di println contiene tutti i caratteri della Lituania, mentre il secondo sostituisce la maggior parte con ?
EDIT: Aggiunto dettagli
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
MODIFICA: Non l'ho fatto trovare una soluzione adeguata, quindi ho trovato una soluzione alternativa. Ho finito per sfuggire/caratteri di escape, archiviandoli in questo modo: \uXXXX
.
Questo non sembra essere il vostro problema specifico, ma abbiamo avuto un problema simile in cui uno script Ant-build stava eseguendo un'attività sql e aveva come impostazione predefinita lo schema di codifica del computer host, che era cp1252 su Windows Server 2008. Anche se il resto della nostra configurazione durante tutto il processo ha specificato UTF-8, questo script di build è stato predefinito a cp1252 quando è stato eseguito sulla macchina di produzione (ma non in ambienti dev). Super misterioso finché non abbiamo capito cosa stava succedendo. –