1 問題:數(shù)據(jù)庫字符集和排序規(guī)則不一致
最近需要向一個已有的數(shù)據(jù)庫進(jìn)行擴充(已有數(shù)據(jù)庫是由php建的,后來由java進(jìn)行擴展),但是出現(xiàn)了新表和舊表無法建立外鍵的問題,后來發(fā)現(xiàn)是因為編碼問題,服務(wù)器數(shù)據(jù)庫和我本地數(shù)據(jù)庫的字符集和排序規(guī)則不對應(yīng),服務(wù)器數(shù)據(jù)庫使用的是utf8mb4,utf8mb4_unicode_ci而我本地使用的是utf8,utf8_general_ci。
2 解決方法
2.1 將本地數(shù)據(jù)庫改成utf8mb4,utf8mb4_unicode_ci
該方法參考: 更改mysql數(shù)據(jù)庫的編碼為utf8mb4
2.1.1 找到my.cnf,一般在/etc/mysql/my.cnf,可以用locate my.cnf查找。修改下面三部分
1
2
3
4
5
6
7
8
9
|
[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 init_connect= 'set names utf8mb4' |
2.1.2 重啟數(shù)據(jù)庫,檢查變量
必須保證
系統(tǒng)變量 | 描述 |
---|---|
character_set_client | (客戶端來源數(shù)據(jù)使用的字符集) |
character_set_connection | (連接層字符集) |
character_set_database | (當(dāng)前選中數(shù)據(jù)庫的默認(rèn)字符集) |
character_set_results | (查詢結(jié)果字符集) |
character_set_server | (默認(rèn)的內(nèi)部操作字符集) |
這幾個變量必須是utf8mb4。
2.1.3 將已經(jīng)建好的數(shù)據(jù)庫、表和列轉(zhuǎn)換成utf8mb4,utf8mb4_unicode_ci
更改數(shù)據(jù)庫編碼:alter database database_name character set utf8mb4 collate utf8mb4_unicode_ci;
更改表編碼:alter table table_name convert to character set utf8mb4 collate utf8mb4_unicode_ci;
更改列編碼:alter table table_name change column_name column_name varchar( 36 ) character set utf8mb4 collate utf8mb4_unicode_ci not null
mysql官方文檔
database character set and collation
table character set and collation
column character set and collation
如果我不想修改本地數(shù)據(jù)庫呢?那就用下面這種方法。(我用的是第二種)
2.2 在spring boot中配置,不修改本地數(shù)據(jù)庫
2.2.1 在jpa建表時設(shè)置表的編碼和排序規(guī)則
重寫mysql5innodbdialect#gettabletypestring()
1
2
3
4
5
6
|
public class mysql5innodbdialectutf8mb4 extends mysql5innodbdialect { @override public string gettabletypestring() { return "engine=innodb default charset=utf8mb4 collate utf8mb4_unicode_ci" ; } } |
配置hibernate.dialect
1
2
3
4
5
|
spring: jpa: properties: hibernate: dialect: com.xxx.mysql5innodbdialectutf8mb4 |
2.2.2 設(shè)置連接初始化sql
配置druid連接池,如果為其他連接池,設(shè)置對應(yīng)的connectioninitsqls即可
druidconfig.java
1
2
3
4
5
6
7
8
9
10
11
12
|
@configuration public class druidconfig { @value ( "${spring.datasource.druid.connection-init-sqls" ) private list<string> connectioninitsqls; @bean public druiddatasource datasource() { druiddatasource datasource = new druiddatasource(); datasource.setconnectioninitsqls(connectioninitsqls); return datasource; } } |
application.yml
1
2
3
4
|
spring: datasource: druid: connection-init-sqls: [ "set names utf8mb4 collate utf8mb4_unicode_ci" ] |
最后按上述設(shè)置spring data jpa 生成的表、字段就會是utf8mb4,utf8mb4_unicode_ci
ps: mysql.url還是需要設(shè)置characterencoding=utf8不然會出現(xiàn)中文亂碼
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/hhaojian/article/details/79243763