闲暇时光 🌑
闲暇时光
我の闲暇时光 time flies
静谧时光,执笔抒心,岁月痕迹甚好。
109
21
58



PHP提取富文本中的纯文字

2021-05-08 09:33:10 - 2025-07-05 00:53:03
無慕 - 701 - 10秒 - 1.38K
/**
 * 提取富文本中的纯文字
 * @param $string 富文本内容
 * @return string
 */
function StringExtractionText($string)
{
    // 把一些预定义的 HTML 实体转换为字符
    // 预定义字符是指:,&等有特殊含义(,用于链接签,&用于转义),不能直接使用
    $html_string = htmlspecialchars_decode($string);
    // 将空格去除
    $content = str_replace(" ", "", $html_string);
    // 去除字符串中的 HTML 标签
    $contents = strip_tags($content);

    return $contents;
}

编程 - 后端
PHP方法 PHP

PHP判断当前是否是微信浏览器

2021-05-08 09:32:50 - 2025-07-05 00:53:03
無慕 - 388 - 7秒 - 1.38K
/**
 * 判断当前是否是微信浏览器
 * 一般放在common中
 * 返回1是,0否
 */
function isWeixin()
{
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
        return 1;
    }
    return 0;
}

编程 - 后端
PHP方法 PHP

PHP输入天数的时间戳,返回该时间戳的发布时间在多久之前

2021-05-08 09:32:26 - 2025-07-05 00:53:03
無慕 - 515 - 6秒 - 1.30K
/**
 * 输入天数的时间戳,返回该时间戳的发布时间在多久之前
 * @param  int $time  时间戳
 * @return string       返回的时间
 */
function formatTime($time)
{
    $way = time() - $time;
    $r = '';
    if($way < 60)
    {
        $r = '刚刚';
    }else if($way >= 60 && $way =3600 && $way =86400 && $way =2592000 && $way <15552000)
    {
        $r = floor($way/2592000).'个月前';
    }else
    {
        $r = date("Y-m-d H:i:s",$time);
    }
    return $r;
}

编程 - 后端
PHP方法 PHP

PHP无限级分类数据处理(数据库数据)

2021-05-08 09:32:01 - 2025-07-05 00:53:03
無慕 - 1.54K - 3秒 - 1.13K
/**
 * 无限级分类数据处理(数据库数据)
 * @param $data         数据库查询数据
 * @param string $id 主键
 * @param string $pid 上级
 * @param string $child 子级名
 * @param int $max_pid 最高级pid
 * @return array|mixed  返回处理好的数组
 */
function disposeInfiniteData($data, $id = 'id', $pid = 'pid', $child = "child", $max_pid = 0)
{
    $newData = [];
    //数据库中信息预处理
    foreach ($data as $v) {
        $newData[$v[$id]] = $v;
    }
    $return_arr = [];
    foreach ($newData as $k => $v) {
        if ($v['pid'] == $max_pid) {
            $return_arr[] =& $newData[$k];
        } else {
            $newData[$v[$pid]][$child][] =& $newData[$k];
        }
    }
    return $return_arr;
}

编程 - 后端
PHP方法 PHP

MySQL中ALL、ANY、SOME用法

2021-05-06 16:18:36 - 2025-07-05 00:53:03
無慕 - 391 - 4.53分钟 - 1.62K

ALL父查询中的每个结果大于子查询结果集中的每一个值,则为真。

//查询表table_name1中age字段大于table_name2所有的age的数据
select * from table_name1 where age(select age from table_name2)

ANY父查询中的每个结果大于子查询结果集中的任意一个值,则为真。

//查询表table_name1中age字段大于table_name2中任意一个age的值
select * from table_name1 where age(select age from table_name2)

SOME作用大致与ANY相同,日常使用中看做一致即可。

编程 - 数据库
MySQL 笔记

MySQL中EXISTS用法

2021-05-06 10:28:24 - 2025-07-05 00:53:03
無慕 - 1.09K - 3秒 - 1.61K

SQL优化时我们提到,很多时候用 exists 代替 in 是一个好的选择,这里明确说一下exists的用法和作用。

语法:

SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);

意义:

  • EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。

注意:

  • EXISTS子句中不允许有COMPUTE子句和INTO关键字

  • EXISTS中column_name实际上是不影响查询结果的,所以为了更快地检索,建议只写一个主键字段,另外EXISTS中where子句要和外面的表有逻辑关系,否则要不查询所有数据,要不一行数据都不出现。

用法:

1620264242(1).jpg

  • 在子查询中使用NULL仍然返回结果集

select * from TableIn where exists(select null)
select * from TableIn//与上方效果相同
  • 比较使用EXISTS和IN的查询的使用,返回结果相同

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx比较使用EXISTS和)
  • 比较使用 EXISTS 和 ANY 的查询。注意两个查询返回相同的结果。

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME=ANY(select BNAME from TableEx)

编程 - 数据库
笔记 MySQL

MySQL的UNION操作符说明

2021-04-29 16:15:38 - 2025-07-05 00:53:03
無慕 - 690 - 0秒 - 1.72K

作用:

mysql union操作符用于连接两个以上的select语句的结果组合到一个结果集合中。

语法:

SELECT column_name1, column_name2, ... column_namen
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT column_name1, column_name2, ... column_namen
FROM tables
[WHERE conditions];

注意:

  • 使用时select查询的column_name字段数量和内容要一致

  • DISTINCT: 默认值,可不写,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。

  • ALL:可选,返回所有结果集,包含重复数据。

SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称;
SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;

编程 - 数据库
MySQL 笔记

MySQL全文本搜索

2021-04-29 11:10:55 - 2025-07-05 00:53:03
無慕 - 3.45K - 0秒 - 1.58K

前提条件

  • MySQL版本必须大于5.7.6,小于这个版本只支持英文全文索引,不支持中文,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。

  • 前置条件需要用到FULLTEXT索引,所以数据表引擎必须使用MyISAM,建立全文检索的字段类型必须是char,varchar,text。

  • 对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE   (或 CREATE INDEX) 创建索引,这将是非常快的。而将数据装载到一个已经有 FULLTEXT 索引的表中,是非常慢的。

  • MySQL 中使用全局变量ngram_token_size来配置ngram中n的大小,它的取值范围是1到10,默认值是2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2。

  • 索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词(如果需要,这个数目可以更改)。

  • 许多词出现的频率很高,搜索它们没有用处(返回太多的结果)。因此,MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不用于IN BOOLEAN MODE。

  • 如果表中的行数少于3行,则全文本搜索不返回结果(因为每个词或者不出现,或者至少出现在50%的行中)。

  • 忽略词中的单引号。例如,don't索引为dont。

  • 不具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文本搜索结果。

全文本搜索

进行全文本搜索

SELECT note_text 
FROM table_name
WHERE Match(note_text) Against('search_text')
  • Match()指定被搜索的列,Against()指定要使用的搜索表达式。

  • 使用完整的 Match() 说明传递给 Match() 的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们(而且次序正确)。

  • 搜索不区分大小写 除非使用BINARY方式,否则全文本搜索不区分大小写。

进行全文本搜索后匹配等级

select note_text,match(note_text) AGAINST('search_text')AS rank 
FROM table_name;
  • Match()和Against()用来建立一个计算列(别名为rank),此列包含全文本搜索计算出的等级值。等级由MySQL根据行中词的数目、唯一词的数目、整个索引中词的总数以及包含该词的行的数目计算出来。不包含词search_text的行等级为0(因此不被前一例子中WHERE子句选择)。确实包含词search_text的每行都有一个等级值,文本中词靠前的行的等级值比词靠后的行的等级值高。

  • 排序多个搜索项,如果指定多个搜索项,则包含多数匹配词的那些行将具有比包含较少词(或仅有一个匹配)的那些行高的等级值。

进行全文本搜索使用查询扩展

SELECT note_text 
FROM table_name
Match(note_text) Against('search_text' WITH QUERY EXPANSION);

例如:

SELECT note_text FROM productnotes Match(note_text) Against('anvils' WITH QUERY EXPANSION);

结果:

Multiple customer returns,anvils failing to drop fast enough orfal7ing backwards on purchaser. Recommend that customer considersusing heavier anvils.
Customer complaint: Sticks not individually wrapped,too easy tomistakenly detonate all at once. Recommend individua7 wrapping.Customer complaint: Not heavy enough to generate flying starsaround headof victim. If being purchased for dropping,recommendANVO2 or ANVO3 instead.
Please note that no returns wil7 be accepted if safe opened usingexplosives .
Customer complaint: rabbit has been able to detect trap,foodapparently less effective now .
Customer complaint: Circular hole in safe floor can apparently beeasily cut with handsaw.
Matches not included,recommend purchase of matches or detonator(item DTNTR).
  • 这次返回了7行。第一行包含词anvils,因此等级最高。第二行与anvils无关,但因为它包含第一行中的两个词(customer和recommend),所以也被检索出来。第3行也包含这两个相同的词,但它们在文本中的位置更靠后且分开得更远,因此也包含这一行,但等级为第三。第三行确实也没有涉及anvils(按它们的产品名)。

  • 正如所见,查询扩展极大地增加了返回的行数,但这样做也增加了你实际上并不想要的行的数目。

布尔文本搜索

SELECT note_text 
FROM table_name
WHERE Match(note_text) Against('表达式' IN BOOLEAN MODE)

例如:匹配note_text中带有shx的,且不包含big的。

SELECT note_text 
FROM table_name
WHERE Match(note_text) Against('+shx -big' IN BOOLEAN MODE)

全文本布尔操作符

布 尔 操 作 符

说 明

+

包含,词必须存在

-

排除,词必须不出现

>

包含,而且增加等级值

<

包含,且减少等级值

()

把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等)

~

取消一个词的排序值

*

词尾的通配符

""

定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)

编程 - 数据库
MySQL 笔记

MySQL索引说明

2021-04-28 11:09:01 - 2025-07-05 00:53:03
無慕 - 2.12K - 8秒 - 1.50K

索引说明

  • MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

  • 拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

  • 索引分单列索引和组合索引:

    单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。

    组合索引,即一个索引包含多个列。

  • 创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

  • 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

  • 上面都在说使用索引的好处,但过多的使用索引将会造成滥用。

    因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

  • 建立索引会占用磁盘空间的索引文件。

索引类型

INDEX(普通索引)

普通索引是mysql中最基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度。

普通索引允许在定义索引的列中插入重复值和空值

创建普通索引时,通常使用的关键字是index或key

SQL语句添加方式:

CREATE INDEX indexName ON table_name (column_name)//新建
ALTER table tableName ADD INDEX indexName(columnName)//修改表结构添加普通索引

UNIQUE(唯一索引)

唯一索引与普通索引类似,不同的是创建唯一性索引的目的不是为了提高访问速度,而是为了避免数据出现重复。

唯一索引列的值必须唯一,允许有空值。

如果是组合索引,则列值的组合必须唯一。

创建唯一索引通常使用 unique 关键字。

SQL语句添加方式:

CREATE UNIQUE INDEX indexName ON table_name (column_name(length)) //新建
ALTER table mytable ADD UNIQUE [indexName] (column_name(length))//修改表结构添加唯一索引

FULLTEXT(全文索引)

全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。

在 MySQL 中只有 MyISAM 存储引擎支持全文索引

全文索引允许在索引列中插入重复值和空值。

不过对于大容量的数据表,生成全文索引非常消耗时间和硬盘空间。

创建全文索引使用 FULLTEXT 关键字。

CREATE FULLTEXT INDEX index_name ON table_name(column_name);

SPATIAL(空间索引)

空间索引是对空间数据类型的字段建立的索引,使用 SPATIAL 关键字进行扩展。

创建空间索引的列必须将其声明为 NOT NULL,空间索引只能在存储引擎为 MyISAM 的表中创建。

空间索引主要用于地理空间数据类型 GEOMETRY。对于初学者来说,这类索引很少会用到。

SQL语句添加方式:

CREATE SPATIAL INDEX index_name ON table_name(column_name);

PRIMARY KEY(主键索引)

顾名思义,主键索引就是专门为主键字段创建的索引,也属于索引的一种。

主键索引是一种特殊的唯一索引,不允许值重复或者值为空。

创建主键索引通常使用 PRIMARY KEY 关键字。不能使用 CREATE INDEX 语句创建主键索引。

索引实际使用区分

索引在逻辑上分为以上 5 类,但在实际使用中,索引通常被创建成单列索引和组合索引。

单列索引

单列索引就是索引只包含原表的一个列。在表中的单个字段上创建索引,单列索引只根据该字段进行索引。

单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。

只要保证该索引只对应一个字段即可。

多列索引

组合索引也称为复合索引或多列索引。

相对于单列索引来说,组合索引是将原表的多个列共同组成一个索引。多列索引是在表的多个字段上创建一个索引。

该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。

但是,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。

例如:在表中的 id、name 和 sex 字段上建立一个多列索引,那么,只有查询条件使用了 id 字段时,该索引才会被使用。

提示

一个表可以有多个单列索引,但这些索引不是组合索引。

一个组合索引实质上为表的查询提供了多个索引,以此来加快查询速度。

比如:在一个表中创建了一个组合索引(c1,c2,c3),在实际查询中,系统用来实际加速的索引有三个:单个索引(c1)、双列索引(c1,c2)和多列索引(c1,c2,c3)。

编程 - 数据库
笔记 MySQL

MySQL中concat、concat_ws、group_concat的使用

2021-04-28 09:46:17 - 2025-07-05 00:53:03
無慕 - 1.59K - 6秒 - 1.78K

concat()函数

 作用:

函数用于将多个字符串连接成一个字符串。

返回值:

返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
SELECT CONCAT('My', NULL, 'QL');//只要有一个为null,则输出null
NULL
SELECT CONCAT(14.3);
'14.3'

concat_ws()函数

 作用:

函数用于将多个字符串连接成一个字符串。

返回值:

返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

参数说明:

第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。

SELECT CONCAT_WS(',','First name','Second name','Last Name');
'First name,Second name,Last Name'
SELECT CONCAT_WS(',','First name',NULL,'Last Name');//null会直接忽略
'First name,Last Name'
SELECT CONCAT_WS(',','First name','','Last Name');//空是可以正常连接的
'First name,,Last Name'

group_concat()函数

语法说明

group_concat函数的作用是将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

(1) 基本语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc  ] [separator '分隔符'] );

(2) 说明:可以使用distinct排除重复值;可以使用order by子句对结果中的值进行排序。

(3) 返回的字符串的默认分隔符从逗号(,),若要改为其他分隔符,则使用SEPARATOR子句修改分隔符。

举例

select user_id,GROUP_CONCAT(`like_name` order by `create_time` desc SEPARATOR ',' )
FROM user_table  
WHERE user_id > 10 GROUP BY user_id

上方SQL对应的情况举例:

假设表结构为id(主键)、user_id(用户id)、like_name(爱好)、create_time(创建时间),想一次性查询出每个人的所有爱好(每条记录代表一个人),不用二次数据处理。

编程 - 数据库
MySQL 问题
1…56789…11
鲁ICP备2023049263号-1
© 2020 – 至今 闲暇时光
由 PHP MySQL 开发而成 | 主题 - Yun
upyun