2009-01-21 6 views
1

У меня есть форма, которая записывает идентификационный номер студента. Некоторые из этих чисел содержат начальный ноль. Когда число получает записываются в базу данных она падает ведущий 0.Удаление ведущих нулей

поля устанавливается только на прием номера. Длина идентификатора студента меняется.

Мне нужно поле для записи и отображения с начальным нулем.

+0

Какой язык? C#? Когда вы говорите поле - это поле базы данных или поле класса? Если это поле базы данных, какая база данных? SQL Server? – BenAlabaster

ответ

10

Если у вас всегда будет определенная длина (скажем, она всегда будет 10 символов), вы можете просто получить длину номера в базе данных (после того, как она будет преобразована в строку) а затем добавить соответствующие 0.

Однако, если это произвольное количество ведущих нулей, то вам придется хранить содержимое в виде строки в базе данных, так что вы можете захватить ведущие нули.

+0

В этом случае длина изменяется. и запись в качестве строки - последнее средство - переключение на запись текста. Есть ли способ сделать это, сохранив поле в виде чисел? –

+0

AO, я думаю, вам придется добавить еще один столбец LeadingZero для записи ведущего 0 (по умолчанию по умолчанию). Тогда, если ведущее 0 не является нулевым, то префикс его на дисплеях. – Turnkey

+0

Я бы сказал, чтобы не использовать столбец бит для начала нулевого значения, но использовать столбец int для хранения числа ведущих нулей и хранить в виде числа (в соответствии с моим ответом ниже) – BenAlabaster

6

Похоже, что это должно храниться в виде строковых данных. Похоже, что ведущие нули являются частью самих данных, а не только частью его форматирования.

Вы мог переформатировать данные для отображения с ведущими нулями в ней, однако я считаю, вы должны сохранять правильную форму идентификационного номера, это приведет к меньшему количеству ошибок по дороге (например: вы забыли формат это в одном месте, но не в другом).

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

Если вы не намерены делать расчеты по этому ID, его, вероятно, лучше всего хранить их в виде текста/строка.

0

Другой вариант, так как поле является идентификатор, я бы рекомендовал создать вторичное поле для отображения числа (NVARCHAR), которые можно использовать для отчетов и т.д ...

Тогда в приложении, когда студент идентификатор вы можете вставить это в базу данных как номер, так и номер дисплея.

4

Есть несколько способов сделать это - в зависимости от ответов на мои комментарии в вашем вопросе:

  1. Храни дополнительные данные в базе данных пути преобразования типа данных из числовых в VARCHAR/строки.

    • Преимущества: Очень прост в реализации; Вы можете обрабатывать все значения таким же образом.
    • Недостаток: Если у вас очень большие объемы данных, размеры хранилищ будут возрастать; индексирование и сортировка по строкам не работают так хорошо.
    • Использовать, если: Каждое число может иметь произвольную длину (и, следовательно, количество нулей).
    • Не следует использовать, если: Вы будете тратить много времени сортировки данных, сортировки числовых строк является болью в заднице - искать естественную сортировку, чтобы увидеть некоторые из подводных камней;
  2. Продолжать хранить данные в базе данных как числовые, но колодки числовых обратно до заданной длины (то есть 10, как я предложил в моем примере ниже):

    • Преимущество: Данные будут индексироваться лучше, лучше искать, не требуют таких больших объемов хранения, если у вас есть большие объемы данных.
    • Недостаток: Каждый запрос или отображение данных потребует, чтобы каждый экземпляр данных был дополнен до нужной длины, что привело к небольшому поражению производительности.
    • Использовать, если: Все выходные номера будут иметь одинаковую длину (например, включая нули, все они [например] 10 цифр); Необходимы большие объемы сортировки.
  3. Добавление поля в таблицу, чтобы сохранить первоначальную длину числовой, по-прежнему сохраняют значение в качестве числового (использовать сортировку/прирост производительности индексации числовой против строки) в новом поле магазине длина как она будет включать в себя значительные нули:

    • Преимущества: Снижение требуемого дискового пространства; максимальное использование индексации; сортировка цифр намного проще, чем сортировка текстовых чисел; Вы все еще получаете возможность раздуть до числовых значений произвольной длины, как у вас есть с опцией 1.
    • Недостатки: Дополнительное поле обязательно для заполнения в вашей базе данных, так что все ваши запросы должны будете тянуть, что дополнительное поле, таким образом, потенциально требующие небольшое увеличение ресурсов на время запроса/отображения.
    • Использовать, если: Объем складских помещений/индексирование/сортировка - это любая проблема.
    • Не использовать, если: У вас нет роскоши изменять структуру таблицы, чтобы включить дополнительную стоимость; Это вызовет слишком сложные запросы.

Если бы я тебя, и у меня был доступ к немного изменить структуру БД, я бы с вариантом 3, что вы должны вытащить дополнительное поле, чтобы получить длину. Немного повышенная сложность приносит огромные дивиденды в преимуществах по сравнению с недостатками. Удар производительности при заполнении строки обратно правильной длины будет значительно превосходить увеличение производительности индексации и пространства для хранения.

+0

+1 для варианта 3, приятное объединение вариантов, чтобы получить лучший общий эффект ... – BobTheBuilder

1

Я работал с базой данных с аналогичной проблемой. Они сохраняли почтовые индексы как число. Следствием этого было то, что люди в Нью-Джерси не могли использовать наше приложение.

Вы используете логически текстовую строку, а не цифру. Это просто похоже на число, но вам действительно нужно рассматривать его как текст. Используйте текстовый тип данных или, по крайней мере, создайте представление базы данных, которое позволит вам отбросить правильно отформатированное значение для этого.

+0

Здесь, здесь. Если что-то не будет использоваться в расчетном хранилище, это как текст. 25 лет, и я никогда не жалел об этом. –

0

раствор, Oracle

Хранить идентификатор в виде числа и преобразовать его в символ для отображения. Например, для отображения 42 как нули, строка из трех символов:

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

042 

Измените строку формата в соответствии с вашими потребностями.

(я не знаю, если это может быть передано на другие SQL ароматизаторов, однако.)

0

Вы можете просто сцепить «1» к началу идентификатора при хранении его в базе данных. При извлечении его обработайте его как строку и удалите первый символ.

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; 

Математически:

Первоначально я думал, что слишком много, и сделал это математически, добавляя целое число к студенческому билету, в зависимости от его длины (например, 1000000000, если это 9 цифр) , прежде чем хранить его.

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'); 
Смежные вопросы