我有一个mysql数据库,所有表都设置为utf8_bin。其上的表有两个字段再次设置为utf8_bin。我创建了一个存储过程:SELECT name,id FROM tools WHERE valid=1 AND source in (1,2,3) AND name LIKE CONCAT('%',inValue,'%') COLLATE utf8_unicode_ci LIMIT 100;
我使用查询搜索字段来获取所有可能的工具(例如," sc"返回螺丝刀,SCRewdriver,somethingscrew)。
该查询在窗口7下的wampserver安装中运行良好。我尝试在Ubuntu 12.04上导入数据库,并且存储过程不返回任何内容。
如果我在其中运行查询,我会得到结果。如果我在phpmyadmin上运行存储过程,我会得到一个奇怪的错误:
#1253 - COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'utf8mb4'
我无处设置utf8mb4。我也不明白为什么我不能在我在PHP上运行完美无缺的PHP代码上运行sql查询。
这是代码:
$q = "call getTools(?)";
$ing = "%$tll%";
try {
$statement = self::$_conn->prepare($q);
$statement->bindParam(1,$ing);
$statement->execute();
} catch (PDOException $e) {
echo $e->getMessage();
}
/* fetch values */
while ($row = $statement->fetch(PDO::FETCH_NUM)) {
//printf ("%s (%s)\n", $name, $idIng);
array_push($return,array('label'=>$row[0],'value'=>$row[0],'id'=>$row[1]));
}
return json_encode($return);
请注意,稍后添加了try / catch以了解它为什么不起作用。我强烈怀疑问题出在PDO或Ubuntu 12.04下的配置上。
在构造函数上我定义了utf8
$dsn = "mysql:dbname=$dbname;host=$server;charset=utf8";
关于如何解决这个问题的任何想法?
编辑:表格创建脚本
DROP TABLE IF EXISTS `tools`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tools` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`url` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`valid` int(11) NOT NULL DEFAULT '1' COMMENT '0= invalid 1=valid',
`source` int(11) NOT NULL COMMENT '1=wikibooks 2 hand 3 hand similar',
`parent` int(11) DEFAULT '0' COMMENT 'similar tool.',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6206 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='1=wikibooks 2 hand 3 hand sim';
/*!40101 SET character_set_client = @saved_cs_client */;
编辑:在PDO中添加了允许例外的行。 (DOH)
self::$_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
因此,我的php脚本出错:
SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'latin1'
表格不是latin1。