MySQL - как почтовый индекс передней панели с "0"? - PullRequest
83 голосов
/ 08 июля 2010

В моей базе данных MySQL InnoDB у меня есть грязные данные почтового индекса, которые я хочу очистить.

Чистые данные почтового индекса - это когда у меня есть все 5 цифр для почтового индекса (например, "90210").

Но по какой-то причине я заметил в своей базе данных, что для почтовых индексов, которые начинаются с "0", 0 было отброшено.

Так что " Холтсвилл, Нью-Йорк " с почтовым индексом "00544" хранится в моей базе данных как "544"

и

" Dedham, MA " с почтовым индексом "02026" хранится в моей базе данных как "2026".

Какой SQL я могу запустить на передней панели "0" для любого почтового индекса, который не 5 цифр в длину? Это означает, что если почтовый индекс имеет длину 3 цифры, то передняя панель "00". Если почтовый индекс имеет длину 4 цифры, на передней панели просто "0".

UPDATE

Я только что изменил почтовый индекс на тип данных VARCHAR (5)

Ответы [ 8 ]

194 голосов
/ 08 июля 2010

Сохраните ваши почтовые индексы как CHAR (5) вместо числового типа, или сделайте так, чтобы ваше приложение заполняло его нулями при загрузке из БД.Способ сделать это с помощью PHP, используя sprintf():

echo sprintf("%05d", 205); // prints 00205
echo sprintf("%05d", 1492); // prints 01492

Или вы можете использовать MySQL для этого с помощью LPAD():

SELECT LPAD(zip, 5, '0') as zipcode FROM table;

Вот способ обновить и дополнить все строки:

ALTER TABLE `table` CHANGE `zip` `zip` CHAR(5); #changes type
UPDATE table SET `zip`=LPAD(`zip`, 5, '0'); #pads everything
16 голосов
/ 08 июля 2010

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

Предположим, что ваша таблица называется mytable, а рассматриваемое поле - zipcode, введите smallint. Вам необходимо выполнить следующий запрос:

ALTER TABLE mytable CHANGE `zipcode` `zipcode`
    MEDIUMINT( 5 ) UNSIGNED ZEROFILL NOT NULL;

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

11 голосов
/ 08 июля 2010

Хорошо, значит вы переключили столбец с номера на VARCHAR (5). Теперь вам нужно обновить поле почтового индекса, чтобы оно было дополнено слева. SQL для этого будет:

UPDATE MyTable
SET ZipCode = LPAD( ZipCode, 5, '0' );

Это дополняет все значения в столбце ZipCode до 5 символов, добавляя «0» слева.

Конечно, теперь, когда вы исправили все свои старые данные, вам нужно убедиться, что все ваши новые данные также заполнены нулями. Есть несколько школ мысли о правильном способе сделать это:

  • Обрабатывать это в бизнес-логике приложения. Преимущества: решение, не зависящее от базы данных, не требует больше знаний о базе данных. Недостатки: необходимо обрабатывать везде, где выполняется запись в базу данных, во всех приложениях.

  • Обработка с помощью хранимой процедуры. Преимущества: хранимые процедуры обеспечивают соблюдение бизнес-правил для всех клиентов. Недостатки: хранимые процедуры более сложны, чем простые операторы INSERT / UPDATE, и не так переносимы между базами данных. Чистая INSERT / UPDATE все еще может вставлять данные, не заполненные нулями.

  • Обращайтесь с ним спусковым крючком. Преимущества: будет работать для хранимых процедур и простых операторов INSERT / UPDATE. Недостатки: наименее портативное решение. Самое медленное решение. Триггеры могут быть трудно понять правильно.

В этом случае я бы обработал это на уровне приложения (если вообще), а не на уровне базы данных. В конце концов, не все страны используют 5-значный почтовый индекс (даже США - наши почтовые индексы на самом деле Zip + 4 + 2: nnnnn-nnnn-nn) и некоторые разрешающие буквы, а также цифры. Лучше НЕ пытаться форсировать формат данных и принимать случайные ошибки данных, чем препятствовать тому, чтобы кто-то ввел правильное значение, даже если этот формат не совсем то, что вы ожидали.

3 голосов
/ 16 мая 2018

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

select LPAD(cast(zipcode_int as char), 5, '0') as zipcode from table;

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

3 голосов
/ 30 сентября 2015

вы должны использовать UNSIGNED ZEROFILL в вашей структуре таблицы.

3 голосов
/ 07 октября 2014
CHAR(5)

или

MEDIUMINT (5) UNSIGNED ZEROFILL

Первый занимает 5 байт на почтовый индекс.

Второй занимает всего 3 байта на почтовый индекс. Опция ZEROFILL необходима для почтовых индексов с ведущими нулями.

3 голосов
/ 08 октября 2012

По-прежнему имеет смысл создать поле с почтовым индексом как поле с целым числом без знака.

CREATE TABLE xxx ( zipcode INT(5) ZEROFILL UNSIGNED, ... )

Таким образом, mysql позаботится о прокладке для вас.

0 голосов
/ 14 апреля 2015

LPAD работает с VARCHAR2, так как не оставляет пробелов для оставшихся байтов. LPAD заменяет оставшиеся / нулевые байты нулями на LHS ТАК тип данных должен быть VARCHAR2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...