软件测试之编程乱码问题初步探索[2]

发表于:2009-10-12来源:作者:点击数: 标签:软件测试乱码探索
软件测试之编程乱码问题初步探索[2] 软件测试工具 关键字:sql 那么set names是什么呢? set names实际上就是同时设置了character_set_client,character_set_connection,character_set_results这三个系统变量。 例如set names 'gbk'等同于: set @@character

软件测试之编程乱码问题初步探索[2]   软件测试工具

关键字:sql 那么set names是什么呢? set names实际上就是同时设置了character_set_client,character_set_connection,character_set_results这三个系统变量。

  例如set names 'gbk'等同于:

set @@character_set_client = 'gbk'

set @@character_set_connection = 'gbk'

set @@character_set_results = 'gbk'

  很多情况下,这样设置了之后就能把乱码问题解决了。但是还是不能完全避免出现乱码的可能,为什么呢?

  因为character_set_client,character_set_connection这两个变量仅用与保证与character_set_database编码的一致,而character_set_results则用与保证SELECT返回的结果与程序的编码一致。

  例如,你的数据库(character_set_database)用的是utf8的字符集,那么你就要保证character_set_client,character_set_connection也是utf8的字符集。而你的程序也许采用的并不是utf8,比如你的程序用的是gbk,那么你若把character_set_results也设置为utf8的话就会出现乱码问题。此时你应该把character_set_results设置为gbk。这样就能保证数据库返回的结果与你的程序的编码一致。

  下面我给出一段用于设置字符集的代码(其中用到了一个我自己写的db库,相信应该不影响阅读):

<?

//假设我们的程序采用的是utf8的字符集

$program_char = 'utf8';

//先检查mysql的版本号,如果版本号大于4我们才可以设置这些系统变量(mysql4还没有这些系统变量)

$version = current($db->fetch_one('SELECT VERSION()'));

if (substr($version, 0, 1) > 4)

{

//取出当前数据库的字符集

$sql = 'SELECT @@character_set_database';

$char = current($db->fetch_one($sql));

//将客户端字符集(character_set_client)和

连接字符集(character_set_connection)设置为与数据库字符集(character_set_database)一致

$db->query('SET @@character_set_client = "' . $char . '"');

$db->query('SET @@character_set_connection = "' . $char . '"');

//将SELECT查询返回数据的字符集设置为与当前程序的字符集一致

$db->query('SET @@character_set_results = "' . $program_char . '"');

}

?>

 

原文转自:http://www.ltesting.net