5

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

select * from myTable where category = '牛奶'

或者

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

结果不返回任何行。

select * from myTable where category = 'baby'

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

注意:在 myTable 中,某些类别的列有一些带有牛奶or的值baby牛奶,我在窗口应用程序上显示汉字没有问题。

牛奶是汉字。

4

3 回答 3

13

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

确保传入的 SQL 字符串在 SQL 中被解释为 Unicode 字符串,方法是在它前面加上N(SQL Server, MySQL ):

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

请参阅MSDN 上的常量 (Transact-SQL)

Unicode 字符串

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

于 2012-12-22T21:08:08.297 回答
0

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

Nnvarchar(...)列或参数添加前缀的字符串。如果它们用于varchar(...)列或参数,则省略它,否则最终会导致不必要的转换。

参考:在脚本中将 N 放在字符串前面有缺点吗?它被认为是“最佳实践”吗?

于 2012-12-22T21:12:05.223 回答
0

我今天用我的Java-MySQL应用程序遇到了这个问题,我认为它与编程语言无关,所以它可以在问题的情况下很好地工作。更改数据库连接 url 从

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

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

一切都会好起来的。

于 2020-10-20T11:47:35.207 回答