Quando si esegue l'esempio Primavera Boot JPA: https://spring.io/guides/gs/accessing-data-jpa/ contro un database MySQL e cercando di memorizzare il "mucchio di cacca" emoji ottengo l'eccezione java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xA9\xF0\x9F...'
Impossibile memorizzare "Pile di Poo" unicode emoji usando primavera Boot Hibernate e MySQL
Ho configurato il mio database per utilizzare la codifica utf8mb4.
So che NON è un problema con MySQL dato che sono in grado di creare un cliente e memorizzarlo nel database utilizzando il client MySQL. Posso persino eseguire l'applicazione di esempio e fargli trovare un cliente con l'emoji "pila di cacca".
2015-06-05 18:10:12.382 INFO 5119 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]446b0224: startup date [Fri Jun 05 18:10:12 PDT 2015]; root of context hierarchy
2015-06-05 18:10:13.567 INFO 5119 --- [ main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2015-06-05 18:10:13.588 INFO 5119 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [
name: default
...]
2015-06-05 18:10:13.648 INFO 5119 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {4.3.8.Final}
2015-06-05 18:10:13.649 INFO 5119 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found
2015-06-05 18:10:13.651 INFO 5119 --- [ main] org.hibernate.cfg.Environment : HHH000021: Bytecode provider name : javassist
2015-06-05 18:10:13.804 INFO 5119 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
2015-06-05 18:10:14.086 INFO 5119 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2015-06-05 18:10:14.171 INFO 5119 --- [ main] o.h.h.i.ast.ASTQueryTranslatorFactory : HHH000397: Using ASTQueryTranslatorFactory
2015-06-05 18:10:14.365 INFO 5119 --- [ main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000228: Running hbm2ddl schema update
2015-06-05 18:10:14.365 INFO 5119 --- [ main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000102: Fetching database metadata
2015-06-05 18:10:14.366 INFO 5119 --- [ main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000396: Updating schema
2015-06-05 18:10:14.390 INFO 5119 --- [ main] o.hibernate.tool.hbm2ddl.TableMetadata : HHH000261: Table found: poo_test.Customer
2015-06-05 18:10:14.390 INFO 5119 --- [ main] o.hibernate.tool.hbm2ddl.TableMetadata : HHH000037: Columns: [id, lastname, firstname]
2015-06-05 18:10:14.390 INFO 5119 --- [ main] o.hibernate.tool.hbm2ddl.TableMetadata : HHH000108: Foreign keys: []
2015-06-05 18:10:14.391 INFO 5119 --- [ main] o.hibernate.tool.hbm2ddl.TableMetadata : HHH000126: Indexes: [primary]
2015-06-05 18:10:14.391 INFO 5119 --- [ main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000232: Schema update complete
2015-06-05 18:10:14.777 INFO 5119 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
Customer found with findOne(1L):
--------------------------------
Customer[id=1, firstName='', lastName='']
2015-06-05 18:10:14.836 INFO 5119 --- [ main] hello.Application : Started Application in 2.819 seconds (JVM running for 3.077)
2015-06-05 18:10:14.837 INFO 5119 --- [ Thread-1] s.c.a.AnnotationConfigApplicationContext : Closing org.spring[email protected]446b0224: startup date [Fri Jun 05 18:10:12 PDT 2015]; root of context hierarchy
2015-06-05 18:10:14.838 INFO 5119 --- [ Thread-1] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
2015-06-05 18:10:14.839 INFO 5119 --- [ Thread-1] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
Questo è il mio modificato Application.java dal campione:
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
CustomerRepository repository;
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
@Override
public void run(String... strings) throws Exception {
// save a couple of customers
repository.save(new Customer("", ""));
// fetch all customers
System.out.println("Customers found with findAll():");
System.out.println("-------------------------------");
for (Customer customer : repository.findAll()) {
System.out.println(customer);
}
System.out.println();
// fetch an individual customer by ID
Customer customer = repository.findOne(1L);
System.out.println("Customer found with findOne(1L):");
System.out.println("--------------------------------");
System.out.println(customer);
System.out.println();
}
}
Questo è il file application.yml che sto usando per configurare la mia connessione JDBC. Sto utilizzando un numero di tecniche che ho trovato durante la ricerca di questo problema, ma nulla sembra funzionare.
spring:
datasource:
url: "jdbc:mysql://localhost:3306/poo_test?useUnicode=yes&characterEncoding=utf8&characterResultSets=utf8"
username: root
password:
connectionInitSqls: "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;"
driverClassName: com.mysql.jdbc.Driver
testOnBorrow: true
validationQuery: SELECT 1
jpa:
show-sql: false
database-platform: org.hibernate.dialect.MySQL5Dialect
hibernate:
ddl-auto: update
naming_strategy: org.hibernate.cfg.EJB3NamingStrategy
connection:
CharSet: utf8mb4
characterEncoding: utf8
useUnicode: true
Questo sembra essere un problema comune ma non ho ancora trovato una soluzione. Qualsiasi aiuto sarebbe molto apprezzato.
Attendere ... whaaaaat? – GabrielOshiro