У меня есть относительно простой сайт, который использует php + mssql. У меня есть различные хранимые процедуры, которые делают простую вставку и удаление работы. Проблема, с которой я сталкиваюсь, заключается в том, что многие параметры, которые я передаю в хранимую процедуру, имеют ту же длину, что и столбец, в который я буду вставлять данные.
Например, у меня есть хранимая процедура для регистрации пользователя. Хранимая процедура имеет параметр @USERNAME
с varchar(12)
как тип. колонна USERNAME
в USER
таблица имеет тот же тип с этой длиной. В принципе это не проблема. Но я бы предпочел свободно менять USERNAME
длина столбца без необходимости также изменять длину параметра хранимой процедуры.
Я не могу использовать табличные параметры, так как драйверы mssql php их не поддерживают.
Единственное решение, которое я могу себе представить, это просто использовать varchar (max) для параметров хранимой процедуры, но считается ли это плохой практикой?
Краткий ответ: да.
Что бы это значило, если бы кто-то передал имя пользователя длиной 2 147 483 647 символов !? Используя varchar (max), вы подразумеваете, что все будет в порядке.
Я согласен с комментарием @DanGuzman. Прежде всего, столбцы таблицы должны иметь соответствующий размер, а затем параметры и переменные должны иметь соответствующий размер. Если вам нужно изменить размер столбца таблицы, то вы должны распространить это изменение в другом месте — это лучший подход.
Однако правильно подобрать размер столбцов таблицы не всегда просто — как долго должно быть имя пользователя? 12 кажется коротким, 2 147 483 647 определенно слишком длинным — где-то посередине? 😉 @JohnCappelletti имеет и правильную точку — хранение и обработка обходятся дешевле, чем затраты на внесение изменений, поэтому при определении размера ошибайтесь.
Если varchar (max) — это плохо, и вы не хотите следовать передовым методам, есть ли середина? Может быть, использовать коэффициент 10? Что-то достаточно выше фактического размера, но не слишком.
Еще одна вещь, на которую следует обратить внимание, независимо от того, как вы измеряете параметры, — это обрезание без вывода сообщений или ошибки усечения во время выполнения — проверьте длины явно.
Других решений пока нет …