13

我有发票号码表。指南说数字应该有 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 ;

返回受影响的零行。还用谷歌搜索,他们说将零放在引号中可以解决问题,但没有任何帮助吗?是日常导入。

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

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

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

4

3 回答 3

37

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

当一个数字存储为 INT 时,它是一个纯数字。如果前面加零再存起来,还是一样的数字。

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

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

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

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

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

于 2013-07-12T11:03:20.300 回答
4

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更新语句将起作用。

于 2013-07-12T10:54:23.743 回答
0

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

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

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

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

或者,正如 CBroe 所提到的,您可以将数据类型更改为INT(6) ZEROFILL使其正确显示,但如果如上所述超过 999999,则必须对其进行修改。

于 2013-07-12T10:52:51.707 回答