我有一些使用bit
数据类型的列。最终用户现在想要一个N / A选项,所以在我使用一点来捕获“是/否”之前(1为是,0为否)我现在需要有三个选项是/否/ NA我可以存储就像varchar
中的文字一样。
有没有办法将列的数据类型从bit
更改为varchar
并且还更新当前记录数据,其中任何0更改为“否”,1更改为“是” ?
答案 0 :(得分:8)
为什么不用NULL
来表示" n / a"?
否则将TINYINT
与包含值0,1和2(或者可能是1,2和3)及其含义的查找表一起使用。然后在两个表之间添加一个FK,以强制只输入这些值。
last 选项将使用CHAR(1)
列。只有您还指定了二进制排序规则(例如Latin1_General_100_BIN2
)时,这将是正常的。二进制排序规则将使您不会失去其他两个选项的性能。如果没有二进制排序规则,字符串列会将值与语言规则进行比较,这些规则需要额外的时间,但对此用法没有任何意义。为了保持一致性,您还需要AFTER INSERT, UPDATE
触发器首先UPPER()
此值,然后强制所有值都是Y
,N
或A
(对于" n / a")。这比0,1和2(通过TINYINT
)更具可读性,并且同样有效地进行搜索,也只有1个字节,BUT使用时需要记住仅指定大写字母,否则它们可能不会得到预期的结果。
没有理由 使用VARCHAR(3)
并存储完整的值N/A
/ Yes
/ No
,除非你只是& #39; t关心系统变慢; - )。
答案 1 :(得分:0)
答案 2 :(得分:0)
实际上char(3)会更节省空间
或者像scutzly建议的那样使用带有FK表的tinyint
我死了很惊讶,但我可以在SSMS中通过右键设计将位转换为char(3)。
答案 3 :(得分:0)
Alter Table TableName
Alter Column ColumnName Varchar(3)
Update TableName
Set ColumnName = 'Yes'
Where ColumnName = '1'
Update TableName
Set ColumnName = 'No'
Where ColumnName = '0'