Подтвердить что ты не робот

MySQL - как почтовый индекс на передней панели с "0"?

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

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

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

Итак, " Holtsville, New York" с zipcode "00544" хранится в моей базе данных как "544"

и

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

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

UPDATE

Я просто изменил zipcode как тип данных VARCHAR (5)

4b9b3361

Ответ 1

Сохраняйте свои zipcodes как 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

Ответ 2

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

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

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

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

Ответ 3

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

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

Это будет заполнять все значения в столбце ZipCode до 5 символов, добавив "0 ​​слева".

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

CHAR(5)

или

MEDIUMINT (5) UNSIGNED ZEROFILL

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

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

Ответ 6

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

Ответ 7

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