在C#窗口应用程序中,当我做
时select * from myTable where category = '牛奶'
或
select * from myTable where category = 'baby牛奶'
结果不会返回任何行。
但是
select * from myTable where category = 'baby'
此结果返回一些行。有谁能告诉我为什么好吗?
注意:在myTable中,某些类别的列包含牛奶
或baby牛奶
的某些值,我在窗口应用程序中显示中文字符没有问题。
牛奶
是中文字符。
答案 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应用程序中遇到了这个问题,我认为这与编程语言无关,因此它可以很好地解决问题。更改数据库连接网址来自
到
一切都会很好。