我有一个记录学生证号码的表格。其中一些数字包含前导零。当数字记录到数据库中时,它会丢弃前导0。
该字段设置为仅接受数字。学生证的长度各不相同。
我需要记录字段并显示前导零。
答案 0 :(得分:10)
如果你总是要有一定数量的长度(比如,它总是10个字符),那么你可以在数据库中获得数字的长度(在它被转换成字符串之后)和然后添加适当的0。
但是,如果这是任意数量的前导零,那么您必须将内容作为字符串存储在数据库中,以便捕获前导零。
答案 1 :(得分:6)
听起来这应该存储为字符串数据。听起来领先的零是数据本身的一部分,而不仅仅是它的格式化的一部分。
你可以重新格式化数据以显示其中的前导零,但是我相信你应该存储正确形式的ID号,这将导致更少的错误(例如:你忘了把它格式化在一个地方而不是另一个地方。
答案 2 :(得分:4)
有几种方法可以做到这一点 - 取决于我在您的问题中的评论的答案:
通过将数据类型从numeric转换为varchar / string,将额外数据存储在数据库中。
继续将数据作为数字存储在数据库中,但将数字填充回设定长度(即我在下面的示例中建议的10):
在表中添加一个字段以存储数字的原始长度,继续将值存储为数字(以利用数字与字符串的排序/索引性能增益)在新字段中存储长度为它将包括重要的零:
如果我是你,我可以稍微修改数据库结构,我会选择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)
将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');