我有一张带有发票号码的表格。准则规定数字应包含 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位不同长度的数据)
我认为您应该考虑您阅读的指南适用于发票应如何显示,而不是如何在数据库中存储。
当数字存储为 INT 时,它是纯数字。如果前面加零再存储,仍然是同一个数字。
您可以按如下方式选择 NUMER 字段,或为该表创建视图:
SELECT LPAD(NUMER,6,'0') AS NUMER
FROM ...
或者,不要在从数据库中选择数据时更改数据,而是考虑在显示数据时且仅在显示数据时用零填充数字。
我认为您对历史数据保持不变的要求是有争议的。即使对于历史数据,编号为 001203 的发票与编号为 1203 的发票相同。
但是,如果您绝对必须按照您描述的方式进行操作,那么转换为 VARCHAR 字段可能会起作用。转换后的历史数据可以按原样存储,任何新条目都可以填充到所需数量的零。但我不建议这样做。
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
更新语句将起作用。
表中的字段是一个 int 列,因此它只存储一个数字。无法填充表中的数据。 1 == 001 == 000000000001。这是同一个数字。
您应该在应用程序级别(从表中提取数据的系统)进行填充。当订单号超过 999999 时会发生什么?然后,您必须更新表中的所有数据以添加额外的 0。这种事情不应该在数据库级别完成。
您还可以使用 LPAD 选择数据:
SELECT LPAD(NUMER,6,'0'), [other_columns] FROM t1;
替代方案,正如 CBroe 提到的,您可以将数据类型更改为
INT(6) ZEROFILL
,以便其正确显示,但如果如上所述超过 999999,则必须对其进行修改..
就我而言,我是这样使用的:
SET @NVALUE= 5;
SELECT LPAD(@NVALUE, IF(CHAR_LENGTH(@NVALUE) <= 3, 3, CHAR_LENGTH(@NVALUE)), '0' );
SET @NVALUE= 48;
SELECT LPAD(@NVALUE, IF(CHAR_LENGTH(@NVALUE) <= 3, 3, CHAR_LENGTH(@NVALUE)), '0' );
SET @NVALUE= 100;
SELECT LPAD(@NVALUE, IF(CHAR_LENGTH(@NVALUE) <= 3, 3, CHAR_LENGTH(@NVALUE)), '0' );
SET @NVALUE= 1500;
SELECT LPAD(@NVALUE, IF(CHAR_LENGTH(@NVALUE) <= 3, 3, CHAR_LENGTH(@NVALUE)), '0' );
结果: