一、安裝Mysql
1、官網下載mysql的tar包(提示:建議vpn環境下載)
2、解壓并安裝tar包
# 移動解壓后的二進制包到安裝目錄
sudo mv mysql-5.7.19-osx10.9-x86_64 /usr/local/mysql
# 更改 mysql 安裝目錄所屬用戶與用戶組
cd /usr/local
sudo chown -R root:wheel mysql
# 初始化數據庫cd /usr/local/mysql
sudo bin/mysqld --initialize --user=mysql (提示:初始化數據庫時會隨機生成root@localhost用戶的隨機密碼,用此密碼登陸數據庫)
# 開啟mysql服務端程序# 啟動sudo support-files/mysql.server start# 重啟sudo support-files/mysql.server restart
# 停止
sudo support-files/mysql.server stop
# 檢查 MySQL服務端 運行狀態
sudo support-files/mysql.server status
# 通過自帶的Mysql Client 連接數據庫cd /usr/local/mysql/bin./mysql -u root -p
# 修改root@localhost用戶的密碼mysql> alter user?'root'@'localhost' identified?by?'new-password';# 將root用戶的host改為通配符%,并刷新權限,使root@127.0.0.1等也可以登錄
mysql> update user set user.Host = '%' where user.User = 'root';
mysql> flush privileges;
3、將mysql的字符集設置為utf8
# 更改 mysql 的啟動配置文件sudo vi /etc/my.cnf
[client]
port = 3306
default-character-set = utf8
[mysqld]
user = mysql
port = 3306
default-storage-engine = Innodb
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = 'SET NAMES utf8'
# 重啟mysqld后,進入mysql,查看字符集
mysql> show variables like "%character%";
二、安裝Navicat
參考教程:
ps : 一定要下載該教程提供的12.0.22安裝包,官網下載地址提供的安裝包bug已經被修復,包內容中沒有rpk文件,無法修改公鑰
三、將遠程IP下數據庫的內容(包括結構和數據)復制到本地數據庫完成數據庫環境的搭建
使用mysql-cp-tool工具程序復制數據,這種方法比在Navicat中導出數據再在本地數據庫中通過sql腳本導入數據要來得方便,因為導出數據成sql腳本時要將選中數據庫中所有數據一起導出,而用程序復制時復制記錄的條數可配置,且在復制過程中出錯(一般是構造表的時候)能追蹤出錯原因。
示例:
錯誤一:
構造表時出現MySQLSyntaxErrorException: Invalid default value for timestamp(3).
原因:
mysql> show variables like "sql_mode";
sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
NO_ZERO_DATE:在非嚴格模式下,可以插入形如“0000-00-00 00:00:00”的非法日期,MySQL數據庫僅拋出一個警告。而啟用該選項后,MySQL數據庫不允許插入零日期,插入零日期會拋出錯誤而非警告。
解決方案:
mysql> set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> commit;
錯誤二:
拷貝數據時出現java.sql.SQLException: Cannot convert value '2018-10-08 22:42:03.973' from column 103 to TIMESTAMP.
Caused by: java.lang.IllegalArgumentException: nanos > 999999999 or < 0
原因:
項目中使用的MySQL JDBC driver版本過低,無法對該類型string串進行處理。
解決方案:
若是低版本的driver,例如mysql-connector-java-5.1.10-bin, 切換為高版本驅動包例如mysql-connector-java-8.0.15.jar之后就能解決問題。
四、運行程序時出現SQLException
錯誤一:
org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'column1' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'column1' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'column1' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
原因:ONLY_FULL_GROUP_BY的意思是:對于GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那么這個SQL是不合法的,因為列不在GROUP BY從句中,也就是說查出來的列必須在group by后面出現否則就會報錯,或者這個字段出現在聚合函數里面。
解決方案:
將mysql的sql_mode中的ONLY_FULL_GROUP_BY設置去除。
mysql> set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> commit;