Suponha que tenhamos uma conta de tabela, existe um campo acct_type varchar(2)
Insert into account(acct_type) values(888)
Resultado:
+-----------+
| acct_type |
+-----------+
| * |
+-----------+
Espero que ele gere um erro ao inserir o gatilho de instrução. Por que está armazenando *
valor na tabela?
sql
sql-server
Ankush
fonte
fonte
integer
em vez devarchar
Respostas:
Para o
varchar
tipo de dados, um truncadoint
será convertido como em*
vez de gerar um erro (nesse caso, os três dígitos não se encaixam em avarchar(2)
).Isso não acontece com
nvarchar
Não há como alterar esse comportamento, ele é preservado para compatibilidade com versões anteriores. Se esse é um problema real para você, você pode adicionar uma restrição de verificação de que o valor na coluna não é,
*
mas não consigo imaginar nenhuma situação em que isso realmente valha a pena.A solução é simplesmente não fazer isso. Se você precisar inserir um
INT
e validar, ele estará no intervalo-9 to 99
primeiro. Ou sempre use aspas em torno dos valores destinados a uma coluna de string em vez de confiar em conversões implícitas.fonte
ALTER TABLE account ADD CONSTRAINT CK_NoStar_acct_type CHECK (acct_type <> '*')
mas você quase certamente não precisa fazer isso. Há uma tonelada dechar/varchar
colunas na natureza com comprimento igual10
ou inferior a onde essa é uma possibilidade teórica que se dá muito bem sem isso. Obviamente, a restrição de verificação também bloqueia uma inserção explícita,*
pois não há como distinguir entre como*
foi recebidavarchar
para começar?varchar(2)
método. Tudo o que se pode inferir é que eles tentaram pelo menos uma vez e obtiveram um resultado inesperado que prefeririam ter cometido um erro do que falhar silenciosamente.varchar aceita tipo de string. você pode inserir valor entre os símbolos ''. parece
Insert into account(acct_type) values('888')
Mas mostrará um erro porque o comprimento máximo é 2. comprimento do varchar de graxa ou seu valor máximo deve ser 2Insert into account(acct_type) values('88')
fonte