Почему приведение текста как varchar без указания длины сокращает текст на 30 символов?

StackOverflow https://stackoverflow.com/questions/777394

Вопрос

Я искал в базе данных MS-SQL Server 2005, чтобы убедиться, что длина определенного текстового поля всегда была кратна 8.Когда я выполнил следующий запрос, я получил, что несколько строк имели длину 30.Но когда я исследовал эти записи, я обнаружил, что они были длиннее этого.

select distinct len(cast(textfield as varchar)) from tablename

Однако, если я указываю длину varchar как нечто большее (как в следующем запросе), это работает нормально.

select distinct len(cast(textfield as varchar(1000))) from tablename

Кто-нибудь знает, почему по умолчанию установлено значение 30 и является ли это настраиваемым параметром?

Это было полезно?

Другие советы

Приведение может произойти, когда есть много разных строк, которые должны соответствовать этому столбцу.Компонент database engine, поскольку он не идеален, не хочет утруждать себя проверкой длины всех возможных строк, которые может вернуть запрос, чтобы узнать, как долго устанавливать максимальное значение, поэтому он не проверяет ни одной строки - он просто принимает значение по умолчанию 30, что является произвольным приблизительным предположением, поскольку он не знает лучшего.

Возможно, с их стороны было бы разумно установить значение по умолчанию примерно 256 или какую-то другую максимальную длину для VARCHAR, но я думаю, что больше всего на свете это полезное напоминание о том, что на самом деле он не знает, сколько вам нужно времени, пока вы не укажете его.

Это произвольное число, и, насколько я знаю, оно не настраивается.Я не могу припомнить случая, когда вы не хотели бы указывать длину.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top