搭建mysql
docker run -d --name mysql -p 3306:3306 --restart=always -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --lower_case_table_names=1
-
參數(shù)
-d 后臺運(yùn)行
--name 容器命名
-p 端口映射 宿主機(jī)端口:容器端口
-e 環(huán)境變量 用來設(shè)置默認(rèn)用戶名密碼
--restart 控制docker重啟時, 容器是否(no)自動啟動
-
--lower_case_table_names
0 表名存儲為給定的大小和比較是區(qū)分大小寫的 1 表名存儲在磁盤是小寫的霎俩,但是比較的時候是不區(qū)分大小寫
2 表名存儲為給定的大小寫但是比較的時候是小寫的
拷貝mysql默認(rèn)配置文件, 映射默認(rèn)配置, 數(shù)據(jù)保存目錄
copy mysql 默認(rèn)配置 docker cp mysql:/etc/mysql /usr/local/share/env/mysql-conf
刪除未映射數(shù)據(jù)存儲目錄和配置的mysql容器 docker rm mysql -f
重新運(yùn)行一個容器, 并加入數(shù)據(jù)存儲目錄映射, 目錄映射
docker run -d --name mysql -p 3306:3306 --restart=always -v /usr/local/share/env/mysql57-data:/var/lib/mysql -v /usr/local/share/env/mysql-conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --lower_case_table_names=1
通過navicat數(shù)據(jù)傳輸遷移數(shù)據(jù),報Invalid default value for 'created_time',如下
[圖片上傳中...(image.png-4b66fc-1594446819574-0)]
-
[ERR] 1067 - Invalid default value for 'created_time'
image.png
查詢資料說是sql_mode的原因, 可通過 select @@sql_mode 默認(rèn)值為 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
可通過SET GLOBAL sql_mode='ONLY_FULL_GROUP',臨時有效
修改my.cnf配置
查看my.cnf, 引用兩個配置文件, 所以直接修改mysql.conf.d/mysqld.cnf配置,在配置中加入,
- 去掉ONLY_FULL_GROUP_BY, 修改默認(rèn)group by策略,
- 去掉NO_ZERO_IN_DATE,NO_ZERO_DATE 修改datetime和timestamp默認(rèn)值可為null
sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
改了sql_mode模式為嚴(yán)格或者寬松模式情況下,都會報錯童叠。本地和線上服務(wù)器相同的模式也不行
網(wǎng)上搜索資料枫吧,
mysql5.6.6之前,timestamp時間類型有一個默認(rèn)行為:
TIMESTAMP列如果沒有明確聲明NULL屬性,默認(rèn)為NOT NULL勋桶。(而其他數(shù)據(jù)類型,如果沒有顯示聲明為NOT NULL蘸吓,則允許NULL值善炫。)
insert插入一條數(shù)據(jù),TIMESTAMP的列值為NULL库继,會自動存儲時候箩艺,會將當(dāng)前timestamp存儲到這個timestamp列中。
也就是說會自動分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 屬性宪萄。每次更新記錄都會將timestamp列更新為當(dāng)前的時間戳對應(yīng)的時間值現(xiàn)在mysql5.6版本以后艺谆,timestamp字段的默認(rèn)行為發(fā)生的變化,多了一些限制拜英。如果timestamp列設(shè)置默認(rèn)值為NULL,Default NULL 這會發(fā)生報錯 1067 - Invalid default value for如果需要讓timestamp列在創(chuàng)建表時可以為NULL值静汤,需要將explicit_defaults_for_timestamp設(shè)為ONexplicit_defaults_for_timestamp默認(rèn)為OFF關(guān)閉狀態(tài),打開后可以阻止timestamp的默認(rèn)行為居凶。
繼續(xù)在mysqld.cnf配置加入explicit_defaults_for_timestamp = ON
-
運(yùn)行 docker restart mysql 重啟mysql后就可以正常執(zhí)行上面的數(shù)據(jù)傳輸
image.png