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)
Ответы
Ответ 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