3

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

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

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

4

3 回答 3

1

没错,任何没有 ASCII 等价物的 unicode 字符在您将其放入 varchar 时都会导致数据丢失,并留下一个问号:

select ascii(cast(nchar(1000) as varchar));

我同意 R. Martinho Fernandes 的观点,你需要在应用层解决这个问题。您可以让应用程序用您想要的任何内容替换任何价值超过 255 的 2 字节 unicode 对。也许您可以更改应用层编码以仅接受 ASCII 和扩展 ASCII 数据。但是在这种情况下试图对数据层进行故障处理就像是在说“我们的数据字段只接受'M'或'F'。” 为什么当用户向我们发送“Z”时数据库会抱怨?”

于 2013-03-28T17:09:46.497 回答
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
于 2013-03-28T17:20:23.350 回答
1

直接回答您的问题是,您不能“设置”该角色。正如其他人建议的那样,您可能已经知道,需要检查您的“特殊”varchar 字段的有效数据。

于 2013-03-28T17:38:29.897 回答