【发布时间】:2012-06-25 06:40:38
【问题描述】:
我有一个以 CSV 格式发送给我的 CSV 文件。感兴趣的字段是 8 位数字。其中一些以 0 开头。该字段以数字形式发送。所以,我现在去掉了一些前导零。
我已经将该字段转换为 varchar。我现在需要这样做:
我现在有这个:
12345678
1234567
我需要这个:
12345678
01234567
【问题讨论】:
我有一个以 CSV 格式发送给我的 CSV 文件。感兴趣的字段是 8 位数字。其中一些以 0 开头。该字段以数字形式发送。所以,我现在去掉了一些前导零。
我已经将该字段转换为 varchar。我现在需要这样做:
我现在有这个:
12345678
1234567
我需要这个:
12345678
01234567
【问题讨论】:
可能:
select lpad(column, 8, 0) from table;
已编辑以回应 mylesg 的问题,在下面的 cmets 中:
好的,似乎对查询进行了更改-但是如何使其永久粘贴(更改)在表中?我尝试了 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;
【讨论】: