我需要将生产数据库中的一个字段从INT更新为VARCHAR.

当前INT字段中的信息是敏感的,我希望确保在更改表类型时不会无意中更改或 destruct 它.例如,用户可能将INT 123456存储在该列中,我希望确保在转换为VARCHAR后,它会被准确地存储.

实现这一点的推荐流程是什么?

当我使用这样的东西时,有什么需要担心的吗?

ALTER TABLE table_sample CHANGE col_sample col_sample VARCHAR;

提前感谢您的帮助.

推荐答案

在更改列类型之前,请将MySQL服务器设置为严格模式,并确保varchar(n)列的大小足以容纳转换为字符串时的所有整数.如果您没有处于严格模式,MySQL将:

如果未启用严格SQL模式,并且为超过列最大长度的CHARVARCHAR列指定了一个值,则该值将被截断以适合,并生成警告.对于非空格字符的截断,可以使用严格的SQL模式导致错误(而不是警告)并禁止插入值.

但如果你先进入strict mode强:

mysql> set sql_mode = 'STRICT_ALL_TABLES';
mysql> alter table table_sample change col_sample col_sample varchar(6);

你会收到这样一条很好的错误消息:

ERROR 1406 (22001): Data too long for column 'col_sample' at row ...

如果你的整数不都符合你的varchar.

当然,在try 更改表之前,您将有一个新的、经过验证的数据库备份.我说的verified是指你已经成功地将备份恢复到测试数据库中.

Mysql相关问答推荐

金融交易的交易隔离级别

如何根据mysql中的用户组获取文档?

try 恢复数据库时,如何正确解决行大小太大消息?

SQL按另一个表中的字段进入顺序对子查询进行排序

正在获取MySQL死锁,因为这个查询需要很长时间.

MySQL:获取连续记录的数量(日期)?

获取连续11天未考勤的员工

发生的原因及解决方法

在 MYSQL 8 中的 JSON 字段上的 SELECT 中返回所有键及其数组项

Select 同一张表中的结果数?

如何找到每个user_id每个产品的买家类型数量?

相关查询 - 在派生表中,我可以有多个嵌套级别吗?

判断一列中的多个值并返回值 1 或 0

在 SQL 中 for each 组返回具有最大值的行,包括具有相同值的行

mySQL 中的主数据库和 IF 错误?

mysql 5.5;可以从记录中排除表吗?

如何使用 C++ 连接 mySQL 数据库

有什么方法可以显示`gunzip < database.sql.gz | 的进度? mysql ...`进程?

如何用一系列日期填充表格?

'LIKE ('%this%' OR '%that%') and something=else' 不起作用