Почему CAST обрезает текст, а не выдаёт ошибку?

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

select cast('ROAD-1234' as varchar2(8)) as id
from dual
/
ID      
--------
ROAD-123  
--------^ Заметьте, 4-ка исчезла

Предпологал, что CAST AS VARCHAR2 будет вести себя аналогично CAST AS NUMBER.

select cast(1234 as number(3)) as id
from dual

ORA-01438: значение больше, чем позволяет заданная для этого столбца точность
01438. 00000 - "value larger than specified precision allowed for this column"


Почему CAST AS VARCHAR2 молча обрезает значение, а не выдает ошибку, как CAST AS NUMBER?


Свободный перевод вопроса Why does CAST truncate text? от участника @User1973


Ответы (1 шт):

Автор решения: 0xdb

Это часть стандарта ANSI SQL, и другие СУБД, совместимые с ANSI SQL, будут вести себя также:

For fixed length character string targets, if the length of the source equals the fixed length of the target, the result of the CAST is the source string. If the length of the source is shorter than the fixed length of the target, the result of the CAST is the source string padded on the right with however many spaces are required to make the lengths match. If the length of the source is longer than the fixed length of the target, the result of the CAST is a character string that contains as much of the source string as possible – in this case, if the truncated characters are not all spaces, your DBMS will return the SQLSTATE warning 01004 "warning-string data, right truncation".

К сожалению, БД не могут одновременно выдавать предупреждение и возвращать результат, поэтому они обрезают результат молча.


Прим.ред.: предупреждение это не исключение, для предупреждений существует битовый флаг в OCI, который возвращается вместе результатом. Многие инструменты/приложения игнорируют этот флаг.


Свободный перевод ответа от участника @Sayan Malakshinov

→ Ссылка