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 在这一点上似乎是正确的选择,但我必须不区分大小写。

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

utf8_bin

  • 没有任何

有没有办法这样做?

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


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

正在为我工​​作,因为我的数据库中的“Änne”和“änne”之间没有区别。

4

2 回答 2

1

关于什么:

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

引用文档

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

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

col_name COLLATE latin1_general_cs LIKE 'a%'
于 2012-06-27T19:41:35.630 回答
0

您的 MySQL 代码中存在错误:

SELECT * FROM names WHERE name = "Änne"

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

于 2012-06-27T19:42:47.340 回答