Angenommen, wir haben ein Tabellenkonto, es gibt ein Feld acct_type varchar(2)
Insert into account(acct_type) values(888)
Ausgabe:
+-----------+
| acct_type |
+-----------+
| * |
+-----------+
Ich erwarte, dass beim Auslösen der Anweisung ein Fehler ausgelöst wird. Warum speichert es *
Wert in Tabelle?
sql
sql-server
Ankush
quelle
quelle
integer
alsvarchar
Antworten:
Für den
varchar
Datentyp wird ein abgeschnittener Wert wieint
folgt ausgegeben,*
anstatt einen Fehler auszulösen (in diesem Fall, da die drei Ziffern nicht in a passenvarchar(2)
).Dies passiert nicht mit
nvarchar
Es gibt keine Möglichkeit, dieses Verhalten zu ändern. Es wird aus Gründen der Abwärtskompatibilität beibehalten. Wenn dies ein echtes Problem für Sie ist, können Sie eine Prüfbedingung hinzufügen, dass der Wert in der Spalte nicht ist,
*
aber ich kann mir keine Situation vorstellen, in der es sich wirklich lohnt, dies zu tun.Die Lösung ist einfach, das nicht zu tun. Wenn Sie eine einfügen müssen,
INT
überprüfen Sie diese zuerst im Bereich-9 to 99
. Oder verwenden Sie immer Anführungszeichen um Werte, die für eine Zeichenfolgenspalte bestimmt sind, anstatt sich auf implizite Konvertierungen zu verlassen.quelle
ALTER TABLE account ADD CONSTRAINT CK_NoStar_acct_type CHECK (acct_type <> '*')
aber Sie müssen dies mit ziemlicher Sicherheit nicht tun. Es gibt eine Mengechar/varchar
wild lebender Säulen mit einer Länge von10
oder weniger, wo dies eine theoretische Möglichkeit ist, die ohne das gut auskommt. Die Prüfbeschränkung blockiert natürlich auch eine explizite Einfügung von,*
da sie nicht unterscheiden kann, wie sie erreicht*
wurdevarchar
Anfang?varchar(2)
ohnehin kein gültiger Wert für das ist. Alles, was gefolgert werden kann, ist, dass sie es mindestens einmal versucht haben und ein unerwartetes Ergebnis erhalten haben, das sie lieber falsch gemacht hätten, als stillschweigend zu scheitern.varchar accept string type. Sie können einen Wert zwischen '' Symbolen einfügen. sieht aus wie
Insert into account(acct_type) values('888')
Aber es wird ein Fehler angezeigt, da die maximale Länge 2 beträgt. icrease varchar length oder Ihre maximale Wertlänge muss 2 seinInsert into account(acct_type) values('88')
quelle