Supongamos que tenemos una cuenta de tabla, hay un campo acct_type varchar(2)
Insert into account(acct_type) values(888)
Salida:
+-----------+
| acct_type |
+-----------+
| * |
+-----------+
Espero que arroje un error cuando se inserte el desencadenador de instrucciones. ¿Por qué está almacenando *
valor en la tabla?
sql
sql-server
Ankush
fuente
fuente
integer
lugar devarchar
Respuestas:
Para el
varchar
tipo de datosint
, se lanzará un truncado en*
lugar de arrojar un error (en este caso, ya que los tres dígitos no caben en avarchar(2)
).Esto no sucede con
nvarchar
No hay forma de cambiar este comportamiento, se conserva por compatibilidad con versiones anteriores. Si este es un problema real para usted, puede agregar una restricción de verificación de que el valor en la columna no lo es,
*
pero no puedo imaginar ninguna situación en la que valga la pena hacerlo.La solución es simplemente no hacer eso. Si debe insertar un y
INT
luego validarlo,-9 to 99
primero está en el rango O utilice siempre comillas alrededor de valores destinados a una columna de cadena en lugar de depender de conversiones implícitas.fuente
ALTER TABLE account ADD CONSTRAINT CK_NoStar_acct_type CHECK (acct_type <> '*')
pero casi seguro que no necesitas hacer esto. Hay un montón dechar/varchar
columnas en la naturaleza con una longitud de10
o menos donde esta es una posibilidad teórica que se lleva bien sin eso. La restricción de verificación, por supuesto, también bloqueará una inserción explícita de,*
ya que no tiene forma de distinguir entre cómo*
se llegó avarchar
principio?varchar(2)
todos modos. Todo lo que se puede inferir es que lo intentaron al menos una vez y obtuvieron un resultado inesperado que preferirían haber cometido un error antes que fallar en silencio.varchar acepta tipo de cadena. podrá insertar valor entre símbolos ''. parece
Insert into account(acct_type) values('888')
Pero mostrará un error porque la longitud máxima es 2. la longitud del varchar icrease o la longitud de su valor máximo debe ser 2Insert into account(acct_type) values('88')
fuente