php中set names与mysql_set_charset

2010年4月13日 闫鹏 没有评论

今天看到大家在讨论,发现这是个很严重而又容易疏忽的问题,我以前也一直是用set names,遂记录下来,也提醒自己一把。

1.set names与mysql_set_charset有什么区别?

一般情况下, 使用”SET NAMES”就足够了, 也是可以保证正确的. 那么为什么手册又要说推荐使用 mysqli_set_charset(PHP>=5.0.5)呢。手册里面也没有明确说明。我们可以看下php扩展的源代码:

//php-5.2.11-SRC/ext/mysqli/mysqli_nonapi.c line 342
PHP_FUNCTION(mysqli_set_charset)
{
    MY_MYSQL            *mysql;
    zval                *mysql_link;
    char                *cs_name = NULL;
    unsigned int        len;
    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis()
                , "Os", &mysql_link, mysqli_link_class_entry, &cs_name, &len) == FAILURE) {
        return;
    }
    MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
    if (mysql_set_character_set(mysql->mysql, cs_name)) {
                //** 调用libmysql的对应函数
        RETURN_FALSE;
    }
    RETURN_TRUE;
}

可以看到php的mysql扩展是直接调用了mysql的mysql_set_character_set函数,接下来看看mysql的代码

//mysql-5.1.30-SRC/libmysql/client.c, line 3166:
int STDCALL mysql_set_character_set(MYSQL *mysql, const char *cs_name)
{
  struct charset_info_st *cs;
  const char *save_csdir= charsets_dir;
  if (mysql->options.charset_dir)
    charsets_dir= mysql->options.charset_dir;
  if (strlen(cs_name) < MY_CS_NAME_SIZE &&
     (cs= get_charset_by_csname(cs_name, MY_CS_PRIMARY, MYF(0))))
  {
    char buff[MY_CS_NAME_SIZE + 10];
    charsets_dir= save_csdir;
    /* Skip execution of "SET NAMES" for pre-4.1 servers */
    if (mysql_get_server_version(mysql) < 40100)       return 0;     sprintf(buff, "SET NAMES %s", cs_name);     if (!mysql_real_query(mysql, buff, strlen(buff)))     {       mysql->charset= cs;
    }
  }
  //以下省略

可以看到,除了调用real_query设置set names,还设置了mysql的charset变量。

2.这样有什么影响?

mysql_real_escape_string会受到影响,它与mysql_escape_string的区别就 是,  它会考虑”当前”字符集。如果仅仅使用set names,mysql_real_escape_string可能会失效。

例子:

$mysqli = new mysqli("localhost", "user", "pass", "test", 3306);

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$mysqli->query('SET NAMES gbk'); //使用set names设置字符集
$city = chr(0xbf).chr(0x5c); //0xbf5c是个有效的gbk字符,模拟用户输入
$city = $mysqli->real_escape_string ($city);//使用real_escape进行过滤

/* this query will fail, cause we didn't escape $city */
 if (!$mysqli->query("INSERT into myCity(name) VALUES ('$city')")) {
    print "INSERT into myCity (name) VALUES ('$city')\n";
    printf("Error: %s\n", $mysqli->error);
}

var_dump($city);

var_dump($mysqli->client_encoding());

$mysqli->close();

3.解决方案

mysqli_set_charset函数对PHP和Mysql有版本要求,必须当mysql版本大于5,PHP版本大于5.0.5时,此函数才有效。至于另一个mysql_set_charset函数,则更要求PHP版本大于5.2.3时才能有效。对于mysql4.1以上版本,使用”SET character_set_client=binary;”
推荐使用mysql_set_charset设置字符集的方案,只有在环境不允许的情况下,我们才推荐使用第二种binary编码的方案。但是无论在什么情况下,都禁止使用”SET NAMES”来作为设置字符集的操作。

分类: 程序员 标签: ,

庆祝pr达到4与增加标志便于观察

2010年4月6日 闫鹏 3 条评论

刚刚有朋友找我,加了个收费的链接,印象中,pr还是3的,可刚刚一查,已经达到4了,据磊磊同学说是亏了,惨,谁叫咱没经验呢

加上个pr观察的标志,来看看广告链接对pr值的影响。

最近事情比较多,更新blog明显不勤快了啊…

嗯,要加油

分类: 未分类 标签:

收到图海vip邀请/vip邀请发放

2010年4月1日 闫鹏 9 条评论

今天收到了图海的邀请,其实这个东东就是放上自己的图片,然后挂外链用的,成为图海 VIP,可以享受不受限的相册容量和图片外链。邀请发放了三个,现在手里还有两个,有需要的朋友请留言。

闫鹏 blog,你好:

我们注意到你的博客内容新颖、观点独特,希望与你成为朋友。
图海(http://www.tuhigh.com) 是国内优秀的相册空间和摄影图片社区。
图海可为你免费提供VIP, 亦可为你的朋友提供3枚VIP邀请码。
成为图海 VIP,可以享受不受限的相册容量和图片外链,

帮助传播你的作品,扩大你的影响。

mmjia’s Blog  http://mmjia.blogbus.com/logs/59003992.html
如 有意申请VIP及VIP邀请码, 请注册图海账号并告知我们昵称或邮件地址,期待你的答复!

PS:详细说明请参考:http://www.tuhigh.com/space/585/3961

分类: 互联网 标签:

目标与执行

2010年3月23日 闫鹏 1 条评论

释永信主持少林寺,开了很多家公司,面对媒体,他说过:“世人改变的是目标而不是做事的手段,少林寺改变做事的手段而不是目标”。的确,佛家的最主要目标就是普渡众生,而少林寺出名也是从十八棍僧救唐王开始的,棍僧救唐王,要不要杀人呢,他们杀人是为了避免社会产生动荡,拯救更多的人。在当今的商业社会,钱就是普渡众生的一个主要工具之一。

相比于释永信说的话,我们再想想自己:我们毕业的时候,是不是心中都充满了报复,认为自己一定要如何如何呢?经过一两年的工作,被现实磨砺之后,又有多少人还保持着自己的理想呢,是不是逐渐的也开始认为,有些事情自己也确实做不到,而后逐渐改变目标呢。是不是也出现过多次改变过目标呢。

作为最普通的人之一,我也有这样的问题,目标虽然没有改变过多次,但却是感觉有些模糊,开始有些怀疑自己,甚至有些怀疑目标是不是自己真正想要的了,在这里,先定个一年计划吧

1.解决那个坏习惯,养成主动沟通的好习惯

2.工作上的那个团队

3.锻炼身体

这一年里面,就先把这三件事做好吧,至于人生目标,要仔细考虑一下下。

目标定下来,就需要好好执行了,到时候不经意的忘记了,就跟没定差不多了。古人云:一日三省吾身,我就一周一省吧,贵在坚持,养成习惯就好了

分类: 生活 标签:

从中国到日本,从日本到美国,从美国到芬兰

2010年3月9日 闫鹏 4 条评论

中午chefeng回来了,bt我们三个人一起吃了顿饭。他刚刚从日本回来,下午就要回老家,大家就聊了聊近况。这哥们真是一个折腾的脾气啊,以前咋就没这么觉得呢

现在上海交大读书两年,然后觉得专业没前途,又跑来北邮读四年,随后毕业跑去日本,拿了日本国籍,觉得应该踏实下来了吧,他又要去美国了,4月就去,到那了还要先学一年英语…ft的是,打算在美国工作几年后再去芬兰….

生命在于折腾啊,这样确实是一个新鲜又不错的活法,跳出了我等传统中国思想“赚钱-生娃-赚钱”的禁锢。对我来说,这种活法,就是缺乏职业生涯的长远考虑,对这兄弟来说,就是活的逍遥自在,的确是不同的选择啊。

大家都往国外跑,大家都往国外跑…

要是能够举家迁移到米国,我也愿意去~~~

btw:中午聊起房子的问题

1.日本东京的一套精装修买家具即入住的私人财产两居房子(使用面积80~90平米,阳台赠送)大概合人民币300万

2.美国西雅图的一套不带游泳池的别墅大概是美元50万

3.中国北京北四环的一套建筑面积89平米,使用面积75平米的房子要人民币360万

4.日本和美国的房子是永久性产权,中国是70年产权

5.日本的人均收入与美国人均收入差不多,都是美元3万多。中国城镇居民人均可支配收入不到人民币3万,农村纯收入1万多

差距咋就这么大呢,咋就这么大呢?

分类: 生活, 经济 标签:

最好的模式与境界

2010年3月5日 闫鹏 没有评论

今天中午吃饭的时候,又聊起了悲剧人物王兴,这哥们的克隆技术非比寻常,饭否一事刚一终了,又克隆出了个美团网,真是愈挫愈勇啊。

王兴虽然说不放弃饭否,但个人觉得肯定是不能再搞了,趁着它被盾,叽歪,围脖之类的东东满天飞,也只能是搞个新东东了,到美团网上面去看了看,那里竟然是在团购一个什么饭,汉。

通过克隆国外刚刚兴起的服务模式,有以下几点好处:

1.不用自己天天绞尽脑汁瞎琢磨看人民群众需要啥喜欢啥

2.在国外已经被实践证明能行的,在中国多半也行

3.国外搞啥成功了,我们就搞啥,gfw可以使中国网名接触不到国外的优秀产品

最后大家总结,在天朝:

最好的商业模式是:官商模式

最顶级的赚钱模式是:不劳而获

btw:不劳而获可不是说王兴啊,对这个哥们还是比较赞赏的。不过我想,不劳而获也不能算是贬义词了吧,至少应该是中性词

分类: 互联网, 未分类 标签: