我在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脚本检查字符名称是否已存在并执行更新,否则将创建一个新条目。我必须创建“ Veneanar”和“Veneanâr”,但MySQL声称已经存在“Veneanâr”(不正确),脚本用错误的数据更新了该条目。

我不明白为什么会这样。我的mysql配置有问题吗?

最佳答案

我相信在您的情况下,您只需从列定义中删除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

10-07 16:13
查看更多