我在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