我在.NET网站上遇到了拉丁(åäö)和拉脱维亚(āē)字符需要共存的问题。在数据库中,我为我的字段使用nvarchar
和ntext
,如果将文本直接输入到数据库中,则一切正常。.NET字符编码问题
问题是,当我使用SQL UPDATE
,拉脱维亚字符转换为类似的拉丁字符输入完全相同的文本时,字符串“åäöāē”将被保存为“åäöae”。
我已经尝试了一下不同CodePages
,但我还没有得到我想要的结果。有没有人有什么建议?
我在.NET网站上遇到了拉丁(åäö)和拉脱维亚(āē)字符需要共存的问题。在数据库中,我为我的字段使用nvarchar
和ntext
,如果将文本直接输入到数据库中,则一切正常。.NET字符编码问题
问题是,当我使用SQL UPDATE
,拉脱维亚字符转换为类似的拉丁字符输入完全相同的文本时,字符串“åäöāē”将被保存为“åäöae”。
我已经尝试了一下不同CodePages
,但我还没有得到我想要的结果。有没有人有什么建议?
您的SQL语句是否将值作为unicode值传递给数据库?
例如基本的例子
INSERT YourTable VALUES ('Unicode Value')
应该是:
INSERT YourTable VALUES (N'Unicode Value')
显然,我建议你使用参数化的SQL /存储过程并定义参数作为一个nvarchar,但你我在说什么。
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)
分别拿出每条管道来计算发生了什么。
看到我的文章debugging unicode problems并诊断出现问题的地方。地方,你可能会看到问题:
检查每个独立,从不依赖于任何特定的字体等打印出的Unicode代码点(根据文章)。噢,无论你在哪里指定它,使用可以编码所有内容的编码 - 我建议使用UTF-8编码。
只是好奇:为什么推荐存储过程? – cethegeek 2009-11-02 15:55:45
重点是使用参数化语句。我个人喜欢存储过程:可维护性,可调性(无需更改/重新部署代码),安全性(无需授予基础表的明确权限,只需执行SPROC的EXECUTE权限).... – AdaTheDev 2009-11-02 16:03:31