回答:
以下のためvarcharのデータ型切り捨てintとしてキャストされる*代わりに、(3桁がに収まらないとして、この場合にエラーをスローしますvarchar(2))。
これは起こりません nvarchar
この動作を変更する方法はありません。下位互換性のために保持されています。これが実際の問題である場合は、列の値*がそうではないというチェック制約を追加できますが、これが本当に価値がある状況は想像できません。
解決策は、それを行わないことです。挿入する必要がある場合INTは、-9 to 99最初に範囲内にあることを確認してください。または、暗黙の変換に依存するのではなく、常に文字列列を宛先とする値を引用符で囲みます。
ALTER TABLE account ADD CONSTRAINT CK_NoStar_acct_type CHECK (acct_type <> '*')しかし、ほぼ間違いなくこれを行う必要はありません。char/varchar野生の列には長さ10以下のトンがあり、これは理論的に可能であり、それがなくてもうまくいく。もちろん*、それがどのよう*に到着したかを区別する方法がないので、チェック制約はの明示的な挿入もブロックします
varchar最初からaなのでしょうか?
varchar(2)とにかく有効な値ではありませんが、この列に整数を格納することだけを意図していることを示す質問には何もありません。推測できるのは、少なくとも1回は試行した結果、黙って失敗するのではなくエラーが発生するという予期しない結果が得られたことです。
varcharは文字列型を受け入れます。''記号の間に値を挿入できます。のように見えますがInsert into account(acct_type) values('888')
、最大長が2であるため、エラーが表示されます。icrease varcharの長さまたは最大値の長さは2でなければなりませんInsert into account(acct_type) values('88')
integerのではなくvarchar