LPAD领先零

时间:2013-07-12 10:32:33

标签: mysql

我有发票号码表。指南说数字应该有6位或更多位数。首先尝试做:

UPDATE t1 SET NUMER=CONCAT('00000',NUMER) WHERE LENGTH(NUMER)=1;   
UPDATE t1 SET NUMER=CONCAT('0000',NUMER) WHERE LENGTH(NUMER)=2;  
UPDATE t1 SET NUMER=CONCAT('000',NUMER) WHERE LENGTH(NUMER)=3;  
UPDATE t1 SET NUMER=CONCAT('00',NUMER) WHERE LENGTH(NUMER)=4;  
UPDATE t1 SET NUMER=CONCAT('0',NUMER) WHERE LENGTH(NUMER)=5;  

但这并不高效,甚至很漂亮。我尝试了LPAD函数,但后来出现了问题因为函数:

UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ;

返回受影响的ZERO行。也谷歌搜索,他们说把零写入报价将解决问题,但没有,任何帮助?这是每日导入。

编辑: 列NUMER是INT(19)并且已经包含如下数据:

NUMER
----------
1203  
12303 
123403 
1234503 
...

(现在填充的数据长度从3到7位不等)

3 个答案:

答案 0 :(得分:29)

我认为您应该考虑您所阅读的指南适用于发票应如何显示,而不应该如何存储在数据库中。

当一个数字存储为INT时,它是一个纯数字。如果您在前面添加零并再次存储它,它仍然是相同的数字。

您可以按如下方式选择NUMER字段,或为该表创建一个视图:

SELECT LPAD(NUMER,6,'0') AS NUMER
FROM ...

或者,不是在从数据库中选择数据时更改数据,而是考虑在显示数字时用零填充数字,并且仅在显示数字时填充。

我认为您对历史数据保持不变的要求是一个有争议的问题。即使是历史数据,编号为001203的发票也与编号为1203的发票相同。

但是,如果您绝对必须按照描述的方式执行此操作,则转换为VARCHAR字段可能会起作用。转换的历史数据可以按原样存储,任何新条目都可以填充到所需的零数。但我不建议这样做。

答案 1 :(得分:2)

由于UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ;字段为NUMER

int将无法达到预期效果。它将从int 1234创建字符串'001234',然后将其转换回1234 - 这就是为什么没有变化。

NUMER更改为int(6) zerofill类型,每次阅读时,MySQL都会为您填写。

如果您确实希望存储在数据库中的零,则必须将类型更改为CHAR / VARCHAR,然后您的LPAD更新语句才能生效。

答案 2 :(得分:0)

表中的字段是一个int列,因此它只存储一个数字。没有办法填写表格中的数据。 1 == 001 == 000000000001。这是相同的数字。

您应该在应用程序级别(从表中提取数据的系统)执行填充。当订单号超过999999时会发生什么?然后,您必须更新表中的所有数据以添加额外的0.这种事情不应该在数据库级别完成。

您还可以使用LPAD选择数据:

SELECT LPAD(NUMER,6,'0'), [other_columns] FROM t1;

替代方案,正如CBroe所提到的,您可以将数据类型更改为INT(6) ZEROFILL,以便正确显示,但如果它超过999999,则必须进行修改。