-
laravel mysql like_数据库查询中对 like 的值进行转义
2021-02-01 07:48:15不过这种做法却有几个问题:重复书写like$keyword可能包含%和_,这两个特殊字符将能够把数据库中所有的记录都能查找出来。Laravel China社区的做法是直接把%和_去掉了。为了避免这种情况,我们可以自定义一个函数将....在laravel中,如果要进行数据库的like模糊查询,可以这么做:
$query->where('title','like' , "%".$keyword."%");
不过这种做法却有几个问题:
重复书写like
$keyword可能包含%和_,这两个特殊字符将能够把数据库中所有的记录都能查找出来。
Laravel China社区的做法是直接把%和_去掉了。
为了避免这种情况,我们可以自定义一个函数将我们的字符进行转义。
function escape_like_str($str)
{
$like_escape_char = '!';
return str_replace([$like_escape_char, '%', '_'], [
$like_escape_char.$like_escape_char,
$like_escape_char.'%',
$like_escape_char.'_',
], $str);
}
使用时像这样
$query->where('title','like' , "%".escape_like_str($keyword)."%");
或者参考这个trait
namespace App\Models\Traits;
trait LikeScope
{
/**
* @param \Illuminate\Database\Eloquent\Builder $query
* @param $column
* @param $value
* @param $side
* @param $isNotLike
* @param $isAnd
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeLike($query, $column, $value, $side = 'both', $isNotLike = false, $isAnd = true)
{
$operator = $isNotLike ? 'not like' : 'like';
$escape_like_str = function ($str) {
$like_escape_char = '!';
return str_replace([$like_escape_char, '%', '_'], [
$like_escape_char.$like_escape_char,
$like_escape_char.'%',
$like_escape_char.'_',
], $str);
};
switch ($side) {
case 'none':
$value = $escape_like_str($value);
break;
case 'before':
case 'left':
$value = "%{$escape_like_str($value)}";
break;
case 'after':
case 'right':
$value = "{$escape_like_str($value)}%";
break;
case 'both':
case 'all':
default:
$value = "%{$escape_like_str($value)}%";
break;
}
return $isAnd ? $query->where($column, $operator, $value) : $query->orWhere($column, $operator, $value);
}
public function scopeOrLike($query, $column, $value, $side = 'both', $isNotLike = false)
{
return $query->like($column, $value, $side, $isNotLike, false);
}
public function scopeNotLike($query, $column, $value, $side = 'both', $isAnd = true)
{
return $query->like($column, $value, $side, true, $isAnd);
}
public function scopeOrNotLike($query, $column, $value, $side = 'both')
{
return $query->like($column, $value, $side, true, false);
}
}
使用方法
use App\Models\Traits\LikeScope;
use Illuminate\Database\Eloquent\Model;
class MyModel extends Model
{
use LikeScope;
public function scopeSearch($query, $keyword)
{
return $query->like('title', $keyword);
}
}
我的代码参考了codeigniter的代码实现,欢迎各位批评或提出建议。如果有更好的方法也请多多指教
-
Mysql数据库查询字段值区分大小写问题
2012-12-18 12:15:49有时候遇到这种情况,你用一个like语句查询,查到的结果中有一些并没有包含你查询的关键词的纪录; 有时候遇到这种情况,你的数据库自作聪明的大小写不敏感,让你在更新时把大小写不同的两条记录都今天在写一个项目的时候,在登录界面输入用户名david(数据库存值为David)竟然也能登录成功,百思不得其解之后问了下百度老师。经过查询才得知是建表的时候没有对字段
属性进行设值区分大小写的校对。
有时候遇到这种情况,你用一个like语句查询,查到的结果中有一些并没有包含你查询的关键词的纪录;
有时候遇到这种情况,你的数据库自作聪明的大小写不敏感,让你在更新时把大小写不同的两条记录都更新了;
有时候遇到这种情况,你的查询语句一切正常,查询却失败了,报告Illegal mix of collations错误;
你很困惑,在想数据库是不是坏了。。。。其实,这些都和数据库字符集的校对规则有关;了解了校对规则,你就知道怎样处理这些问题。
那么,校对规则是怎么回事呢?它是一组规则,负责决定某一字符集下的字符进行比较和排序的结果。
比如说,有latin1字符集中的字母A和a,我们需要它们在比较的时候相等,那么,我们可以使用字符集校对规则 latin1_general_ci
;这种校对规则在比较和排序的时候不区分大小写;如果我们需要他们在比较的时候不等呢?也很简单,我们可以使用字符集校对规则
latin1_bin;这种校对规则会以二进制的方式对字符进行比较,很明显,a和A的二进制编码不同,比较的结果就是不等。
上面的场景说明了校对规则在最简单情况下起的作用;实际情况与此并没有太多不同,只不过稍微有些复杂而已。
如果想要区别大小写可以设值字段校对,可以通过MySql Administrator工具对字段进行设置,如对name字段的Column Collate设置为utf8_bin,这种校对规则会以二进制的方式对
字符进行比较
-
数据库模糊查询
2019-09-08 22:59:29前言:一般情况下的模糊查询的模糊查询是使用 like 关键字匹配 某列是否包含给定的内容,判定结果是字段包含内容。...两个函数:instr(Oracle)和charindex(sqlserver)。 1、instr函数 select instr(aStr,bSt...前言:一般情况下的模糊查询的模糊查询是使用 like 关键字匹配 某列是否包含给定的内容,判定结果是字段包含内容。
在某些特殊的需求下,得反过来考虑“模糊查询”:字段值是否包含于给定的内容(字段值被包含)。该笔记记录完成这种需求的
两个函数:instr(Oracle)和charindex(sqlserver)。
1、instr函数
select instr(aStr,bStr),bStr在aStr里的位置,从1开始,若aStr里没有bStr,则返回0。
2、charindex函数
select charindex(aStr,bStr),aStr在bStr里的位置,从1开始,若bStr里没有aStr,则返回0。
-
【数据库】MySQL中的模糊查询 like 和 Oracle中的 instr() 函数
2019-08-09 08:57:09MySQL: select * from tableName where name like '%helloworld%'; Oracle:select * from tableName where instr(name,'...//instr方式必须保证hkxz的code值不能存在交集,其中一个code不能是另一个code的子集,...MySQL: select * from tableName where name like '%helloworld%'; Oracle:select * from tableName where instr(name,'helloworld')>0; --这两条语句的效果是一样的 //instr方式必须保证hkxz的code值不能存在交集,其中一个code不能是另一个code的子集,101和10 //否则用 name in ( , , )
-
SQL Server数据库————模糊查询和聚合函数
2018-12-03 22:16:32SQL Server数据库————模糊查询...between… and… 在某两个值的区间范围中(前后都包括,小的写前面,大的写后面) 通配符 1.% 任意个数的任意字符 示例: LIKE ‘CO%’ 可取值CONST、COKE等Cd等 2._ 匹配一个... -
数据库
2018-05-28 11:55:411. 常见的数据库优化手段:a. 百万级数据库优化:对查询进行优化,要尽量避免全表扫描,考虑在where及order by涉及...对于大的delete或者insert语句,最好批量提交SQL语句,因为这两个操作会锁表,别的操作无法进... -
数据库字段包含反斜杠的查询处理
2019-04-23 18:40:00这种如果要查询的话,必须使用3个反斜杠才能查到,比如 like ”%D\%“是查不到上面两条记录的,必须使用like ”%D\\\%“,原因是反斜线符号会被语法分析程序剥离一次,在进行模式匹配时,又会被剥离一次,最后会剩下... -
sql查询like语句操作数剖析
2007-01-31 10:44:00在SQL结构化查询语言中,LIKE语句有着至关重要的作用。... 假设有一个数据库中有个表table1,在table1中有两个字段,分别是name和sex二者全是字符型数据。现在我们要在姓名字段中查询以“张”字开头... -
Linux下MySQL数据库的备份与还原,mysql快速导入导出数据库实例演示,解决mysql大数据量数据库导出慢的问题
2020-09-01 20:32:08Linux下MySQL数据库的备份与还原,mysql快速导入导出数据库实例演示,解决mysql大数据量...先通过下面的语句查询出两个值。 show variables like 'max_allowed_packet'; show variables like 'net_buffer_length'; -
SQL LIKE语句查询
2008-06-24 08:36:00在SQL结构化查询语言中,LIKE语句有着至关重要的作用。...假设有一个数据库中有个表table1,在table1中有两个字段,分别是name和sex二者全是字符型数据。现在我们要在姓名字段中查询以“张”字开头的记... -
VBA与数据库
2015-11-19 18:07:38•实例3-40 从两个数据表中查询出只存在于某个数据表的记录 108 •实例3-41 将查询结果生成一个数据表 108 •实例3-42 将查询结果保存为一个XML文件 109 •实例3-43 利用工作表实现记录的分页显示 110 •实例3-44 ... -
数据库高级语句2
2020-10-15 16:18:22数据库高级语句2LEAST、GREATESTIN、NOT INLIKE、NOT LIKE逻辑运算符逻辑非逻辑与逻辑或位运算符连接查询内连接左连接右连接数据库函数常用的数学函数 LEAST、GREATEST least:当有两个或者多个参数时,返回其中... -
数据库练习题
2019-03-15 14:20:575. 查询借阅过定价介于20元到40元(包括两个边界值)图书的读者的姓名。 Select Name (建立多表连接查询) From borrow join book on borrow.book_id=book.book_id Join reader on borrow.reader_id=reader.... -
数据库相关基础知识
2021-03-04 23:42:03数据库规范 1、SQL语言大小写不敏感...between … and … 表示在两个值之间【包含边界】; in(set):等于值列表中的一个; like :模糊查询; ***【%表示零个或多个字符(任意个字符)】;【_表示一个字符】。 is null -
MySql数据库主从配置
2019-06-18 12:52:18两个虚拟机;5.6.33版本的MySql数据库; 一.确定主从库,分别查看对应的server_id;需要保证server_id不重复 查看server_id命令:SHOW VARIABLES like 'server_id';如下图: 默认server_id为0,则需要在数据库配置文件my.... -
SQL结构化查询语言中的LIKE语句
2011-10-17 22:32:00SQL结构化查询语言中的LIKE语句 在sql结构化查询语言中,like语句有着至关重要的作用。 like语句的语法格式是:select... 假设有一个数据库中有个表table1,在table1中有两个字段,分别是name和sex二者全是字... -
Oracle数据库、SQL
2014-04-14 23:40:171.12一台机器可跑几个数据库,主要受内存大小影响 2 1.13源表和结果集 2 1.14几个简单命令 2 1.15 tarena给jsd1304授权 2 1.16课程中使用的5个表 3 二、 select from语句 5 2.1 select语句功能 5 2.2 select语句基本... -
MySQL数据库的高级SQL语句(学会这个!!MySQL就掌握的差不多了)
2021-02-25 14:30:03文章目录一、准备工作二、MySQL高级SQL语句1、SELECT-...-------显示两个值范围内的资料7、通配符--------通常通配符都跟LIKE 一起使用的8、ORDER BY9、函数1)、数学函数2)、聚合函数3)、字符串函数4)、GROUP BY -- -
oracle数据库经典题目
2011-02-17 15:05:204.说明数据库内存结构中SGA和PGA的组成,以及这两个内存区存放信息的区别。 答案: SGA区由数据缓冲区、共享池、重做日志缓冲区、大型池、JAVA池构成;PGA区由排序区、私有SQL区以及堆栈构成。SGA区是由Oracle分配... -
Oracle数据库实验操作
2012-07-26 15:00:43实验10:使用like查询近似的值 18 实验11:使用order by子句来进行排序操作 20 实验12:操作字符串的函数 22 实验13:操作数字的函数 25 实验14:操作日期的函数 25 实验15:操作数据为null的函数 31 实验16:分支的... -
深入研究SQL结构化查询语言中的LIKE语句
2007-02-04 11:18:00在SQL结构化查询语言中,LIKE语句有着至关重要的作用。... 假设有一个数据库中有个表table1,在table1中有两个字段,分别是name和sex二者全是字符型数据。现在我们要在姓名字段中查询以“张”字开头的记... -
Excel VBA与数据库整合应用范例精讲
2011-10-29 18:48:38实例3-40 从两个数据表中查询出只存在于某个数据表的记录 实例3-41 将查询结果生成一个数据表 实例3-42 将查询结果保存为一个XML文件 实例3-43 利用工作表实现记录的分页显示 实例3-44 利用窗体实现记录的分页... -
mysql数据库的基本操作语法
2018-12-05 16:43:13外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。 也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不... -
转载------like查询后置% 索引竟然也失效
2020-08-31 11:39:50昨天早上接到一个任务,查询某类商品,数据库用的是mysql,版本是5.6.37,es_product 表数据不多,两万多条。执行语句我简化了一下,类似下面的这条sql: SELECT * FROM es_product WHERE goods_code LIKE 'meiju%'... -
数据库相关的知识点!
2020-07-09 10:44:21foregin key 外键 建立两个表之间的联系 语法 constraint fk_dep foreign key(关联列名) references 被关联表(被关联列) on delete cascade 同步删除 on update cascade 同步更新 二、Mysql基本介绍 操作文件夹... -
Access数据库查看器 密码查看器
2014-03-08 10:00:09from [table] where 字段 like '%值%')、查询(这里可以输入原生态的SQL语句,限定于Select语句)、表信息(查看table的字段及类型)等等。 支持直接对表格数据操作。 二:Accesscheck 编程首推 这个工具在打开一个...