mysql General error: 1366 Incorrect string value: ‘\xF0\x9F\x91\x8D\xF0\x9F…’ for column ‘dianpumiaoshu’ at row 1 解决方法

mysql General error: 1366 Incorrect string value: ‘\xF0\x9F\x91\x8D\xF0\x9F…’ for column ‘dianpumiaoshu’ at row 1 解决方法

因为传入了emoji表情 曾经考虑过过滤 但是行不通 所以唯一的方法 就是urlencode后存入数据库 读取的时候再urldecode

linux mysql内存使用率

linux mysql内存使用率

free -m | sed -n '2p' | awk '{print "used mem is "$3"M,total mem is "$2"M,used percent is "$3/$2*100"%"}' 

关于 linux内存使用率为什么那么高看下面吧 总结下 实际的使用内存 其实没那么多

Linux开机后,使用top命令查看,4G物理内存发现已使用的多大3.2G,占用率高达80%以上:

Mem: 3889836k total, 3341868k used, 547968k free, 286044k buffers

Swap: 6127608k total, 0k used, 6127608k free, 1554888k cached

如上红色数字部分,使用free查看结果如下:

[root@rd01 ~]# free -m

total used free shared buffers cached

Mem: 3798 3264 534 0 279 1518

-/+ buffers/cache: 1466 2332

Swap: 5983 0 5983

红色数字部分已使用内存而已是3264M,那是不是表示系统内存就真的占用这么多呢,这可才运行了一个网站而已,不可能就被占用这么多啊!

注意看蓝底部分,这部分表示系统高速缓存所使用的内存,这部分内存可以随时分配给进程使用,因此,真正剩余内存应该free下534+2332=2866M,因此剩余物理内存应该为2866M,而不知534M。

因此查看目前进程正在实际被使用的内存,是used-(buffers+cache),也可以认为如果swap没有大量使用,mem还是够用的,只有mem被当前进程实际占用完(没有了buffers和cache),才会使用到swap的。

mysql批量更新写法

mysql批量更新写法

  $namedmp=filter($_POST['namedmp']);
          $namedsp=filter($_POST['namedsp']);
          $nameula=filter($_POST['nameula']);
          $namenva=filter($_POST['namenva']);
          $namedcrm=filter($_POST['namedcrm']);


          $sql='UPDATE wz_chanpinjieshao
    SET titile = CASE id 
        WHEN 1 THEN ?
        WHEN 2 THEN ?
        WHEN 3 THEN ?
        WHEN 4 THEN ?
        WHEN 5 THEN ?
    END
WHERE id IN (1,2,3,4,5)';
        $stmt = \Db::getStmt($sql);
        $isOk=$stmt->execute(array($namedmp,$namedsp,$nameula,$namenva,$namedcrm));
        if($isOk){
            echo json_encode(array('success' => 1, 'msg' => '更新成功', 'data' => ''));
            exit();
        }else{
            echo json_encode(array('success' => 1, 'msg' => '网络繁忙', 'data' => ''));
            exit();
        }

更新多个字段sql语句

UPDATE wz_chanpinjieshao 
  SET title = CASE id WHEN 1 THEN 11 WHEN 2 THEN 22 WHEN 3 THEN 33 WHEN 4 THEN 44 WHEN 5 THEN 55 END,
     summary = CASE id WHEN 1 THEN 11 WHEN 2 THEN 22 WHEN 3 THEN 33 WHEN 4 THEN 44 WHEN 5 THEN 55 END 
     WHERE id IN (1,2,3,4,5)

下面是封装版

 public function updatechanpinjieshao(){
        $nameupdate_ziduan_list=explode(',',$_POST['nameupdate_ziduan']);
        $namelist=array();
        $duogeziduan='';
        foreach ($nameupdate_ziduan_list as $k=>$v) {

            $namedmp = filter($_POST['namedmp_' . $v]);
            array_push($namelist,$namedmp);
            $namedsp = filter($_POST['namedsp_' . $v]);
            array_push($namelist,$namedsp);
            $nameula = filter($_POST['nameula_' . $v]);
            array_push($namelist,$nameula);
            $namenva = filter($_POST['namenva_' . $v]);
            array_push($namelist,$namenva);
            $namedcrm = filter($_POST['namedcrm_' . $v]);
            array_push($namelist,$namedcrm);

            $duogeziduan.= $v . ' = CASE id WHEN 1 THEN ? WHEN 2 THEN ? WHEN 3 THEN ?  WHEN 4 THEN ?  WHEN 5 THEN ? END,';
        }
            $duogeziduan=rtrim($duogeziduan,",");

             $sql = 'UPDATE wz_chanpinjieshao SET '.$duogeziduan.' WHERE id IN (1,2,3,4,5)';


            $stmt = \Db::getStmt($sql);

            $isOk = $stmt->execute($namelist);

        if($isOk){
            echo json_encode(array('success' => 1, 'msg' => '更新成功', 'data' => ''));
            exit();
        }else{
            echo json_encode(array('success' => 1, 'msg' => '网络繁忙', 'data' => ''));
            exit();
        }

    }

mysql查看正在运行的语句

mysql查看正在运行的语句 并且查看运行最多的mysql语句

MySQL 打开 general log 后,所有的查询语句都会记录在 general log 文件,文件为只读方式,但这样general log文件会非常大,所以默认是关闭的。
但有时需要查错等原因,暂时需要打开general log。
打开方法:

 select version();//我的是5.6是支持一个日志的开启。
     
     set global general_log=1;//开启查询日志
     
     set global log_output='TABLE';//general_log支持输出到table: 如果开启了table就会输出到数据库表中 不会输出到文件中
 
     select * from mysql.general_log\G;//查询所有sql语句的使用
      
     select * from (select argument, count(*) as number from mysql.general_log  group by argument)t 
     order by number DESC;//降序排列使用最多的sql语句,值是mysql 的基本功哈。

建议开了1分钟后可以关了 可以进行优化了 然后优化完了 可以清除表再开启测试

set global general_log = off; // 关闭查询日志
show global variables like '%general%';

mysql left join 右表数据不唯一的情况解决方法

mysql left join 右表数据不唯一的情况解决方法

member 表
id	username
1	fdipzone
2	terry



member_login_log 表
id	uid	logindate
1	1	2015-01-01
2	2	2015-01-01
3	1	2015-01-02
4	2	2015-01-02
5	2	2015-01-03

select a.id, a.username, b.logindate  
from member as a   
left join (select uid, max(logindate) as logindate from member_login_log group by uid) as b  
on a.id = b.uid; 

ps:使用left join的两个表,最好是1:1 或 1:0的关系,这样可以保证A表的记录全部显示,B表显示符合条件的记录。
如果B表符合条件的记录不唯一,就需要检查表设计是否合理了。

mysql互换表中两列数据

mysql互换表中两列数据

update product set original_price=price,price=original_price;

上面sql语句显然不可取
因为先执行original_price=price , original_price的值已经更新为price,
然后执行price=original_price,

正确如下

update product as a, product as b set a.original_price=b.price, a.price=b.original_price where a.id=b.id;

a和b个人觉得应该是2个临时表 最后一定要用where 不用where会出现不对应的情况