<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[转载:php中的unsigned long类型]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Wed, 27 Mar 2013 13:29:59 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/>最近遇到一个问题:<br/>在mysql的表中有一个bigint(20) unsigned 的字段 F_flag.这个bigint相当于一个unsigned long.这个字段的每个二进制位是否为1代表一定意义.简单的说把这个字段当一个64位的bitmap来用.现在需要更新表中一条记录的这个字段.使64,22,1位变位1.view sourceprint?<br/><textarea name="code" class="php" rows="15" cols="100">
$flag = pow(2, 63)+pow(2, 21)+1; 
$sql&nbsp;&nbsp;= &#039;update t_table set F_flag =&#039;. $flag. &#039;where F_id=123&#039;;
</textarea><br/><br/><br/>但是你会发现执行完这条语句后,数据库中的记录并没有更新成你所想要的值.<br/>为什么?<br/>首先我们来看看php中的变量到底是怎么样的:view sourceprint?<br/><textarea name="code" class="php" rows="15" cols="100">

typedef union _zvalue_value &#123; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long lval;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* long value */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double dval;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* double value */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct &#123; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *val; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int len; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; str; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HashTable *ht;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* hash table value */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zend_object_value obj; 
&#125; zvalue_value;
</textarea><br/><br/>php中的变量都是一个这样的union数据结构.相当于所有的整形都是用long表示的.而当这个数超出long的范围.它会自动的转换成double去表示.因此前面的$flag已经是一个double了.这样就会存在精度问题.最后导致数据库的更新不正确.<br/>改进后的做法.view sourceprint?<br/><textarea name="code" class="php" rows="15" cols="100">
$flag = (1 &lt;&lt; 63 ) &amp; (1 &lt;&lt; 21) &amp; 1; 
$flag = sprintf(&quot;%u&quot;, $flag); 
$sql&nbsp;&nbsp;= &#039;update t_table set F_flag =&#039;. $flag. &#039;where F_id=123&#039;;
</textarea><br/><br/>这样就不会出现问题.因为php中的&lt;&lt;不会引起转换,而只是简单的二进制操作.sprintf也只是简单的对c语言中vsprintf的一个简单包装.返回的字符串符合我们的要求.<br/>来自：http://bbs.phpchina.com/thread-185419-1-1.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 转载:php中的unsigned long类型]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>