2015-06-06 22 views
5

Khi chạy ví dụ mùa xuân Boot JPA: https://spring.io/guides/gs/accessing-data-jpa/ chống lại một cơ sở dữ liệu MySQL và cố gắng để lưu trữ các "đống poo" biểu tượng cảm xúc tôi nhận được ngoại lệ java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xA9\xF0\x9F...'Không thể lưu trữ "Cọc của Poo" unicode emoji sử dụng Spring Boot Hibernate và MySQL

Tôi đã định cấu hình cơ sở dữ liệu của mình để sử dụng mã hóa utf8mb4.

Tôi biết đây không phải là vấn đề với MySQL vì tôi có thể tạo Khách hàng và lưu trữ nó trong cơ sở dữ liệu bằng ứng dụng khách MySQL. Tôi thậm chí có thể chạy các ứng dụng mẫu và có nó tìm thấy một khách hàng với "đống poo" biểu tượng cảm xúc.

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' 

Đây là Application.java sửa đổi của tôi từ mẫu:

@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(); 

    } 

} 

Đây là tập tin application.yml Tôi đang sử dụng để cấu hình kết nối JDBC của tôi. Tôi đang sử dụng một số kỹ thuật tôi đã tìm thấy trong khi nghiên cứu vấn đề này nhưng không có gì có vẻ hiệu quả.

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 

Điều này dường như là vấn đề phổ biến nhưng tôi chưa tìm được giải pháp. Bất kì sự trợ giúp nào đều được đánh giá cao.

+0

Chờ ... whaaaaat? – GabrielOshiro

Trả lời

6

Sau khi thử các cách tiếp cận khác nhau tôi quản lý để có được những điều làm việc bằng cách sử dụng application.yml

spring: 

    datasource: 
    url: "jdbc:mysql://localhost:3306/poo_test?useUnicode=yes&characterEncoding=utf8" 
    username: root 
    password: 
    initSQL: "SET NAMES 'utf8mb4'" 

    jpa: 
    hibernate: 
     ddl-auto: update 

Bí quyết sau đây dường như là tài sản

+1

Sử dụng tốt hơn 'spring.datasource.init-sql =" SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; " ' – soulmachine

+0

Hiện tại đây là ' spring.datasource.tomcat.initSQL = SET NAMES 'utf8mb4'' – MariuszS

0

tôi đã làm điều tương tự initSQL nhưng nó đã không làm việc đối với tôi, sau khi tìm kiếm tôi thấy rằng tôi phải chỉnh sửa tệp my.cnf của mysql

sudo nano /etc/mysql/my.cnf 

Sau đó, thêm dòng này dưới mysqld

character_set_server=utf8mb4 

Sau đó khởi động lại mysql

sudo /etc/init.d/mysqld restart 

Lưu ý: nếu bạn đang sử dụng Google Cloud bạn nên thêm cờ và khởi động lại mysql từ giao diện điều khiển nguyên nhân mysql không nằm trên cùng một máy chủ với mã của bạn.

0

Trong trường hợp của tôi, liên kết sau giải quyết vấn đề của tôi Mathias mysql

đặc biệt:

[client] 
default-character-set = utf8mb4 

[mysql] 
default-character-set = utf8mb4 

[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 
Các vấn đề liên quan