手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 免费部署 N8N 的 Zeabur 注册 | 登陆
浏览模式: 标准 | 列表全部文章

Mysql的一些实用字符串函数

1、concat()函数
   1.1 MySQL的concat函数可以连接一个或者多个字符串,如
       mysql> select concat('10');
       +--------------+
       | concat('10') |
       +--------------+
       | 10           |
       +--------------+
       1 row in set (0.00 sec)

       mysql> select concat('11','22','33');
       +------------------------+
       | concat('11','22','33') |
       +------------------------+
       | 112233                 |
       +------------------------+
       1 row in set (0.00 sec)

       而Oracle的concat函数只能连接两个字符串
       SQL> select concat('11','22') from dual;

   1.2 MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL
       mysql> select concat('11','22',null);
       +------------------------+
       | concat('11','22',null) |
       +------------------------+
       | NULL                   |
       +------------------------+
       1 row in set (0.00 sec)

       而Oracle的concat函数连接的时候,只要有一个字符串不是NULL,就不会返回NULL
       SQL> select concat('11',NULL) from dual;

       CONCAT
       --
       11

2、concat_ws()函数, 表示concat with separator,即有分隔符的字符串连接
   如连接后以逗号分隔
       mysql> select concat_ws(',','11','22','33');
       +-------------------------------+
       | concat_ws(',','11','22','33') |
       +-------------------------------+
       | 11,22,33                      |
       +-------------------------------+
       1 row in set (0.00 sec)
  
   和concat不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL
       mysql> select concat_ws(',','11','22',NULL);
       +-------------------------------+
       | concat_ws(',','11','22',NULL) |
       +-------------------------------+
       | 11,22                         |
       +-------------------------------+
       1 row in set (0.00 sec)

3、group_concat()可用来行转列, Oracle没有这样的函数
   完整的语法如下
   group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
   如下例子
   mysql> select * from aa;
   +------+------+
   | id   | name |
   +------+------+
   |    1 | 10   |
   |    1 | 20   |
   |    1 | 20   |
   |    2 | 20   |
   |    3 | 200  |
   |    3 | 500  |
   +------+------+
   6 rows in set (0.00 sec)
  
   3.1 以id分组,把name字段的值打印在一行,逗号分隔(默认)
       mysql> select id,group_concat(name) from aa group by id;
       +------+--------------------+
       | id   | group_concat(name) |
       +------+--------------------+
       |    1 | 10,20,20           |
       |    2 | 20                 |
       |    3 | 200,500            |
       +------+--------------------+
       3 rows in set (0.00 sec)
  
   3.2 以id分组,把name字段的值打印在一行,分号分隔
       mysql> select id,group_concat(name separator ';') from aa group by id;
       +------+----------------------------------+
       | id   | group_concat(name separator ';') |
       +------+----------------------------------+
       |    1 | 10;20;20                         |
       |    2 | 20                               |
       |    3 | 200;500                          |
       +------+----------------------------------+
       3 rows in set (0.00 sec)

   3.3 以id分组,把去冗余的name字段的值打印在一行,逗号分隔
       mysql> select id,group_concat(distinct name) from aa group by id;
       +------+-----------------------------+
       | id   | group_concat(distinct name) |
       +------+-----------------------------+
       |    1 | 10,20                       |
       |    2 | 20                          |
       |    3 | 200,500                     |
       +------+-----------------------------+
       3 rows in set (0.00 sec)

   3.4 以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序
       mysql> select id,group_concat(name order by name desc) from aa group by id;
       +------+---------------------------------------+
       | id   | group_concat(name order by name desc) |
       +------+---------------------------------------+
       |    1 | 20,20,10                              |
       |    2 | 20                                    |
       |    3 | 500,200                               |
       +------+---------------------------------------+
       3 rows in set (0.00 sec)

4、repeat()函数,用来复制字符串,如下'ab'表示要复制的字符串,2表示复制的份数
   mysql> select repeat('ab',2);
   +----------------+
   | repeat('ab',2) |
   +----------------+
   | abab           |
   +----------------+
   1 row in set (0.00 sec)

   又如
   mysql> select repeat('a',2);
   +---------------+
   | repeat('a',2) |
   +---------------+
   | aa            |
   +---------------+
   1 row in set (0.00 sec)

Tags: mysql, database, 字符串

看到一篇误人子弟的PHP代码

原文地址:http://hi.baidu.com/hi_bai_du_com/blog/item/fd297b89b318a8b20e24444a.html

原文:

PHP代码
  1. <?  
  2. /* 
  3. # 
  4. # 数据表的结构 `images` 
  5. # 
  6.  
  7. CREATE TABLE images ( 
  8.     picid int(3) NOT NULL auto_increment, 
  9.     picdata longblob NOT NULL, 
  10.     pictext varchar(100) NOT NULL default '', 
  11.     PRIMARY KEY    (picid) 
  12. ) TYPE=MyISAM; 
  13.  
  14. */  
  15. if(trim($picfile[0])!=""){  
  16.   $link=@mysql_connect("localhost","root","root");  
  17.   //连接,用你的具体连接名替换root,具体连接密码替换root  
  18.   if($link==false) {  
  19.     echo "<script>alert('连接数据库时发生错误,请稍后再试!')</script>";  
  20.   }  
  21.   $res=mysql_select_db("kkk");  
  22.   if($res==false){  
  23.     echo "<script>alert('打开数据库时发生错误,请稍后再试!')</script>";  
  24.   }  
  25.   $tmpset=0;  
  26.   // 存放成功加入的图片数目  
  27.   for($i=0;$i<=3;$i++){  
  28.     // picfile[i]存放所提交的图片信息(文件路径)  
  29.     if(trim($picfile[$i])!=""){  
  30.      //读取数据  
  31.       $fp=fopen($picfile[$i],"r");  
  32.       $picdata=fread($fp,filesize($picfile[$i]));  
  33.       fclose($fp);  
  34.       //加上必要的标志符号  
  35.       $picdata=addslashes($picdata);  
  36.       //用具体的数据表名代替images  
  37.       //pictext[i]存放所提交的图片的文字说明  
  38.       $qu="insert into images(picdata,pictext) values('$picdata','$pictext[$i]')";  
  39.       $res=@mysql_query($qu,$link);  
  40.          if($res==false){  
  41.            echo "<script>alert('图片 ".$i." 提交失败!')</script>";  
  42.            continue;  
  43.         }  
  44.       $tmpset=$tmpset+1;  
  45.     }  
  46.   }  
  47.   echo "<script>alert('操作成功!实际入库图片数 ".$tmpset." 张')</script>";  
  48. }  
  49. ?>  
  50. <html>  
  51. <head>  
  52. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  53. <title>无标题文档</title>  
  54. </head>  
  55.   
  56. <body>  
  57. <form action="<? echo $PHP_SELF; ?>" method="post" enctype="multipart/form-data" name="form1">  
  58. <input type="file" name="picfile[]">文件说明<input type="text" name="pictext[]"><br/>  
  59. <input type="file" name="picfile[]">文件说明<input type="text" name="pictext[]"><br/>  
  60. <input type="file" name="picfile[]">文件说明<input type="text" name="pictext[]"><br/>  
  61. <input type="file" name="picfile[]">文件说明<input type="text" name="pictext[]"><br/>  
  62. <input type="submit" name="Submit" value="提交">  
  63. </form>  
  64. </body>  
  65. </html>  

 

 

显示存在mysql中的图片
  1. <?  
  2. /* 
  3. * 在外部用<img src="displayimg.php?picid=1">来调用数据库中的第一张图片 
  4. */  
  5.   
  6. $link=@mysql_connect("localhost","root","root");  
  7. mysql_select_db("kkk");  
  8. $qu="select picid,picdata from images where picid=$picid";  
  9. $res=@mysql_query($qu,$link);  
  10. $num=mysql_num_rows($res);  
  11.   if($num==0){  
  12.     print "<br/><br/><br/>";  
  13.     print "<p><b>没有这张图片!</b></p>";  
  14.     exit();  
  15.   }  
  16. $row=@mysql_fetch_row($res);  
  17. header("Content-type:image/");  
  18. echo $row[1];  
  19. ?>  

——END——
仔细看看吧。。。是怎么误人子弟的。唉。
1、上传没有上传(大哥,你这是读本地文件呐,如果是这样的话,那。。。要那个enctype有啥用?)
2、变量直接全局(。。。。。。。。)
3、二进制字段是可以直接echo输出的吗??不谈别的,刚才你都addslashes了,为什么输出的时候没有stripslashes??
4、header头。。。。
5、for循环,直接就是3了。。这个居然就写死了
6、$tmpset的加法。。。都用了for了,用这个有意义吗??直接用$i不就完了?(这个就不算他的问题,算是习惯吧)
7、BLOB字段的插入。。。直接插的吗???看这里
MySQL 5 中 blob 类型字段的插入

Tags: php, 上传, 误人子弟

技术不被商业接受,就没有价值

虽然我不喜欢李彦宏,但这句话,我还是挺接受的:技术不被商业接受,就没有价值。
这句话并非是我杜撰,而是来自炳叔的BLOG,人家这个炳叔比我这个膘叔厉害的多,最起码人家是领导,我还是民工。

贴上炳叔里面的图片:

大小: 55.22 K
尺寸: 234 x 300
浏览: 1651 次
点击打开新窗口浏览全图

Tags: 闲谈, 李彦宏, 技术, 价值

PHP 4官方支持结束

自2000年5月22日发布正式稳定版8年之后,8月8日标志着PHP 4生命的终结,官方不再提供支持,不会再有安全补丁发布。PHP 4.4.9是PHP 4.x的最后一个版本。管理员和开发者失去了最后一个不升级到新一代版本开发环境的理由。过去几年,PHP 5提供了多种升级的途径,它的最新版本是5.2.6。但PHP 4发布8年之后,仍然有相当多的系统将不会在未来迁移到PHP 5,其中有相当的一部分可能永远也不会升级到PHP 5。
 对于那些不升级到新版PHP的用户,PHP专家Stefan Esser将通过Suhosin项目继续为PHP 4.x系列提供第三方安全补丁。

Tags: php, 支持, 终结

[分享]mysql数据库索引查询优化的分享

问题描述:


我们要访问的表是一个非常大的表,四千万条记录,id是主键,program_id上建了索引。
执行一条SQL:

select * from program_access_log where program_id between 1 and 4000

这条SQL非常慢。
我们原以为处理记录太多的原因,所以加了id限制,一次只读五十万条记录

select * from program_access_log where id between 1 and 500000 and program_id between 1 and 4000

但是这条SQL仍然很慢,速度比上面一条几乎没有提升。
Mysql处理50万条记录的表,条件字段还建了索引,这条语句应该是瞬间完成的。


问题分析:


这张表大约容量30G,数据库服务器内存16G,无法一次载入。就是这个造成了问题。
这条SQL有两个条件,ID一到五十万和Program_id一到四千,因为program_id范围小得多,mysql选择它做为主要索引。
先通过索引文件找出了所有program_id在1到4000范围里所有的id,这个过程非常快。
接下来要通过这些id找出表里的记录,由于这些id是离散的,所以mysql对这个表的访问不是顺序读取。
而这个表又非常大,无法一次装入内存,所以每访问一条记录mysql都要重新在磁盘上定位并把附近的记录都载入内存,大量的IO操作导致了速度的下降。

问题解决方案:
1. 以program_id为条件对表进行分区
2. 分表处理,每张表的大小不超过内存的大小
然而,服务器用的是mysql5.0,不支持分区,而且这个表是公共表,无法在不影响其它项目的条件下修改表的结构。
所以我们采取了第三种办法:

select * from program_access_log where id between 1 and 500000 and program_id between 1 and 15000000

现在program_id的范围远大于id的范围,id被当做主要索引进行查找,由于id是主键,所以查找的是连续50万条记录,速度和访问一个50万条记录的表基本一样

总结:
这是一个在千万笔记录表中由于使用了索引导致了数据查找变慢的问题,有一定的典型性和大家交流下!

————END————

索引这个东西很害人的。好的时候很好。。。用的不好。那真的是害己害人啊。

本来来自:PHP5研究室,责编:抽烟的蚊子,网址:http://www.phpv.net/html/1624.html

Tags: mysql, database, 索引, 优化, 技巧