禁止修改varchar到int|[运维规范]
生活随笔
收集整理的這篇文章主要介紹了
禁止修改varchar到int|[运维规范]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在MySQL更改數據類型前一定要特別小心,分析一下是不是可行,另外在更改前,需要先進行備份,備份,備份!!!
環境描述
表結構:
CREATE TABLE `t_mobile` (`mobile_no` varchar(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8寫入數據:
root@zhishutang:mysql3306.sock [zst]>insert into t_mobile(mobile_no) values('13501245755'),('18800108001'),('13996000001');確認數據無誤:
root@zhishutang:mysql3306.sock [zst]>select * from t_mobile; +-------------+ | mobile_no | +-------------+ | 13501245755 | | 18800108001 | | 13996000001 | +-------------+ 3 rows in set (0.00 sec)溢出
修改數類型:
root@zhishutang:mysql3306.sock [zst]>alter table t_mobile change mobile_no mobile_no int; Query OK, 3 rows affected, 3 warnings (0.02 sec) Records: 3 Duplicates: 0 Warnings: 3查看警告:
root@zhishutang:mysql3306.sock [zst]>show warnings; +---------+------+----------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------+ | Warning | 1264 | Out of range value for column 'mobile_no' at row 1 | | Warning | 1264 | Out of range value for column 'mobile_no' at row 2 | | Warning | 1264 | Out of range value for column 'mobile_no' at row 3 | +---------+------+----------------------------------------------------+ 3 rows in set (0.00 sec)到這里實質就可以宣布,死定了。數據已溢出。
查看數據:
root@zhishutang:mysql3306.sock [zst]>select * from t_mobile; +------------+ | mobile_no | +------------+ | 2147483647 | | 2147483647 | | 2147483647 | +------------+ 3 rows in set (0.00 sec)這里真是的男人哭吧,哭吧, … 如果是線上環境,想死的心估計大家都有了,不是簡單的哭了。如果沒有備份,這么重要一例數據沒了,有可能意為著項目也有可能受到嚴重的影響。
這時也不要心存幻想在改回去就好,來看一下操作,請死心!!!
root@zhishutang:mysql3306.sock [zst]>alter table t_mobile change mobile_no mobile_no varchar(11); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0root@zhishutang:mysql3306.sock [zst]>select * from t_mobile; +------------+ | mobile_no | +------------+ | 2147483647 | | 2147483647 | | 2147483647 | +------------+ 3 rows in set (0.00 sec)結論
- 生產環境更數據類型明確提出: 不允許varchar 改成int.
- 更改數據前一定要做好備份,無論是update,delete,或是數據類型更改。
操作Tips: 如保備份一列數據?
select pk , 修改的列 from tb where 條件 ;
用命令行記錄也可以,用outfile處理也行。
恢復可以用awk反向生成update語句:
cat bak.txt |awk ‘{print “update tb set 修改列名=“?1”;”}
大概這樣生成。 在執行恢復即可。
?
作者:吳炳錫 來源:http://wubx.net/ 聯系方式: wubingxi#163.com?
總結
以上是生活随笔為你收集整理的禁止修改varchar到int|[运维规范]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MYSQL慢日志探索
- 下一篇: [Mysql]——通过例子理解事务的4种