substring_index(str,delim,count)

str:要处理的字符串

delim:分隔符

count:计数

例子:str=www.google.com

1.count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容

SELECT SUBSTRING_INDEX('www.google.com','.',1);

结果是:www

SELECT SUBSTRING_INDEX('www.google.com','.',2);

结果是:www.google

2.count是负数,那么就是从右边开始数,第N个分隔符右边的所有内容,如:

SELECT SUBSTRING_INDEX('www.google.com','.',-2);

结果为:google.com

如果我呀中间的的google怎么办?

很简单的,两个方向:

从右数第二个分隔符的右边全部,再从左数的第一个分隔符的左边:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com','.',-2),'.',1);

结果为:google

总结:SUBSTRING_INDEX可以理解为java里面按照分隔符使用split进行分组,从所得数组的下标+1处一直到开始算起的位置的所有内容即为最终结果,如果count 不等于0,那么即使str中没有找到delim分隔,那么返回的结果就是str本身,即只要count!=0,那么返回的最差结果也是str本身(没有找到一个delim分隔符...的情况)

例如:

(1)

SELECT SUBSTRING_INDEX('www.google.com','AAA',-1);

SELECT SUBSTRING_INDEX('www.google.com','AAA',-99);

两者的结果都为:www.google.com

(2)在项目中利用CONCAT来做字符串合并,发现一个一个有意思的事情,

SELECT CONCAT(SUBSTRING_INDEX('www.google.com','.',1),'-','AAAABB')

结果为:www-AAAABB

(3)

SELECT CONCAT(SUBSTRING_INDEX('www.google.com','AAA',1),'-','AAAABB')

结果为:www.google.com-AAAABB

(4)

SELECT CONCAT(SUBSTRING_INDEX('www.google.com','AAA',1)-1,'-','AAAABB')

结果为:-1-AAAABB

结果咋这样呢?发现Mysql的字符串在参与运算的时候很有意思:

MYSQL截取函数:

1、从左开始截取字符串

left(str, length)

说明:left(被截取字段,截取长度)

例:select left(content,200) as abstract from my_content_t

2、从右开始截取字符串

right(str, length)

说明:right(被截取字段,截取长度)

例:select right(content,200) as abstract from my_content_t

3、截取字符串

substring(str, pos)

substring(str, pos, length)

说明:substring(被截取字段,从第几位开始截取)

substring(被截取字段,从第几位开始截取,截取长度)

例:select substring(content,5) as abstract from my_content_t

select substring(content,5,200) as abstract from my_content_t

(注:如果位数是负数 如-5 则是从后倒数位数,到字符串结束或截取的长度)

4、按关键字截取字符串

substring_index(str,delim,count)

说明:substring_index(被截取字段,关键字,关键字出现的次数)

例:select substring_index("blog.jb51.net","。",2) as abstract from my_content_t

结果:blog.jb51

(注:如果关键字出现的次数是负数 如-2 则是从后倒数,到字符串结束)

函数简介:

SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)

不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。

mysql之字符串进行运算或大小比较

在mysql当中,字符串类型间进行加减乘除运算的时候,如果字符串以数字开头,则会截取字符串以数字开头的那一部分数字进行运算,如果字符串没将诶有以数字开头数字,那么就只能截取的数值为0,那么进行加减的时候结果都是0,进行乘除的时候结果都是NULL(即如果以字符串开头,则会从数字一直截取到非数字为止;如果不以数字开头,那么取0)

如下几个结果说明问题:

mysql> select '1a'+'1b';//字符串分别以1开头,所以运算的时候,分别为1,结果为1+1=2

+-----------+

| '1a'+'1b' |

+-----------+

| 2 |

+-----------+

1 row in set, 2 warnings (0.00 sec)

mysql> select '2a'-'1b';//字符串分别以2和1开头,所以结果为2-1=1

+-----------+

| '2a'-'1b' |

+-----------+

| 1 |

+-----------+

1 row in set, 2 warnings (0.00 sec)

mysql> select '1a'/'2b';//字符串分别以1和2开头,所以结果为:1/2=0.5

+-----------+

| '1a'/'2b' |

+-----------+

| 0.5 |

+-----------+

1 row in set, 2 warnings (0.00 sec)

mysql> select 'a'/'b';//字符串分别以'a'和'b'开头,所以结果为0/0=NULL

+---------+

| 'a'/'b' |

+---------+

| NULL |

+---------+

1 row in set, 3 warnings (0.00 sec)

mysql> select 'a' - 'b';//字符串分别以'a'和'b'开头,结果为0-0=0

+-----------+

| 'a' - 'b' |

+-----------+

| 0 |

+-----------+

1 row in set, 2 warnings (0.00 sec)

mysql> select 'a' + 'b';//字符串分别以'a'和'b'开头,结果为0+0=0

+-----------+

| 'a' + 'b' |

+-----------+

| 0 |

+-----------+

1 row in set, 2 warnings (0.00 sec)

如果一个字符串以数字开头,后面有非数字和数字组合的话,在进行运算的时候,会省略掉非数字和数字组合那一段,也就是只会截取开头的数字

mysql> select '2015-2-1' - '2015-1-1';字符串分别以'2015'和'2015'开头,结果为2015-2015=2015

+-------------------------+

| '2015-2-1' - '2015-1-1' |

+-------------------------+

| 0 |

+-------------------------+

1 row in set, 2 warnings (0.00 sec)

以上相当于2015-2015=0

mysql当字符串进行大小比较的时候

mysql> select '2015-2-1' > '2015-1-1';

+-------------------------+

| '2015-2-1' > '2015-1-1' |

+-------------------------+

| 1 |

+-------------------------+

1 row in set (0.00 sec)

mysql> select '2015-2-1' < '2015-1-1';

+-------------------------+

| '2015-2-1' < '2015-1-1' |

+-------------------------+

| 0 |

+-------------------------+

1 row in set (0.00 sec)

在这里非常奇怪,'2015-2-1' - '2015-1-1' = 0,为什么大小比较的时候会有大小之分呢?

原来对于数字与非数字混合的字符串,在进行大小比较的时候,如果两字符串长度相等,那么两字符串就会比较相同位置的字符,比较时若字符是数字,则直接比较,若字符是非数字那么会转换为ascii码进行比较,若在某位置上已经有大小之分,那么就不会再进行比较。

mysql> select '2017-03-20 15:27:49' > '2017-03-20 15:27:48';

+-----------------------------------------------+

| '2017-03-20 15:27:49' > '2017-03-20 15:27:48' |

+-----------------------------------------------+

| 1 |

+-----------------------------------------------+

1 row in set (0.00 sec)

看起来像日期的字符串可以用date_format函数提取当中的年月日,看如下:

mysql> select date_format('2017/03/20 15:27:49','%Y') 年,date_format('2017/03/20 15:27:49','%c') 月,date_format('2017/03/20 15:27:49','%d') 日;

+------+------+------+

| 年 | 月 | 日 |

+------+------+------+

| 2017 | 3 | 20 |

+------+------+------+

1 row in set (0.00 sec)

非数字字符在比较大小的时候,就例如:

mysql> select 'a' < 'b';

+-----------+

| 'a' < 'b' |

+-----------+

| 1 |

+-----------+

1 row in set (0.00 sec)

当中的字母会转成ascii码,再进行比较,以上是单字母字符串比较,如果是多字母数字混合字符串比较呢?

mysql> select '1c' > 'bc';

+-------------+

| '1c' > 'bc' |

+-------------+

| 0 |

+-------------+

1 row in set (0.00 sec)

mysql> select '1yz' > 'abc999';

+------------------+

| '1yz' > 'abc999' |

+------------------+

| 0 |

+------------------+

1 row in set (0.00 sec)

其实从上面的结果大概可以猜测得到,为让解释更清晰更有说服力,再看下图:

mysql> select ascii('1c'),ascii('bc');

+-------------+-------------+

| ascii('1c') | ascii('bc') |

+-------------+-------------+

| 49 | 98 |

+-------------+-------------+

1 row in set (0.00 sec)

mysql> select ascii('1yz'),ascii('abc999');

+--------------+-----------------+

| ascii('1yz') | ascii('abc999') |

+--------------+-----------------+

| 49 | 97 |

+--------------+-----------------+

1 row in set (0.00 sec)

字符串大小比较的时候,会从左向右将两个字符串第一个不相等的两个字符的ascii码的比较结果作为最终结果

有时候我们需要直接用MySQL的字符串函数截取字符,毕竟用程序截取(如PHP)还得先写个脚本连接数据库之类的,所以在这里做一个记录,希望对大家有用。

MySQL截取字符串函数

1、从左开始截取字符串

left(str, length)

说明:left(被截取字段,截取长度)

例:

select left(content,200) as abstract from my_content_t

2、从右开始截取字符串

right(str, length)

说明:right(被截取字段,截取长度)

例:

select right(content,200) as abstract from my_content_t

3、截取字符串

substring(str, pos)

substring(str, pos, length)

说明:substring(被截取字段,从第几位开始截取)

substring(被截取字段,从第几位开始截取,截取长度)

例:

select substring(content,5) as abstract from my_content_t

select substring(content,5,200) as abstract from my_content_t

(注:如果位数是负数 如-5 则是从后倒数位数,到字符串结束或截取的长度)

4、按关键字截取字符串

substring_index(str,delim,count)

说明:substring_index(被截取字段,关键字,关键字出现的次数)

例:

select substring_index("blog.jb51.net",".",2) as abstract from my_content_t

结果:blog.jb51

.net mysql字符串截取_【MySQL】字符串截取之SUBSTRING_INDEX和【MySQL】字符串四则运算...相关推荐

  1. mysql root命令_设置更改root密码、连接mysql、mysql常用命令

    目录 一.设置更改root密码 二.连接mysql 三.mysql常用命令 一.设置更改root密码 检查mysql服务是否启动 [root@minglinux-01 ~] ps aux |grep ...

  2. mysql 创建表_每天10分钟带你学会MySQL(三)表的创建

    要掌握的要点: 表通过CREATE TABLE语句创建而成. 表和列的命名要使用有意义的文字. 指定列的数据类型(整数型.字符型和日期型等). 可以在表中设置约束(主键约束和NOT NULL约束等). ...

  3. mysql序列号生成_值得一看!数据库及Mysql入门,附详细安装教程

    #什么是数据 用来描述事物的符号记录.可以是数字.文字.图形等,有多种形式,经过数字化之后存入计算机 #什么是数据库 数据库(Database)就是一个用来存放数据库的仓库,是按照一定的数据结构来组织 ...

  4. mysql心得笔记_【原创】学习{我的mysql学习心得}的笔记

    标签: 万丈高楼平地起. 从最基础的做起,从最简单的做起. ---------------------------------------------------------------------- ...

  5. mysql 存储过程无效_用VC通过DLL包连接MySQL,执行存储过程后,再执行其他查询无效?解决方法...

    用VC通过DLL包连接mysql,执行存储过程后,再执行其他查询无效? MYSQL mysql; mysql_init(&mysql); mysql_real_connect(&mys ...

  6. mysql zrm 配置_利用MySQL-zrm来备份和恢复MySQL数据库方法详解

    MySQL ZRM 工具是用PERL写的可以全部和增量备份MySQL数据库的一个强大工具. 还可以做快照,不过我现在没有条件做.等以后有可以做了再补上. 其实具体要说的也没啥,我只是做了点测试. 这里 ...

  7. mysql+数据库连接标识_新人必看!连接到MySQL数据库的两种方法

    原标题:新人必看!连接到MySQL数据库的两种方法 使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库. 实例 以下是从命令行中连接mysq ...

  8. 删除电脑中的mysql数据库吗_【数据库】怎么彻底删除mysql服务?

    彻底删除mysql服务的步骤: 1.关闭mysql服务 在cmd命令行输入以下命令 net stop mysql 或者 我的电脑右键->管理->服务,进入后手动关闭. 2.删除MySQL服 ...

  9. JAVA跟MYSQL数据库交互_【编写Java程序实现与Mysql数据库的连接,并交互性的实现简单查询,删除,修改,排序,显示等操作】...

    目前博主只实现了查询和插入,而且还不太会在面板对数据库语句进行更新,写完再看感觉语言有些冗杂,往后再更,大半夜写这个也是醉了呢. import javax.swing.*; import java.a ...

  10. mysql客户库_你应该知道的10个MySQL客户启动选项

    大部分服务器管理员知道MySQL数据库管理系统(RDBMS)是高度灵活的软件块,带有范围广阔的启动选项,可以用来修改相关行为.然而,大部分人却不清楚,标准MySQL客户端带有同等大量的启动选项,其中一 ...

最新文章

  1. 【错误记录】VMware 虚拟机报错 ( 向 VMWare 虚拟机中的 Ubuntu 系统拷贝文件时磁盘空间不足 ② | 删除交换空间 )
  2. 字符转换16进制输出
  3. SAP 与 JSON 接口实施案例一
  4. Providers in SAP Spartacus
  5. pythonutf-8是不是二进制_python学习笔记8-9(字符编码与二进制)
  6. 鸿蒙系统-手机-HAP开发编译调试
  7. android 闪屏页处理_Android应用闪屏页延迟跳转的三种写法
  8. 大工17春计算机文化基础在线测试3,大工17春《计算机文化基础》在线测试3满分答案...
  9. python---之os.path.splitext(“文件路径”)
  10. 【招】阿里云技术战略高级专家
  11. android 图片自动移动位置信息,android – 使用翻译动画将ImageView从当前位置移动到固定位置...
  12. 时序预测 | MATLAB实现DBN深度置信网络时间序列预测
  13. usb驱动错误导致的键盘鼠标失灵
  14. java jemalloc_jemalloc 快速上手攻略
  15. 关于宋宝华linux驱动学习视频的读后感
  16. 贡献度分析--帕累托图
  17. 怎么下载高清无水印的视频号作品?视频号下载要用什么工具?1分钟解决微信视频号下载
  18. 如何让你的本地上的项目不用部署到服务器也能让外网看到?使用ngrok内网穿透实现
  19. 深入学习Linux摄像头(一)v4l2应用编程
  20. 牛客网华为机试题(JavaScript)

热门文章

  1. Opserver开源的服务器监控系统(ASP.NET)
  2. TFS2015的CI集成
  3. Redis -- Hash(哈希) [3]
  4. 【QGIS入门实战精品教程】4.6:QGIS实现栅格(影像、DEM)的拼接与掩膜提取
  5. 【ArcGIS遇上Python】ArcGIS Python获取某个字段的唯一值(获取指定字段的不同属性值)
  6. SQL Server数据库锁的类型、用法及注意事项详解
  7. Java连接SQL Server类MyDBase的实现
  8. linux之找出两个文件里面相同的数据
  9. Android插件化开发基础之Java反射机制研究
  10. 女朋友当众甩了我一巴掌,我扑上去......