特殊字符和简单的选择查询

时间:2012-06-27 19:37:04

标签: mysql unicode utf-8 special-characters

我遇到了一个简单的Select Query和特殊字符的问题。我想选择名字Änne。

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

utf8_general_ci

  • ANNE
  • 安妮
好的,...

  

utf8 general ci是一个非常简单的整理。这是做什么的   删除所有重音然后转换为大写并使用此类“基本字母”结果字母的代码进行比较。   http://forums.mysql.com/read.php?103,187048,188748

utf8_unicode_ci

  • ANNE

为什么?

utf8_bin

  • ANNE

utf8_bin在这一点上似乎是正确的选择,但我必须做我的搜索案例不敏感。

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

utf8_bin

有没有办法这样做?

我可以使用php ucwords()来大写第一个字母,但我更愿意找到一个数据库解决方案。 编辑:ucwords('änne')=änne,所以我也不能使用它


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

对我有用,因为我的数据库中'Änne'和'änne'没有区别。

2 个答案:

答案 0 :(得分:1)

怎么样:

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

Quoting doc

  

默认字符集和排序规则是latin1和   latin1_swedish_ci,所以非二进制字符串比较就是这种情况   默认情况下不敏感。这意味着如果使用col_name进行搜索   LIKE'a%',您将获得以A或a开头的所有列值。要做   这个搜索大小写敏感,确保其中一个操作数有一个   区分大小写或二进制排序规则

这意味着区分大小写的结果是因为您设置了二进制排序规则。您可以将归类列设置为utf8_general_ci并在搜索时更改它:

col_name COLLATE latin1_general_cs LIKE 'a%'

答案 1 :(得分:0)

您的MySQL代码中存在错误:

SELECT * FROM names WHERE name = "Änne"

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