【问题标题】:How do I return a Unicode value in this SQL example?如何在此 SQL 示例中返回 Unicode 值?
【发布时间】:2009-12-24 16:24:37
【问题描述】:

我需要从 SQL Server 2005 数据库表中返回俄语文本。

在以下示例中,这是描述我的困境的简单方法,@Test 变量将打印出问号:

DECLARE @Test nvarchar(max)
SET @Test = 'Баннер'
PRINT @Test

(注意@Test 值是俄语文本,对于那些没有安装字体的人。)

但如果我将代码更改为以下内容,@Test 变量将按预期打印出文本:

DECLARE @Test nvarchar(max)
SET @Test = N'Баннер'
PRINT @Test

这是我想知道的:

在我的真实示例中,我使用存储过程执行以下操作:

EXEC usp_GetContent @Content = @Test

@Test 的值是俄语,但显示为问号。如果 proc 看起来像这样,那么俄语就很好:

EXEC usp_GetContent @Content = N'Баннер'

但这对我来说是不可能的;我需要传入一个变量。

有什么建议吗?

谢谢。

【问题讨论】:

    标签: sql stored-procedures unicode parameters


    【解决方案1】:

    只要将存储过程参数定义为unicode如nvarchar,并且调用代码显式定义命令的参数对象为相同类型就可以正常工作。

    当您用 SQL 编写它时,您在第一个示例中传入了一个 varchar,所以它没有理解它。

    问题在于:

    SET @Test = 'Баннер'
    

    不是存储过程。

    【讨论】:

      【解决方案2】:

      您收到问号的原因可能有 2 个。当您在存储过程调用之前设置变量时,您没有输入“N”。或者当您打印输出时,生成的字体不支持双字节字符。

      【讨论】:

        【解决方案3】:

        这个查询:

        SELECT  COLLATIONPROPERTY(CAST(SERVERPROPERTY('Collation') AS NVARCHAR), 'CodePage')
        

        将返回您服务器的默认代码页,该代码页很可能与 1251866 不同。

        当你使用这个常量时:

        'Баннер'
        

        ,服务器将尝试将通过连接获取的俄语符号转换为您的代码页中的内容。

        但是您的代码页 437(或任何您拥有的)不允许进行这种转换,这就是字符被问号替换的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-08
          • 1970-01-01
          • 2012-02-07
          • 1970-01-01
          • 2021-06-05
          • 1970-01-01
          相关资源
          最近更新 更多