我理解SQL Server中的变幻莫测 - varchar vs nvarchar等。我在存储和检索Unicode数据时没有问题。但是,我们选择保留一些字段作为varchar,因为这些字段中的非ASCII字符被认为是异常的。
当Unicode字符进入其中一个非Unicode字段时,SQL Server会将其转换为问号:“?”。但是,有时很难判断何时发生了替换,因为问号是这些字段中的有效字符。
我的问题:我可以让SQL Server使用不同的替换字符,而不是问号吗?例如,下划线甚至空字符串('')?
答案 0 :(得分:1)
你是对的,任何没有ASCII等效的unicode字符会在你把它放入varchar时导致数据丢失,并留下一个问号:
select ascii(cast(nchar(1000) as varchar));
我同意R. Martinho Fernandes,你需要在应用层解决这个问题。你可以让应用程序用你想要的任何东西替换任何值超过255的2字节unicode对。也许您可以将应用层编码更改为仅接受ASCII和扩展ASCII数据。但是在这种情况下试图弄错数据层就像是说:“我们的数据字段只接受'M'或'F'。当用户向我们发送'Z'时,为什么数据库会抱怨?“
答案 1 :(得分:1)
因为我很无聊。我接近肯定,这在应用程序中没有用,但它确实按照你的要求行事。如果你真的想要......你可以创建一个函数。
Declare @Nvarchar Nvarchar(25) = N'Hɶppy',
@NVbinary Varchar(128),
@parse Int = 3,
@NVunit Varchar(4),
@result Varchar(64) = '0x',
@SQL Nvarchar(Max);
Select @NVbinary = master.sys.fn_varbintohexstr(Convert(Varbinary(128),@Nvarchar))
While (@parse < Len(@NVbinary))
Begin
Select @NVunit = Substring(@NVbinary,@parse,4),
@parse = @parse + 4
If Substring(@NVunit,3,2) = '00'
Begin
Set @result = @result + Substring(@NVunit,1,2)
End
Else
Begin
Set @result = @result + '22' -- 22 is the hex value for quotation mark; Use Select Convert(Varbinary(8),'"') to get the value for whatever non-unicode character you want.
End
End
Set @SQL = 'Select Convert(Varchar(128),' + @result + '), ''' + @result + ''''
Select @Nvarchar, @NVbinary
Exec sp_executeSQL @SQL
答案 2 :(得分:1)
直接回答你的问题是,你不能'设置'那个角色。正如其他人建议的那样,您可能已经知道,需要检查“特殊”varchar字段中的有效数据。