在SQL Server中,我们可以从“?”更改Unicode替换字符吗?别的什么?

时间:2013-03-28 15:28:39

标签: sql-server unicode

我理解SQL Server中的变幻莫测 - varchar vs nvarchar等。我在存储和检索Unicode数据时没有问题。但是,我们选择保留一些字段作为varchar,因为这些字段中的非ASCII字符被认为是异常的。

当Unicode字符进入其中一个非Unicode字段时,SQL Server会将其转换为问号:“?”。但是,有时很难判断何时发生了替换,因为问号是这些字段中的有效字符。

我的问题:我可以让SQL Server使用不同的替换字符,而不是问号吗?例如,下划线甚至空字符串('')?

3 个答案:

答案 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字段中的有效数据。