Почему приведение / преобразование из int возвращает звездочку - PullRequest
34 голосов
/ 03 февраля 2012

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

Теперь очевидно, что оба следующих сценария должны завершиться неудачей.

#1:

DECLARE @x BIGINT
SET @x = 100
SELECT CAST(@x AS VARCHAR(2))

Очевидная ошибка:

Сообщение 8115, уровень 16, состояние 2, строка 3
Ошибка арифметического переполнения при преобразовании выражения в тип данных varchar.

# 2:

DECLARE @x INT
SET @x = 100
SELECT CAST(@x AS VARCHAR(2))

Не очевидно, что он возвращает * (можно было бы ожидать, что это также будет арифметическое переполнение ???)


Теперь мой реальный вопрос, почему ???Это просто умышленно или за этим стоит история или что-то зловещее?

Я просмотрел несколько сайтов и не смог получить удовлетворительный ответ.

Например http://beyondrelational.com/quiz/sqlserver/tsql/2011/questions/Why-does-CAST-function-return-an-asterik--star.aspx

http://msdn.microsoft.com/en-us/library/aa226054(v=sql.80).aspx

Обратите внимание, что я знаю / понимаю, что когда целое число слишком велико для преобразования в строку определенного размера, оно будет «преобразовано» в звездочку, это очевидноеответ, и я хотел бы, чтобы я мог понизить голос каждого, кто продолжает давать этот ответ.Я хочу знать, почему используется звездочка, а не выбрасывается исключение, например, по историческим причинам и т. Д. *

Ответы [ 2 ]

34 голосов
/ 08 апреля 2012

Для еще большего удовольствия, попробуйте это:

DECLARE @i INT
SET @i = 100
SELECT CAST(@i AS VARCHAR(2)) -- result: '*'
go

DECLARE @i INT
SET @i = 100
SELECT CAST(@i AS NVARCHAR(2)) -- result: Arithmetic overflow error

:)


Ответ на ваш вопрос: «Исторические причины»

Типы данных INT и VARCHAR старше, чем BIGINT и NVARCHAR. Намного старше. Фактически они соответствуют оригинальным спецификациям SQL. Также более старый подход подавления исключений - замена вывода звездочками.

Позже, специалисты по SQL решили, что выдача ошибки была лучше / более последовательной и т. Д., Чем замена поддельных (и, как правило, сбивающих с толку) выходных строк. Однако ради согласованности они сохранили прежнее поведение для ранее существующих комбинаций типов данных (чтобы не нарушать существующий код).

Итак (намного) позже, когда были добавлены типы данных BIGINT и NVARCHAR, они получили новое (er) поведение, потому что на них не распространяется дедушка, упомянутый выше.

2 голосов
/ 21 февраля 2018

Вы можете прочитать на странице CAST и CONVERT в разделе «Результаты усечения и округления».Int, smallint и tinyint будут возвращаться *, если длина результата слишком мала для отображения при преобразовании в char или varchar.Другие преобразования чисел в строки приведут к ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...