今天在看建表的sql语句时,突然看到如果字段为varchar类型时,会设置一下CHARACTER SET utf8 COLLATE utf8_bin,后来看了一下网上的贴子,设置collate的主要作用是设置对自符的较难规则。 举个例子吧: 按下面的sql语句去搜索 select to_id from test where to_id='cn象_王';
出现的结果会搜索出两条来 +---------------+ | to_id | +---------------+ | cn陶_陶 | | cn象_王 | +---------------+ 为什么?“cn陶_陶”与“cn象_王”编码后的字符都不一样,但是为什么mysql会认为这两条记录是一样的呢? 如果把COLLATE **_bin都改成一样的,那结果就对了。 这里先解释一下mysql collation的命名规则: 它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束 原来MySQL按照下面的方式选择表字符集和校对规则: 如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。 如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。 否则,采用服务器字符集和服务器校对规则。 下面总结一下一般的建表的sql语句吧: CREATE TABLE `product` ( `SITE` varchar(32) NOT NULL, `id` bigint(20) NOT NULL, `gmt_create` datetime NOT NULL DEFAULT '1999-09-09 00:00:00','创建时间' //时间的设置 `gmt_modified` datetime NOT NULL DEFAULT '1999-09-09 00:00:00','修改时间' `PROVINCE` varchar(128)CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,'省' //如果是字符则要这样设 PRIMARY KEY (`id`), //设置主键 KEY `idx_offer_mid_st_ge_gid_tp` (`member_id`,`STATUS`,`GMT_EXPIRE`,`group_id`,`TYPE`), //设置索引 KEY `idx_test` (`member_id`,`GMT_EXPIRE`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 原文链接: