2009-11-02 180 views
0

我在.NET网站上遇到了拉丁(åäö)和拉脱维亚(āē)字符需要共存的问题。在数据库中,我为我的字段使用nvarcharntext,如果将文本直接输入到数据库中,则一切正常。.NET字符编码问题

问题是,当我使用SQL UPDATE,拉脱维亚字符转换为类似的拉丁字符输入完全相同的文本时,字符串“åäöāē”将被保存为“åäöae”。

我已经尝试了一下不同CodePages,但我还没有得到我想要的结果。有没有人有什么建议?

回答

4

您的SQL语句是否将值作为unicode值传递给数据库?

例如基本的例子

INSERT YourTable VALUES ('Unicode Value') 

应该是:

INSERT YourTable VALUES (N'Unicode Value') 

显然,我建议你使用参数化的SQL /存储过程并定义参数作为一个nvarchar,但你我在说什么。

+0

只是好奇:为什么推荐存储过程? – cethegeek 2009-11-02 15:55:45

+2

重点是使用参数化语句。我个人喜欢存储过程:可维护性,可调性(无需更改/重新部署代码),安全性(无需授予基础表的明确权限,只需执行SPROC的EXECUTE权限).... – AdaTheDev 2009-11-02 16:03:31

0

Windows窗体应用程序

输入文本时为Windows窗体的文本框,您需要使用Unicode字体如Arial Unicode的MS。

网页

确保您使用UTF-8作为你的回应代码页。来自微软的正式文章http://support.microsoft.com/kb/893663

UTF-8将正确编码任何字符。请记住,数据库中的NText和NVarChar是UTF-16数据类型,因此从查询分析器查看数据可能会正确显示它。

在SQL

如果你动态地构造SQL,请确保您使用的N个前缀,例如

INSERT INTO TABLE (Name, Number) VALUES (N'MyName', 1) 
1

分别拿出每条管道来计算发生了什么。

看到我的文章debugging unicode problems并诊断出现问题的地方。地方,你可能会看到问题:

  • 从用户
  • 获取数据更新数据库
  • 从数据库
  • 抓取显示的数据,你已经获取

检查每个独立,从不依赖于任何特定的字体等打印出的Unicode代码点(根据文章)。噢,无论你在哪里指定它,使用可以编码所有内容的编码 - 我建议使用UTF-8编码。

+0

UTF-8可以对所有内容进行编码,但只会正确显示正确的代码页。 – badbod99 2009-11-02 15:36:13

+0

@ badbod99:你的意思是“使用正确的代码页”?当然,解码编码数据的任何东西都需要知道涉及哪种编码......并且如果您要显示字形,字体必须是正确的。 – 2009-11-02 15:45:17

+0

你是对的:-) codepage与UTF-8无关。我的错。 – badbod99 2009-11-02 15:54:41