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

integerlugar devarcharRespuestas:
Para el
varchartipo 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
nvarcharNo 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
INTluego validarlo,-9 to 99primero 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/varcharcolumnas en la naturaleza con una longitud de10o 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ó avarcharprincipio?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