掉落前导零

时间:2009-01-21 17:44:43

标签: database

我有一个记录学生证号码的表格。其中一些数字包含前导零。当数字记录到数据库中时,它会丢弃前导0。

该字段设置为仅接受数字。学生证的长度各不相同。

我需要记录字段并显示前导零。

10 个答案:

答案 0 :(得分:10)

如果你总是要有一定数量的长度(比如,它总是10个字符),那么你可以在数据库中获得数字的长度(在它被转换成字符串之后)和然后添加适当的0。

但是,如果这是任意数量的前导零,那么您必须将内容作为字符串存储在数据库中,以便捕获前导零。

答案 1 :(得分:6)

听起来这应该存储为字符串数据。听起来领先的零是数据本身的一部分,而不仅仅是它的格式化的一部分。

可以重新格式化数据以显示其中的前导零,但是我相信你应该存储正确形式的ID号,这将导致更少的错误(例如:你忘了把它格式化在一个地方而不是另一个地方。

答案 2 :(得分:4)

有几种方法可以做到这一点 - 取决于我在您的问题中的评论的答案:

  1. 通过将数据类型从numeric转换为varchar / string,将额外数据存储在数据库中。

    • 优势: 实施非常简单;您可以用同样的方式处理所有值。
    • 缺点: 如果您拥有非常大量的数据,存储空间将会升级;字符串的索引和排序效果不佳。
    • 使用if: 每个号码可以有一个任意长度(因此也可以是零个数)。
    • 不要使用if: 你将花费大量时间对数据进行排序,排序数字字符串是一个痛苦的屁股 - 查找自然排序以查看一些陷阱;
  2. 继续将数据作为数字存储在数据库中,但将数字填充回设定长度(即我在下面的示例中建议的10):

    • 优势: 如果您拥有大量数据,数据会更好地搜索,搜索效果更好,不需要如此大量的存储空间。
    • 缺点: 每次查询或显示数据都需要将每个数据实例填充到正确的长度,从而导致轻微的性能损失。
    • 使用if: 所有输出数字的长度相同(即包括零,它们都是[例如] 10位数);需要大量的分类。
  3. 在表中添加一个字段以存储数字的原始长度,继续将值存储为数字(以利用数字与字符串的排序/索引性能增益)在新字段中存储长度为它将包括重要的零:

    • 优势: 减少所需的存储空间;最大限度地使用索引;数字排序比排序文本数字容易得多;您仍然可以像使用选项1一样将数字填充到任意长度。
    • 缺点: 您的数据库中需要一个额外的字段,因此您的所有查询都必须提取额外字段,因此可能需要在查询时略微增加资源/显示时间。
    • 使用if: 存储空间/索引/排序性能是一种担忧。
    • 请勿使用if: 您无需更改表格结构以包含额外值;这将使已经很复杂的查询过于复杂。
  4. 如果我是你,我可以稍微修改数据库结构,我会选择3,确保你需要拉出一个额外的字段来获取长度。稍微增加的复杂性在优势与劣势方面带来巨大的好处。将字符串填充回正确长度的性能影响将远远超过所需索引和存储空间的性能提升。

答案 3 :(得分:1)

我使用了一个类似问题的数据库。他们将邮政编码存储为数字。结果是新泽西州的人无法使用我们的应用程序。

您正在使用逻辑上是文本字符串而非数字的数据。它恰好看起来像一个数字,但你真的需要将它视为文本。使用面向文本的数据类型,或者至少创建一个数据库视图,使您能够为此恢复格式正确的值。

答案 4 :(得分:0)

答案 5 :(得分:0)

declare @recordNumber integer;
set @recordNumber = 93088;
declare @padZeroes integer;
set @padZeroes = 8;
select 
     right( replicate('0',@padZeroes) 
          + convert(varchar,@recordNumber), @padZeroes);

答案 6 :(得分:0)

除非您打算对该ID进行计算,否则最好将它们存储为文本/字符串。

答案 7 :(得分:0)

另一个选择是因为该字段是一个id,我建议为显示编号(nvarchar)创建一个可用于报告等的辅助字段...

然后在您的应用程序中输入学生ID时,您可以将其作为数字和显示编号插入数据库。

答案 8 :(得分:0)

Oracle解决方案

将ID存储为数字并将其转换为字符以供显示。例如,要将42显示为零填充的三字符字符串:

SQL> select to_char(42, '099') from dual;

 042

更改格式字符串以满足您的需求。

(但我不知道这是否可以转移到其他SQL版本。)

答案 9 :(得分:0)

将数据存储在数据库中时,可以将“1”连接到ID的开头。检索它时,将其视为字符串并删除第一个字符。

MySQL示例:

SET @student_id = '123456789';

INSERT INTO student_table (id,name) VALUES(CONCAT('1',@student_id),'John Smith');
...
SELECT SUBSTRING(id,1) FROM student_table;

在数学上:

最初我想太多了,并且通过在学生ID中添加一个整数来进行数学处理,具体取决于它的长度(如果它是9位数,则为1,000,000,000),然后再存储它。

SET @new_student_id = ABS(@student_id) + POW(10, CHAR_LENGTH(@student_id));
INSERT INTO student_table (id,name) VALUES(@new_student_id,'John Smith');