[已解决]求助,无法执行中文的like查询



$criteria=new CDbCriteria;


$criteria->condition="title like :title";


$criteria->params=array(':title'=>'%中国%');


$pages=new CPagination(Article::model()->count($criteria));


......


出错信息是:

Quote

CDbCommand 无法执行 SQL 语句: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'

如果title是英文字就没问题,如果是中文字就出错。

数据库编码是gbk,页面编码是utf8

请问是怎么回事呢?

试试 LIKE %:title% ?

Quote

试试 LIKE %:title% ?

不行

按照错误信息,这是编码的问题。如果你是全新构造的数据库,建议改成utf8编码的,这样可以免去很多麻烦。

Quote

按照错误信息,这是编码的问题。如果你是全新构造的数据库,建议改成utf8编码的,这样可以免去很多麻烦。

多谢强,不是全新的数据库,是以前的网站留下的数据库

不改变编码,有没有办法解决?

怎么可以将原来的gbk数据库转换为utf8?

应该是可能的。我以前也碰到过类似的情况,后来是数据库管理员不知道用什么办法把编码改成utf8的。你google看看。

新问题

现在已经把数据库转换为utf8

但是执行以上代码的时候,查询结果为0

程序日志如下:

Quote

程序日志 

时间 等级 类别 信息

1245424037.38 trace system.web.CModule Loading "log" application component

0.00495505332947 trace system.web.CModule Loading "request" application component

0.00274801254272 trace system.web.CModule Loading "urlManager" application component

0.0132639408112 trace system.web.filters.CFilterChain Running filter ArticleController.filteraccessControl()

0.001296043396 trace system.web.CModule Loading "user" application component

0.00201392173767 trace system.web.CModule Loading "session" application component

0.0191869735718 trace system.web.CModule Loading "db" application component

0.0095911026001 trace system.db.CDbConnection Opening DB connection

0.00917601585388 trace system.db.CDbCommand Querying SQL: SHOW COLUMNS FROM dede_archives

0.018434047699 trace system.db.CDbCommand Querying SQL: SHOW CREATE TABLE dede_archives

0.00930404663086 trace system.db.ar.CActiveRecord Article.count()

0.00572299957275 trace system.db.CDbCommand 

0.000513076782227 trace system.web.CModule Loading "errorHandler" application component

程序日志没有显示这条执行语句

请问我上面写的代码有错吗?

倒数第二条日志是什么啊?只看到CDbCommand

你的代码是对的。

另外,你能分享一下你是如何转换数据库编码的么?

还是中文的问题

			$criteria->condition="title = :title";


			$criteria->params=array(':title'=>'中国');


			$pages=new CPagination(Article::model()->count($criteria));

已经转换为utf8,只要查询语句中含有中文就出错,不知怎么回事

现在错误信息是什么?

Quote

现在错误信息是什么?

现在错误信息如6楼所示

你只给了日志,没有错误信息啊

Quote

你只给了日志,没有错误信息啊

多谢强的耐心回复。

我详细说一下:

设置:

		'log'=>array(


			'class'=>'CLogRouter',


			'routes'=>array(


				array(


					'class'=>'CFileLogRoute',


					'levels'=>'error, warning',


				),


				array(


                    'class'=>'CWebLogRoute',


                    'levels'=>'trace',


                ),


			),


		),

控制器代码:

	public function actionList()


	{		


		$criteria=new CDbCriteria;


		$criteria->condition="title = :title";


		$criteria->params=array(':title'=>'教育规划纲要获4千余建议');


		$pages=new CPagination(Article::model()->count($criteria));


		$articleList=Article::model()->with('Categories')->findAll($criteria);


}

程序日志如图所示,protected\runtime文件夹里没有错误日志生成。

数据库中有  title=教育规划纲要获4千余建议 这条记录

Quote

另外,你能分享一下你是如何转换数据库编码的么?

我上网找了很多命令行的转换方法,都不行

我现在成功使用的方法是:

一、到http://www.phome.net/ebak2008os/ 下载原版的帝国备份王

二、用我发的附件中的function.php代替帝国备份王原来的function.php

三、用帝国备份王备份数据库

四、新建立一个UTF8的数据库

CREATE DATABASE `数据库名` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

五、用帝国备份王备份恢复数据到新的数据库

注意:千万别用修改后的帝国备份王备份其他数据库,因为它会默认更改你的编码

找到原因了,ArticleController.php要保存为utf8编码,yiic tool生成的默认是ansi编码。

奇怪 我的缺省生成是utf-8,不知道你在哪里设置不一样。

如果文件只包含ascii字符,utf8和ansi是一样的。关键在于你的编辑器缺省用的是什么编码。

我前两天也在问强哥,有没有办法让yii工具生成的代码默认就是UTf8编码。