Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 删除前导零_Database - Fatal编程技术网

Database 删除前导零

Database 删除前导零,database,Database,我有一张记录学生身份证号码的表格。其中一些数字包含前导零。当数字被记录到数据库中时,它会删除前导的0 该字段设置为仅接受数字。学生ID的长度各不相同 我需要用前导零记录和显示字段。如果您总是要有一个特定长度的数字(例如,它总是10个字符),那么您只需在数据库中获取该数字的长度(转换为字符串后),然后添加适当的0即可 但是,如果这是任意数量的前导零,那么您必须将内容作为字符串存储在数据库中,以便捕获前导零。如果您总是要有一个特定长度的数字(例如,它总是10个字符),那么您只需在数据库中获取该数字的

我有一张记录学生身份证号码的表格。其中一些数字包含前导零。当数字被记录到数据库中时,它会删除前导的0

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


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

如果您总是要有一个特定长度的数字(例如,它总是10个字符),那么您只需在数据库中获取该数字的长度(转换为字符串后),然后添加适当的0即可


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

如果您总是要有一个特定长度的数字(例如,它总是10个字符),那么您只需在数据库中获取该数字的长度即可(转换为字符串后),然后添加相应的0


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

听起来这应该作为字符串数据存储。听起来前导零是数据本身的一部分,而不仅仅是其格式的一部分


您可以使用前导零重新格式化数据以供显示,但是我认为您应该存储正确形式的ID号,这样会减少错误(例如:您忘记在一个位置格式化,但在另一个位置却没有).

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


您可以使用前导零重新格式化数据以供显示,但是我认为您应该存储正确形式的ID号,这样会减少错误(例如:您忘记在一个位置格式化,但在另一个位置却没有).

请参见此处:

请参见此处:

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

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

另一个选项是,因为该字段是一个ID,我建议为di创建一个辅助字段可用于报告等的splay编号(nvarchar)


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

另一个选项是,由于该字段是一个id,我建议为显示编号(nvarchar)创建一个辅助字段,您可以将其用于报告等


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

有几种方法可以做到这一点,具体取决于对我在您的问题中的评论的回答:

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

    • 优点:实现非常简单;您可以以相同的方式处理所有值
    • 缺点:如果数据量非常大,存储大小会逐渐增大;对字符串进行索引和排序的效果不太好
    • 使用if:每个数字可以有任意长度(因此零的数量)
    • 不要使用if:您将要花费大量时间对数据进行排序,对数字字符串进行排序是一件很麻烦的事情-查找自然排序以查看一些陷阱
  • 继续将数据以数字形式存储在数据库中,但将数字填充回设定的长度(如我在下面的示例中建议的10):

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

    • 优点:减少所需存储空间;最大限度地使用索引;数字排序比文本数字排序容易得多;您仍然可以像选项1一样将数字填充到任意长度
    • 缺点:数据库中需要一个额外字段,因此所有查询都必须提取该额外字段,因此在查询/显示时可能需要略微增加资源
    • 在以下情况下使用:存储空间/索引/排序性能是任何类型的问题
    • 不要使用if:您没有机会更改表结构以包含额外的值;这将使已经很复杂的查询过于复杂

  • 如果我是你,并且我有权稍微修改db结构,我会选择选项3,当然你需要拿出一个额外的字段来获得长度。稍微增加的复杂性在优势和劣势方面带来了巨大的好处。将字符串填充回正确长度的性能影响将远远超过所需索引和存储空间的性能提高。

    有几种方法可以做到这一点,具体取决于对我在您的问题中的评论的回答:

  • 通过从转换数据类型将额外数据存储在数据库中
    declare @recordNumber integer;
    set @recordNumber = 93088;
    declare @padZeroes integer;
    set @padZeroes = 8;
    select 
         right( replicate('0',@padZeroes) 
              + convert(varchar,@recordNumber), @padZeroes);
    
    SQL> select to_char(42, '099') from dual;
    
     042
    
    SET @student_id = '123456789';
    
    INSERT INTO student_table (id,name) VALUES(CONCAT('1',@student_id),'John Smith');
    ...
    SELECT SUBSTRING(id,1) FROM student_table;
    
    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');