代码之家  ›  专栏  ›  技术社区  ›  Stimy

为什么SQL Server在nvarchar字段中存储问号字符而不是日语字符?

  •  24
  • Stimy  · 技术社区  · 15 年前

    我正在尝试在我的SQL Server 2000数据库的nvarchar字段中存储日语字符。

    当我运行如下更新语句时:

    update blah 
    set address = N'スタンダードチャ'
    where key_ID = 1
    

    从SQLServerManagementStudio中,然后运行一条select语句,我只看到返回到结果窗口的问号。我在查看数据库的网页上看到了同样的问号。

    这似乎是存储正确数据的问题,对吗?有人能告诉我我需要做什么不同吗?

    8 回复  |  直到 7 年前
        1
  •  4
  •   cjk    9 年前

    您需要从数据库、数据访问和表示层检查处理这些数据的所有代码的全球化设置。这包括SSM。

    (您还需要确定您使用的是哪个版本,2003不存在…)

        2
  •  92
  •   Community THelper    7 年前

    对于您的示例,这不能是正确的答案,但我看到的最常见原因是字符串文本不需要Unicode N前缀。

    所以,而不是

    set address = N'スタンダードチャ'
    

    可以尝试写入没有unicode前缀的nvarchar字段

    set address = 'スタンダードチャ'
    

    参见: N prefix before string in Transact-SQL query

        3
  •  12
  •   Deepashri    10 年前

    当我在数据库nvarchar字段中存储时使用印度语言字符时,我也面临着同样的问题。然后我浏览了这篇微软的文章-

    http://support.microsoft.com/kb/239530

    我遵循这一点,我的Unicode问题得到了解决。在这篇文章中,他们说-你必须 在所有Unicode字符串前面加上前缀n 处理SQL Server中的Unicode字符串常量时

    SQL Server Unicode支持

    SQL Server Unicode数据类型支持UCS-2编码。Unicode数据类型使用每个字符两个字节而不是一个字节来存储字符数据。两个字节中有65536个不同的位模式,因此Unicode可以使用一组标准的位模式对所有语言中的每个字符进行编码,包括具有大量字符的中文等语言。

    在SQL Server中,支持Unicode数据的数据类型为:

    nchar
    nvarchar
    nvarchar(max) – new in SQL Server 2005
    ntext
    

    nchar、nvarchar、nvarchar(max)和ntext的用法分别与char、varchar、varchar(max)和text相同,除了:

    - Unicode supports a wider range of characters.
    - More space is needed to store Unicode characters.
    - The maximum size of nchar and nvarchar columns is 4,000 characters, not 8,000     characters like char and varchar.
    - Unicode constants are specified with a leading N, for example, N'A Unicode string'
    

    适用于

    Microsoft SQL Server 7.0 Standard Edition
    Microsoft SQL Server 2000 Standard Edition
    Microsoft SQL Server 2005 Standard Edition
    Microsoft SQL Server 2005 Express Edition
    Microsoft SQL Server 2005 Developer Edition
    Microsoft SQL Server 2005 Enterprise Edition
    Microsoft SQL Server 2005 Workgroup Edition
    
        4
  •  2
  •   Suraj Bhatia    9 年前

    您需要在字符串值之前写入n。 例如,插入LabelManagement(keyValue)值 (n'変更命令'); 在这里,我用日语存储值,并在字符串之前添加了n。 我正在使用SQL Server 2014。 希望你能找到解决办法。 享受。

        5
  •  1
  •   SQLMenace    15 年前

    SSMS无法正确显示,您可能会看到问号或方框。

    将结果粘贴到Word中,结果应该是日语

    在需要设置内容类型的网页中,下面的代码将显示中文big5

    <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=big5"> 
    

    要验证数据,您不能使用ASCII,因为ASCII只能看到ASCII字符集

    运行此

    选择unicode(地址),ascii(地址) 来自blah,其中key_id=1

    输出应该如下(它只查看第一个字符) 12473 63

        6
  •  1
  •   Will    12 年前

    我几乎可以保证数据类型不是Unicode。如果您想了解更多信息,可以查看维基百科中有关Unicode、ASCII和ANSI的信息。Unicode可以存储更多的唯一字符,但需要更多的空间来存储、传输和处理。还有一些程序和其他东西不支持Unicode。MS SQL的Unicode数据类型为“nchar”、“nvarchar”和“ntext”。

        7
  •  0
  •   HKstrongside    7 年前

    我们正在使用 Microsoft SQL Server 2008 R2(SP3) . 我们的表排序规则被指定为 SQL_Latin1_General_CP1_CI_AS . 我把我的类型指定为N种

    nvarchar(MAX)
    nchar(2)
    

    ..等

    要插入日语字符,我在字符串前面加上大写N

    N'素晴らしい一日を'
    

    很有魅力。

        8
  •  0
  •   Paresh    7 年前

    代码是绝对正确的。可以在声明为nvarchar的字段中插入前缀为n的Unicode字符串。所以你能检查地址是否是nvarchar列吗?在SQL Server 2008R2中测试了以下代码,该代码工作正常。

    update blah 
    set address = N'スタンダードチャ'
    where key_ID = 1
    

    enter image description here