Сбрасывание ведущих нулей - PullRequest
1 голос
/ 21 января 2009

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

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

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

Ответы [ 10 ]

10 голосов
/ 21 января 2009

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

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

6 голосов
/ 21 января 2009

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

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

4 голосов
/ 21 января 2009

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

  1. Сохраните дополнительные данные в базе данных, преобразовав тип данных из числового в тип varchar / string.

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

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

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

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

1 голос
/ 21 января 2009

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

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

0 голосов
/ 11 июля 2009

Вы можете просто объединить '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;

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

Вначале я слишком много думал и делал это математически, добавляя целое число к идентификатору студента, в зависимости от его длины (например, 1 000 000 000, если это 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');
0 голосов
/ 22 января 2009

Решение Oracle

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

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

 042

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

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

0 голосов
/ 21 января 2009

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

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

0 голосов
/ 21 января 2009

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

0 голосов
/ 21 января 2009
declare @recordNumber integer;
set @recordNumber = 93088;
declare @padZeroes integer;
set @padZeroes = 8;
select 
     right( replicate('0',@padZeroes) 
          + convert(varchar,@recordNumber), @padZeroes);
0 голосов
/ 21 января 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...