日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mongoose 批量修改字段_记一次脚本批量修改数据库字符集所埋下的一个坑及解决思路...

發布時間:2024/9/27 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mongoose 批量修改字段_记一次脚本批量修改数据库字符集所埋下的一个坑及解决思路... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

前段時間參考網上教程用腳本批量修改了數據庫的字符集,過了一天后業務反饋某個功能用不了,檢查發現數據庫字符類型的字段的默認值和說明全部為空,用實驗測試了一下果然腳本存在一些bug,后續因此加班了一整晚,印象深刻,這里介紹一下實驗過程。


1、創建表

先建一個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 '請假天數', `LEAVE_REASON` varchar(255) DEFAULT '事假' COMMENT '請假理由', PRIMARY KEY (`ID`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC

注意上面的字段類型,后面做對比。


2、用腳本修改字符集

SELECT TABLE_SCHEMA '數據庫', TABLE_NAME '表', COLUMN_NAME '字段', CHARACTER_SET_NAME '原字符集', COLLATION_NAME '原排序規則', 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、結構同步

測試一下NAVICAT的結構同步是否有這種情況


5、修改腳本如下:

SELECT c.TABLE_SCHEMA '數據庫', c.TABLE_NAME '表', c.COLUMN_NAME '字段', c.COLUMN_DEFAULT '默認值', c.IS_NULLABLE '是否為空', c.DATA_TYPE '字段類型', c.character_set_name '原字符集', c.collation_name '原排序規則', 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、備份重于一切

因為有備份,所以故障發生時我們是直接從前一天拿一份最新的表結構,用文本編輯改utf8為utf8mb4,導到中間庫做一下結構同步恢復的。

2、不能盲目相信網上內容

這一次就是因為拿到腳本后只是簡單測試編碼修改成功,沒有進一步驗證,忽略了其他地方才導致故障發生。

覺得有用的朋友多幫忙轉發哦!后面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

總結

以上是生活随笔為你收集整理的mongoose 批量修改字段_记一次脚本批量修改数据库字符集所埋下的一个坑及解决思路...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。