在 MySQL 中为列中的某些值添加前导零

我有一个 CSV 文件发送到我的 CSV。感兴趣的字段是8位数字。有些是0开头的。字段被发送为数字。所以,我现在去掉了一些前导零。

我已经将字段转换为 varchar 现在需要这样做:

我现在有了这个:

12345678
1234567

我需要这个:

12345678
01234567
156289 次浏览

将字段更改为 numeric 并使用 ZEROFILL保留零

或者

使用 LPAD()

SELECT LPAD('1234567', 8, '0');

有可能:

select lpad(column, 8, 0) from table;

编辑 回应 mylesg 的问题,在下面的评论中:

好的,似乎对查询进行了更改-但是如何将其永久地粘贴(更改)在表中呢?我尝试用 UPDATE 代替 SELECT

我假设您使用了类似于下面这样的查询:

UPDATE table SET columnName=lpad(nums,8,0);

如果成功了,但是表的值仍然没有前导零,那么我建议您可以将列设置为数字类型?如果是这种情况,那么您需要修改表,使该列为 text/varchar ()类型,以便保留前导零:

第一:

ALTER TABLE `table` CHANGE `numberColumn` `numberColumn` CHAR(8);

其次,运行更新:

UPDATE table SET `numberColumn`=LPAD(`numberColum`, 8, '0');

因此,这应该保留前导零; 缺点是该列不再严格属于数字类型; 因此,您可能必须强制执行更严格的验证(取决于您的用例) ,以确保不将非数字输入到该列中。

参考文献:

我在将 Excel 中的电话号码数据导入 mysql 数据库时也遇到过类似的问题。因此,一个简单的技巧,不需要识别电话号码的长度(因为电话号码的长度在我的数据中是不同的) :

UPDATE table SET phone_num = concat('0', phone_num)

我刚刚在 phone_num前面连接了0。

以前使用 LPAD()的答案是最佳的。但是,如果您希望执行特殊或高级处理,这里有一个方法,它允许对填充进行更多的迭代控制。还可以作为使用其他构造来实现相同目的的示例。

UPDATE
mytable
SET
mycolumn = CONCAT(
REPEAT(
"0",
8 - LENGTH(mycolumn)
),
mycolumn
)
WHERE
LENGTH(mycolumn) < 8;

请记住,如果您的值有更多的标志,即 LPAD 长度,MySQL 将把它缩短到那个长度,所以您应该添加额外的 IF 和长度检查。

IF(LENGTH(column)<8,LPAD(column,8,0),column)