mongoose 批量修改字段_记一次脚本批量修改数据库字符集所埋下的一个坑及解决思路...
生活随笔
收集整理的這篇文章主要介紹了
mongoose 批量修改字段_记一次脚本批量修改数据库字符集所埋下的一个坑及解决思路...
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
概述
前段時間參考網(wǎng)上教程用腳本批量修改了數(shù)據(jù)庫的字符集,過了一天后業(yè)務反饋某個功能用不了,檢查發(fā)現(xiàn)數(shù)據(jù)庫字符類型的字段的默認值和說明全部為空,用實驗測試了一下果然腳本存在一些bug,后續(xù)因此加班了一整晚,印象深刻,這里介紹一下實驗過程。
1、創(chuàng)建表
先建一個utf8編碼的表:
CREATE TABLE `t1` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `USER_CODE` varchar(225) NOT NULL DEFAULT '01112341' COMMENT '用戶編碼', `START_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `NEED_DAYS` decimal(4,1) NOT NULL COMMENT '請假天數(shù)', `LEAVE_REASON` varchar(255) DEFAULT '事假' COMMENT '請假理由', PRIMARY KEY (`ID`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC注意上面的字段類型,后面做對比。
2、用腳本修改字符集
SELECT TABLE_SCHEMA '數(shù)據(jù)庫', TABLE_NAME '表', COLUMN_NAME '字段', CHARACTER_SET_NAME '原字符集', COLLATION_NAME '原排序規(guī)則', CONCAT( 'ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' MODIFY COLUMN ', COLUMN_NAME, ' ', COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;' ) '修正SQL' FROM information_schema.`COLUMNS` WHERE TABLE_NAME = 't1' AND CHARACTER_SET_NAME = 'utf8';?--修正腳本:ALTER TABLE t1.t1 MODIFY COLUMN USER_CODE varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;ALTER TABLE t1.t1 MODIFY COLUMN LEAVE_REASON varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;3、查看t1表驗證
4、結(jié)構(gòu)同步
測試一下NAVICAT的結(jié)構(gòu)同步是否有這種情況
5、修改腳本如下:
SELECT c.TABLE_SCHEMA '數(shù)據(jù)庫', c.TABLE_NAME '表', c.COLUMN_NAME '字段', c.COLUMN_DEFAULT '默認值', c.IS_NULLABLE '是否為空', c.DATA_TYPE '字段類型', c.character_set_name '原字符集', c.collation_name '原排序規(guī)則', CONCAT( 'ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' MODIFY COLUMN ', COLUMN_NAME, ' ', COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ', CASE WHEN c.is_nullable = 'NO' THEN 'NOT NULL' ELSE 'NULL' END, CASE WHEN c.COLUMN_DEFAULT = '' THEN ' DEFAULT ''''' WHEN c.COLUMN_DEFAULT IS NULL THEN ' DEFAULT NULL' ELSE concat( ' DEFAULT ', '''', c.COLUMN_DEFAULT, '''' ) END, ' comment ', '''', c.COLUMN_COMMENT, '''', ';' ) '修正SQL' FROM information_schema.`COLUMNS` c WHERE table_name = 't1' AND CHARACTER_SET_NAME = 'utf8mb4';?--修正sql如下:ALTER TABLE t1.t1 MODIFY COLUMN USER_CODE varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL default '01112341' comment '用戶編碼';ALTER TABLE `t2`.`t1` MODIFY COLUMN `USER_CODE` varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用戶編碼' AFTER `ID`;ALTER TABLE `t2`.`t1` MODIFY COLUMN `LEAVE_REASON` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '請假理由' AFTER `NEED_DAYS`;綜上所述:
1、備份重于一切
因為有備份,所以故障發(fā)生時我們是直接從前一天拿一份最新的表結(jié)構(gòu),用文本編輯改utf8為utf8mb4,導到中間庫做一下結(jié)構(gòu)同步恢復的。
2、不能盲目相信網(wǎng)上內(nèi)容
這一次就是因為拿到腳本后只是簡單測試編碼修改成功,沒有進一步驗證,忽略了其他地方才導致故障發(fā)生。
覺得有用的朋友多幫忙轉(zhuǎn)發(fā)哦!后面會分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注下~
總結(jié)
以上是生活随笔為你收集整理的mongoose 批量修改字段_记一次脚本批量修改数据库字符集所埋下的一个坑及解决思路...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 零钱理财200一天赚多少
- 下一篇: 银行卡密码有8位的吗