2021年8月

整页翻页 ctrl-f ctrl-b
f就是forword b就是backward

翻半页
ctrl-d ctlr-u
d=down u=up

滚一行
ctrl-e ctrl-y

zz 让光标所在的行居屏幕中央
zt 让光标所在的行居屏幕最上一行 t=top
zb 让光标所在的行居屏幕最下一行 b=bottom

以上是为你整理的vim命令下一页

MySQL从5.7版本开始就支持JSON格式的数据,操作用起来挺方便的。

建表

在新建表时字段类型可以直接设置为json类型,比如我们创建一张表:

CREATE TABLE test_user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR ( 50 ) NOT NULL,
info JSON
);
json类型字段可以为NULL

插入数据

INSERT INTO test_user(name, info) VALUES('xiaoming','{"sex": 1, "age": 18, "nick_name": "小萌"}');

json类型的字段必须时一个有效的json字符串

可以使用JSON_OBJECT()函数构造json对象:

INSERT INTO test_user(name, info) VALUES('xiaohua', JSON_OBJECT("sex", 0, "age", 17));

使用JSON_ARRAY()函数构造json数组

INSERT INTO test_user(name, info) VALUES('xiaozhang', JSON_OBJECT("sex", 1, "age", 19, "tag", JSON_ARRAY(3,5,90)));

查询test_user所有的数据

select * from test_user;

查询

表达式: 对象为json列->'$.键', 数组为json列->'$.键[index]'

select name, info->'$.nick_name', info->'$.sex', info->'$.tag[0]' from test_user;

等价于:对象为JSON_EXTRACT(json列 , '$.键') ,数组为JSON_EXTRACT(json列 , '$.键[index]')

select name, JSON_EXTRACT(info, '$.nick_name'), JSON_EXTRACT(info, '$.sex'), JSON_EXTRACT(info, '$.tag[0]') from test_user;

不过看到上面"小萌"是带双引号的,这不是我们想要的,可以用JSON_UNQUOTE函数将双引号去掉

select name, JSON_UNQUOTE(info->'$.nick_name') from test_user where name='xiaoming';

也可以直接使用操作符->>

select name, info->>'$.nick_name' from test_user where name='xiaoming';

当然属性也可以作为查询条件

select name, info->>'$.nick_name' from test_user where info->'$.nick_name'='小萌';

SELECT LoanNo FROM wbhj_loan lo WHERE lo.contractInfo ->> '$.contractNo'= '11' AND lo.loanResult=1

值得一提的是,可以通过虚拟列对JSON类型的指定属性进行快速查询。

创建虚拟列:

ALTER TABLE test_user ADD nick_name VARCHAR(50) GENERATED ALWAYS AS (info->>'$.nick_name') VIRTUAL;

注意用操作符->>

使用时和普通类型的列查询是一样:

select name,nick_name from test_user where nick_name='小萌';

更新

使用JSON_INSERT()插入新值,但不会覆盖已经存在的值

UPDATE test_user SET info = JSON_INSERT(info, '$.sex', 1, '$.nick_name', '小花') where id=2;

使用JSON_SET()插入新值,并覆盖已经存在的值

UPDATE test_user SET info = JSON_INSERT(info, '$.sex', 0, '$.nick_name', '小张') where id=3;

使用JSON_REPLACE()只替换存在的值

UPDATE test_user SET info = JSON_REPLACE(info, '$.sex', 1, '$.tag', '[1,2,3]') where id=2;

可以看到tag没有更新进去

jsonArray格式查询

SELECT
json_extract(a.summaryDesc,('$[0].sellerInfoSection[1].houseNo'))
FROM
channel_summary a

压缩:

tar -zcvf 压缩后文件名.tar.gz 被压缩文件

解压:

tar -zxvf 被解压文件

注意:不要有多余的空格,一个空格即可。

具体的可以在linux环境下 用 tar --help 查看详细说明
格式:tar [option] file

       -c  create  create a new archive
       -x  extract extract files from an archive
       -t  list       list the contents of an archive
        其中c/x/t不能同时存在
       -z   --gzip, --gunzip, --ungzip   filter the archive through gzip
       -j,  --bzip2                filter the archive through bzip2
       -f,  --file=ARCHIVE         use archive file or device ARCHIVE
       -v,  --verbose              verbosely list files processed

-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
--exclude FILE:在压缩的过程中,不要将 FILE 打包!

范例:

tar -cvf /tmp/etc.tar *.jpg 将所有jpg文件打包

范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩

特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。

如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~

如果加 j 参数,则以 .tar.bz2 来作为附档名啊~

上述指令在执行的时候,会显示一个警告讯息:

『tar: Removing leading `/" from member names』那是关于绝对路径的特殊设定。

范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz

使用了 gzip 压缩,所以要查阅该 tar file 内的文件时,

就要加上 z 这个参数

范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz

在预设的情况下,可以将压缩档在任何地方解开

先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,

则解开的目录会在 /usr/local/src/etc !另外,如果进入 /usr/local/src/etc

则会发现,该目录下的文件属性与 /etc/ 可能会有所不同!

范例四:在 /tmp 底下,只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd

可以用 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个文件,

就可以通过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了!

范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限!
[root@linux ~]# tar -zxvpf /tmp/etc.tar.gz /etc

这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时!

范例六:在 /home 当中,比 2005/06/01 新的文件才备份
[root@linux ~]# tar -N "2005/06/01" -zcvf home.tar.gz /home

范例七:要备份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -cvf - /etc | tar -xvf -

这个动作有点像是 cp -r /etc /tmp 依旧是有其有用途的!

要注意的地方 输出档变成 - 而输入档也变成 - ,又有一个 | 存在~

这分别代表 standard output, standard input 与管线命令!

tar -zcvf xxxx.tar.gz --exclude=./info --exclude=./tag --exclude=./special ./*

class ascii {
  /**
   * 将ascii码转为字符串
   * @param type $str 要解码的字符串
   * @param type $prefix 前缀,默认:&#
   * @return type
   */
  function decode($str, $prefix="&#") {
    $str = str_replace($prefix, "", $str);
    $a = explode(";", $str);
    foreach ($a as $dec) {
      if ($dec < 128) {
        $utf .= chr($dec);
      } else if ($dec < 2048) {
        $utf .= chr(192 + (($dec - ($dec % 64)) / 64));
        $utf .= chr(128 + ($dec % 64));
      } else {
        $utf .= chr(224 + (($dec - ($dec % 4096)) / 4096));
        $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
        $utf .= chr(128 + ($dec % 64));
      }
    }
    return $utf;
  }
  /**
   * 将字符串转换为ascii码
   * @param type $c 要编码的字符串
   * @param type $prefix 前缀,默认:&#
   * @return string
   */
  function encode($c, $prefix="&#") {
    $len = strlen($c);
    $a = 0;
    while ($a < $len) {
      $ud = 0;
      if (ord($c{$a}) >= 0 && ord($c{$a}) <= 127) {
        $ud = ord($c{$a});
        $a += 1;
      } else if (ord($c{$a}) >= 192 && ord($c{$a}) <= 223) {
        $ud = (ord($c{$a}) - 192) * 64 + (ord($c{$a + 1}) - 128);
        $a += 2;
      } else if (ord($c{$a}) >= 224 && ord($c{$a}) <= 239) {
        $ud = (ord($c{$a}) - 224) * 4096 + (ord($c{$a + 1}) - 128) * 64 + (ord($c{$a + 2}) - 128);
        $a += 3;
      } else if (ord($c{$a}) >= 240 && ord($c{$a}) <= 247) {
        $ud = (ord($c{$a}) - 240) * 262144 + (ord($c{$a + 1}) - 128) * 4096 + (ord($c{$a + 2}) - 128) * 64 + (ord($c{$a + 3}) - 128);
        $a += 4;
      } else if (ord($c{$a}) >= 248 && ord($c{$a}) <= 251) {
        $ud = (ord($c{$a}) - 248) * 16777216 + (ord($c{$a + 1}) - 128) * 262144 + (ord($c{$a + 2}) - 128) * 4096 + (ord($c{$a + 3}) - 128) * 64 + (ord($c{$a + 4}) - 128);
        $a += 5;
      } else if (ord($c{$a}) >= 252 && ord($c{$a}) <= 253) {
        $ud = (ord($c{$a}) - 252) * 1073741824 + (ord($c{$a + 1}) - 128) * 16777216 + (ord($c{$a + 2}) - 128) * 262144 + (ord($c{$a + 3}) - 128) * 4096 + (ord($c{$a + 4}) - 128) * 64 + (ord($c{$a + 5}) - 128);
        $a += 6;
      } else if (ord($c{$a}) >= 254 && ord($c{$a}) <= 255) { //error
        $ud = false;
      }
      $scill .= $prefix.$ud.";";
    }
    return $scill;
  }
}

$aa = new ascii;
echo "<xmp>";
echo $str = $aa->encode("我的博客");
echo "</xmp>";
echo $aa->decode($str);

帝国CMS是常用的开源建站系统之一,其提供的专题功能可以帮助站长更好的分类文章,做好站内优化。那么如何在网站内容页面调用文章所属专题名称和链接呢?
使用帝国提供的loop标签结构数据库查询命令可以实现这种调用要求。代码如下:

[e:loop={"select ztid from {$dbtbpre}enewsztinfo where classid='$navinfor[classid]' and id='$navinfor[id]'",10,24,0}]
<a href="[!--news.url--]<?=$class_zr[$bqr[ztid]][ztpath]?>" target="_blank"><?=$class_zr[$bqr[ztid]][ztname]?></a>
[/e:loop]

其中,<?=$class_zr[$bqr[ztid]][ztpath]?>调用的专题链接,<?=$class_zr[$bqr[ztid]][ztname]?>调用的是专题名称。
如果大家想要在内容页调用文章当前栏目所包含的专题名称和链接,可以使用如下的代码:

[e:loop={"select * from {$dbtbpre}enewszt where classid=$GLOBALS[navclassid]",10,24,0}]
<a href="/<?=$bqr[ztpath]?>" target="_blank"><?=$bqr[ztname]?></a>
[/e:loop]

在内容页调用专题名称和链接,可以增加到专题页面的路径,增加专题的爬取概率,大概可以根据自身需求进行调用。