MySQL LIKE不适用于“â”

时间:2015-10-08 18:41:44

标签: mysql utf-8

我在Windows 2012R2上运行MySQL 5.6.26,在mysql.ini中,所有内容都配置为使用UTF-8 Unicode(utf8)。

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8

我使用此表:

CREATE TABLE IF NOT EXISTS `wcf1_guildtool_playerdata` (
  `charID` int(11) NOT NULL,
  `charname` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `realmname` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
  `class` int(11) DEFAULT NULL,
  `race` int(11) DEFAULT NULL,
  `gender` int(11) NOT NULL,
  `level` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

当我执行以下SQL命令时:

SELECT * FROM wcf1_guildtool_playerdata WHERE charname LIKE 'Veneanâr'

数据库将这个数据返回给我:

  

118 Veneanar Forscherliga 3 5 0 56

但它应该什么也不返回,因为“Veneanâr”没有条目。

我的PHP脚本(使用PDO语句)在PHPMyAdmin甚至在mysql命令行中都会出现此问题。

我的PHP脚本检查charname是否已存在并执行更新,否则会创建新条目。我必须创建“Veneanar”和“Veneanâr”,但是当MySQL声称已经存在“Veneanâr”(这不是真的)时,脚本会使用错误的数据更新条目。

我无法理解为什么会这样。我的mysql配置有问题吗?

3 个答案:

答案 0 :(得分:1)

MySQL将treatä视为一种。参见文档:

http://dev.mysql.com/doc/refman/5.1/en/charset-collation-effect.html

http://dev.mysql.com/doc/refman/5.1/en/charset-unicode-sets.html

要进行严格的查询,您可以执行以下操作:

SELECT * FROM wcf1_guildtool_playerdata WHERE charname LIKE 'Veneanâr' COLLATE utf8_bin

答案 1 :(得分:0)

你能不能使用:

SELECT * FROM wcf1_guildtool_playerdata WHERE charname LIKE 'Venean'+CHAR(131)+'r'

你为什么还在这里使用LIKE?

这会更有意义:

..WHERE charname LIKE '%Venean'+CHAR(131)+'r'

或者,更好的是:您可以通过PHP查看HTMLEntities的使用,以正确编码您的页面和SQL查询。

参考。 http://www.asciitable.com/

参考。 http://php.net/manual/en/function.htmlspecialchars.php

参考。 http://php.net/manual/en/function.htmlentities.php

希望这会有所帮助!!

答案 2 :(得分:0)

我相信您可以从列定义中删除COLLATE并为整个表设置COLLATE=utf8_bin

CREATE TABLE IF NOT EXISTS `wcf1_guildtool_playerdata` (
  `charID` int(11) NOT NULL,
  `charname` varchar(20) NOT NULL,
  `realmname` varchar(25)  NOT NULL,
  `class` int(11) DEFAULT NULL,
  `race` int(11) DEFAULT NULL,
  `gender` int(11) NOT NULL,
  `level` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

在此处使用表格定义和不同的查询:http://sqlfiddle.com/#!9/40907/3

相关问题