转载于s135.com,原文地址:http://blog.s135.com/mysql_memcached_space/
MySQL 和 Memcached 对于同一个key,不能对应起来。最终原因是:PHP将key写入MySQL数据库之前,没有经过trim()过滤首尾空格(关键是尾部空格),结果:

1、MySQL的varchar、char类型字段,SELECT .... WHERE 查询时忽略字段的尾部空格。例如varchar类型字段uidcode中,存储的含有尾部空格的内容“rewinx ”,通过以下三种方式均可查询到:
在MySQL手册第“11.4.1. CHAR和VARCHAR类型”节中写道(http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#char):请注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。请注意所有MySQL版本均如此,并且它不受SQL服务器模式的影响。
2、PHP 的 Memcache 扩展,则在set、get时,自动将key中的空格,转换成了半角下划线“_”。当然,直接通过 Memcached 协议来读取,key值“rewinx ”就要写成“rewinx_”了。
示例:testmc.php
MySQL 和 Memcached 对于同一个key,不能对应起来。最终原因是:PHP将key写入MySQL数据库之前,没有经过trim()过滤首尾空格(关键是尾部空格),结果:

1、MySQL的varchar、char类型字段,SELECT .... WHERE 查询时忽略字段的尾部空格。例如varchar类型字段uidcode中,存储的含有尾部空格的内容“rewinx ”,通过以下三种方式均可查询到:
在MySQL手册第“11.4.1. CHAR和VARCHAR类型”节中写道(http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#char):请注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。请注意所有MySQL版本均如此,并且它不受SQL服务器模式的影响。
2、PHP 的 Memcache 扩展,则在set、get时,自动将key中的空格,转换成了半角下划线“_”。当然,直接通过 Memcached 协议来读取,key值“rewinx ”就要写成“rewinx_”了。
示例:testmc.php
<?php
$memcache_obj = new Memcache;
$memcache_obj->connect('192.168.8.34', 11211);
$memcache_obj->set('rewinx ', 'hello world');
echo $memcache_obj->get('rewinx ')."\r\n";
?>
$memcache_obj = new Memcache;
$memcache_obj->connect('192.168.8.34', 11211);
$memcache_obj->set('rewinx ', 'hello world');
echo $memcache_obj->get('rewinx ')."\r\n";
?>
备忘一下,一个装阿拉伯数字转中文数字的函数。
<?php
function getChineseNumber($money){
$ar = array("零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖") ;
$cName = array("", "", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟");
$conver = "";
$cLast = "" ;
$cZero = 0;
$i = 0;
for ($j = strlen($money) ; $j >=1 ; $j--){
$cNum = intval(substr($money, $i, 1));
$cunit = $cName[$j]; //取出位數
if ($cNum == 0) { //判斷取出的數字是否為0,如果是0,則記錄共有幾0
$cZero++;
if (strpos($cunit,"萬億") >0 && ($cLast == "")){ // '如果取出的是萬,億,則位數以萬億來補
$cLast = $cunit ;
}
}else {
if ($cZero > 0) {// '如果取出的數字0有n個,則以零代替所有的0
if (strpos("萬億", substr($conver, strlen($conver)-2)) >0) {
$conver .= $cLast; //'如果最後一位不是億,萬,則最後一位補上"億萬"
}
$conver .= "零" ;
$cZero = 0;
$cLast = "" ;
}
$conver = $conver.$ar[$cNum].$cunit; // '如果取出的數字沒有0,則是中文數字+單位
}
$i++;
}
//'判斷數字的最後一位是否為0,如果最後一位為0,則把萬億補上
if (strpos("萬億", substr($conver, strlen($conver)-2)) >0) {
$conver .=$cLast; // '如果最後一位不是億,萬,則最後一位補上"億萬"
}
return $conver;
}
echo getChineseNumber(1759439);//壹佰柒拾伍萬玖仟肆佰參拾玖
?>
<?php
function getChineseNumber($money){
$ar = array("零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖") ;
$cName = array("", "", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟");
$conver = "";
$cLast = "" ;
$cZero = 0;
$i = 0;
for ($j = strlen($money) ; $j >=1 ; $j--){
$cNum = intval(substr($money, $i, 1));
$cunit = $cName[$j]; //取出位數
if ($cNum == 0) { //判斷取出的數字是否為0,如果是0,則記錄共有幾0
$cZero++;
if (strpos($cunit,"萬億") >0 && ($cLast == "")){ // '如果取出的是萬,億,則位數以萬億來補
$cLast = $cunit ;
}
}else {
if ($cZero > 0) {// '如果取出的數字0有n個,則以零代替所有的0
if (strpos("萬億", substr($conver, strlen($conver)-2)) >0) {
$conver .= $cLast; //'如果最後一位不是億,萬,則最後一位補上"億萬"
}
$conver .= "零" ;
$cZero = 0;
$cLast = "" ;
}
$conver = $conver.$ar[$cNum].$cunit; // '如果取出的數字沒有0,則是中文數字+單位
}
$i++;
}
//'判斷數字的最後一位是否為0,如果最後一位為0,則把萬億補上
if (strpos("萬億", substr($conver, strlen($conver)-2)) >0) {
$conver .=$cLast; // '如果最後一位不是億,萬,則最後一位補上"億萬"
}
return $conver;
}
echo getChineseNumber(1759439);//壹佰柒拾伍萬玖仟肆佰參拾玖
?>




