2012-06-27 52 views
1

我有一个简单的选择查询和特殊字符的问题。我想选择名称Änne。特殊字符和一个简单的选择查询

SELECT * FROM `names` WHERE `name` = 'Änne' 

utf8_general_ci

  • 安妮
  • 安妮

好,...

UTF8一般CI是一个非常简单的归类。它所做的只是 删除所有重音,然后转换为大写,并使用这种“基本字母”结果字母的代码进行比较。 http://forums.mysql.com/read.php?103,187048,188748

utf8_unicode_ci

  • 安妮
  • 安妮

为什么呢?

utf8_bin

  • 安妮

utf8_bin似乎是在这一点上是正确的选择,但我必须做我的搜索情况insensitiv。

SELECT * FROM `names` WHERE `name` = 'änne' 

utf8_bin

  • 没有

有没有办法这样做呢?

我可以使用php ucwords()大写第一个字母,但我更喜欢找到一个数据库解决方案。 编辑:ucwords(“安妮”)=安妮,所以我不能使用太


SELECT * FROM `names` WHERE lower(`name`) = 'änne' 

为我工作,因为我没有“安妮”和“安妮”之间的区别我的数据库。

回答

1

怎么样:

SELECT * FROM `names` WHERE upper(`name`) = upper("änne") 

Quoting doc

默认字符集和校对规则是LATIN1和 latin1_swedish_ci,所以非二进制字符串比较是区分 默认情况下不区分大小写。这意味着如果您使用col_name LIKE'a%'进行搜索,则会获得以A或a开头的所有列值。为了使 这个搜索区分大小写,请确保操作数之一具有 区分大小写的或二进制校对

这意味着,区分大小写的结果,因为你已经设置二进制排序。您可以设置排序列utf8_general_ci并改变它searchs:

col_name COLLATE latin1_general_cs LIKE 'a%' 
+0

我不能使用upper,因为它返回的字符串全部改为大写。在我的情况下,它只是第一个字母。 'SELECT * FROM WHERE名COLLATE latin1_general_cs =“änne''结果: #1253 - 整理‘的名字latin1_general_cs’是无效字符集‘utf-8’ – s3mre8

+0

阅读文档,似乎不区分大小写依赖比较特殊带有“基本”字母和反之亦然的字符。 – danihp

+0

似乎是正确的utf8_general_ci http://forums.mysql.com/read.php?103,187048,188748 – s3mre8

0

有一个在你的MySQL代码中的错误:

SELECT * FROM names WHERE name = "Änne" 

周围的表名和字段名删除引号。

+0

对不起,我的第一次尝试后得到了一个奇怪的错误消息,所以我删除了反引号。现在应该没问题。 – s3mre8