1. 程式人生 > >禁止修改varchar到int|[運維規範]

禁止修改varchar到int|[運維規範]

在MySQL更改資料型別前一定要特別小心,分析一下是不是可行,另外在更改前,需要先進行備份,備份,備份!!!

環境描述

表結構:

CREATE TABLE `t_mobile` (
 `mobile_no` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

寫入資料:

[email protected]:mysql3306.sock [zst]>insert into t_mobile(mobile_no) values('13501245755'),('18800108001'),('13996000001');

確認資料無誤:

[email protected]:mysql3306.sock [zst]>select * from t_mobile;
+-------------+
| mobile_no |
+-------------+
| 13501245755 |
| 18800108001 |
| 13996000001 |
+-------------+
3 rows in set (0.00 sec)

溢位

修改數型別:

[email protected]: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

檢視警告:

[email protected]: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)

到這裡實質就可以宣佈,死定了。資料已溢位。

檢視資料:

[email protected]:mysql3306.sock [zst]>select * from t_mobile;
+------------+
| mobile_no |
+------------+
| 2147483647 |
| 2147483647 |
| 2147483647 |
+------------+
3 rows in set (0.00 sec)

這裡真是的男人哭吧,哭吧, … 如果是線上環境,想死的心估計大家都有了,不是簡單的哭了。如果沒有備份,這麼重要一例資料沒了,有可能意為著專案也有可能受到嚴重的影響。

這時也不要心存幻想在改回去就好,來看一下操作,請死心!!!

[email protected]: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: 0

[email protected]: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 修改列名=“ 2,”where pk=1”;”}

大概這樣生成。 在執行恢復即可。

作者:吳炳錫 來源:http://wubx.net/ 聯絡方式: wubingxi#163.com