SELECT ....什么东西等于中文字符

时间:2012-12-22 21:06:24

标签: c# sql sql-server unicode

在C#窗口应用程序中,当我做

select * from myTable where category = '牛奶'

select * from myTable where category = 'baby牛奶'

结果不会返回任何行。

但是

select * from myTable where category = 'baby'

此结果返回一些行。有谁能告诉我为什么好吗?

注意:在myTable中,某些类别的列包含牛奶baby牛奶的某些值,我在窗口应用程序中显示中文字符没有问题。

牛奶是中文字符。

3 个答案:

答案 0 :(得分:9)

这不是C#问题,而是SQL问题。

确保传入的SQL字符串在SQL中被解释为Unicode字符串,方法是将其添加到N(SQL Server,MySQL):

select * from myTable where category = N'牛奶'

请参阅MSDN上的Constants (Transact-SQL)

  

Unicode字符串

     

Unicode字符串的格式类似于字符串,但前面有一个N标识符(N代表SQL-92标准中的国家语言)。 N前缀必须为大写。例如,'Michél'是字符常量,而N'Michél'是Unicode常量。 Unicode常量被解释为Unicode数据,并且不使用代码页进行评估。 Unicode常量确实有排序规则。此归类主要控制比较和区分大小写。除非使用COLLATE子句指定排序规则,否则为Unicode常量分配当前数据库的默认排序规则。对于字符数据,每个字符使用2个字节而不是每个字符1个字节来存储Unicode数据。

答案 1 :(得分:0)

N前面添加Chinese texts前缀是可以接受的。您添加此前缀以进行转换。但是你可能想知道它有一个缺点。

如果字符串的目的地为N列或参数,请使用nvarchar(...)作为前缀。如果它们的目的地为varchar(...)列或参数,则省略它,否则最终会导致不必要的转化。

参考:is there a downside to putting N in front of strings in scripts? Is it considered a "best practice"?

答案 2 :(得分:0)

我今天在Java-MySQL应用程序中遇到了这个问题,我认为这与编程语言无关,因此它可以很好地解决问题。更改数据库连接网址来自

  • jdbc:mysql:// foo:3308 / bar

  • jdbc:mysql:// foo:3308 / bar?characterEncoding = utf8

一切都会很好。