Почему приведение текста как varchar без указания длины усекает текст до 30 символов? - PullRequest
3 голосов
/ 22 апреля 2009

Я искал в базе данных 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 и это настраиваемый параметр?

Ответы [ 3 ]

6 голосов
1 голос
/ 22 апреля 2009

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

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

0 голосов
/ 22 апреля 2009

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

...