重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
低效率的实现方法一:我看到过有个网站源码是这样做的,它通过“Select * From……”把整个表取出,然后逐条循环tmp=rs("A")getpy(rs("A"))rs("B")getpy(rs("B"))rs("C")getpy(rs("C")),然后对比tmp里是否含有request("key"),其中getpy()是它自定义的一个很长的函数。这样的做法虽然能实现,但是效率也太低了,不仅要把整个数据库全部搬下来,还要对每个字都进行getpy()才能得到结果。
创新新互联,凭借10多年的网站建设、成都做网站经验,本着真心·诚心服务的企业理念服务于成都中小企业设计网站有1000+案例。做网站建设,选创新互联建站。
低效率的实现方法二:对数据库每个字段都增加一个对应的拼音字段,也就是数据结构变成Title、TitlePy、Author、AuthorPy、Content、ContentPy,然后修改Select语句查询它们,但是这样在每次更新数据库时都要维护一次对应的拼音字段,效率仍然低下,并且还使数据库体积成倍增大,仅仅为了一个拼音搜索功能,不值。
可以看下时间函数
对日期时间进行加减法运算
(ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词,也可以用运算符 和-而不是函数
date是一个DATETIME或DATE值,expr对date进行加减法的一个表达式字符串type指明表达式expr应该如何被解释
[type值 含义 期望的expr格式]:
SECOND 秒 SECONDS
MINUTE 分钟 MINUTES
HOUR 时间 HOURS
DAY 天 DAYS
MONTH 月 MONTHS
YEAR 年 YEARS
MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS"
HOUR_MINUTE 小时和分钟 "HOURS:MINUTES"
DAY_HOUR 天和小时 "DAYS HOURS"
YEAR_MONTH 年和月 "YEARS-MONTHS"
HOUR_SECOND 小时, 分钟, "HOURS:MINUTES:SECONDS"
DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES"
DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS"
expr中允许任何标点做分隔符,如果所有是DATE值时结果是一个DATE值,否则结果是一个DATETIME值)
如果type关键词不完整,则MySQL从右端取值,DAY_SECOND因为缺少小时分钟等于MINUTE_SECOND)
如果增加MONTH、YEAR_MONTH或YEAR,天数大于结果月份的最大天数则使用最大天数)
mysql SELECT "1997-12-31 23:59:59" INTERVAL 1 SECOND;
- 1998-01-01 00:00:00
mysql SELECT INTERVAL 1 DAY "1997-12-31";
- 1998-01-01
mysql SELECT "1998-01-01" - INTERVAL 1 SECOND;
- 1997-12-31 23:59:59
mysql SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 SECOND);
- 1998-01-01 00:00:00
mysql SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 DAY);
- 1998-01-01 23:59:59
mysql SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL "1:1" MINUTE_SECOND);
- 1998-01-01 00:01:00
mysql SELECT DATE_SUB("1998-01-01 00:00:00",INTERVAL "1 1:1:1" DAY_SECOND);
- 1997-12-30 22:58:59
mysql SELECT DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR);
- 1997-12-30 14:00:00
mysql SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
- 1997-12-02
mysql SELECT EXTRACT(YEAR FROM "1999-07-02");
- 1999
mysql SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
- 199907
mysql SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
- 20102
TO_DAYS(date)
返回日期date是西元0年至今多少天(不计算1582年以前)
mysql select TO_DAYS(950501);
- 728779
mysql select TO_DAYS('1997-10-07');
- 729669
FROM_DAYS(N)
给出西元0年至今多少天返回DATE值(不计算1582年以前)
mysql select FROM_DAYS(729669);
- '1997-10-07'
本文来自CSDN博客,转载请标明出处:
MySQL数据库的表是一个二维表,由一个或多个数据列构成。
每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。
MySQL中的列类型有三种:数值类、字符串类和日期/时间类。
从大类来看列类型和数值类型一样,都是只有三种。但每种列类型都还可细分。
下面对各种列类型进行详细介绍。
数值类的数据列类型
数值型的列类型包括整型和浮点型两大类。
TINYINT:1字节 非常小的正整数,带符号:-128~127,不带符号:0~255
SMALLINT:2字节 小整数,带符号:-32768~32767,不带符号:0~65535
MEDIUMINT:3字节 中等大小的整数,带符号:-8388608~8388607,不带符号:0~16777215
INT:4字节 标准整数,带符号:-2147483648~2147483647,不带符号:0~4294967295
BIGINT:8字节 大整数,带符号:-9223372036854775808~9233372036854775807,不带符号:0~18446744073709551615
FLOAT:4字节 单精度浮点数,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38
DOUBLE:8字节 双精度浮点数,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308
DECIMAL:M+2字节 以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。
MYSQL支持大量的列类型,它们可以被分为 3 类:数字类型、日期和时间类型以及字符串(字符)类型。这个章节首先给出可用类型的概述,并且总结各类型所需的存储需求,然后提供各类型中的类型范畴更详细的描述。概述有意地简化了。更详细的说明应该参考特写列类型的附加信息,例如你能为其指定值的允许格式。
MySQL 支持的列类型在下面列出。下列代码字母用于描述中:
M指出最大的显示尺寸。最大的显示尺寸长度为 255。D适用于浮点类型。指出跟随在十进制小数点后的数字数量。最大可能值为 30,但不应大于M-2。
方括号 (“[”and“]”) 指定可选的类型修饰部份。
注意,如果为一个列指定了ZEROFILL,MySQL 将自动为这个列添加UNSIGNED属性。
警告:你应该知道当在两个整数类型值中使用减法时,如有一个为UNSIGNED类型,那么结果也是无符号的。查看章节6.3.5 Cast 函数。
TINYINT[(M)] [UNSIGNED] [ZEROFILL]-128到127。无符号的范围是0到255。
BITBOOL它们是TINYINT(1)的同义词。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]一个小整数。有符号的范围是-32768到32767。无符号的范围是0到65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]一个中等大小的整数。有符号的范围是-8388608到8388607。无符号的范围是0到16777215。
INT[(M)] [UNSIGNED] [ZEROFILL]一个正常大小的整数。有符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。
INTEGER[(M)] [UNSIGNED] [ZEROFILL]INT的同义词。
BIGINT[(M)] [UNSIGNED] [ZEROFILL]一个大的整数。有符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。
你应该知道的有关BIGINT列的一些事情:
BIGINT或DOUBLE值来完成的,因此你不应该使用大于9223372036854775807(63 bits) 的无符号大整数,除了位函数之外!如果你这样做了,结果中的某些大数字可能会出错,因为将BIGINT转换成DOUBLE时产生了舍入错误。MySQL 4.0 在下列情况下可以处理BIGINT:
在一个BIGINT列中使用整数存储一个大的无符号值。
在MIN(big_int_column)和MAX(big_int_column)中。
当两个操作数都是整数时使用操作符 (+、-、*、等)。
通常你可以在一个BIGINT列中以字符串方式存储的一个精确的整数。在这种情况下,MySQL 将执行一个字符串到数字的转换,包括无 intermediate 的双精度表示法。
当两个参数均是整数值时,“-”、“+”和“*”将使用BIGINT运算!这就意味着,如果两个大整数的乘积(或函数的结果返回整数)的结果大于9223372036854775807时,你可能会得到意想不到的结果。
FLOAT(precision) [UNSIGNED] [ZEROFILL]一个浮点型数字。
precision可以是=24作为一个单精度的浮点数字和介于 25 和 53 之间作为一个双精度的浮点数字。这些类型与下面描述的FLOAT和DOUBLE类型相似。FLOAT(X)有与相应的FLOAT和DOUBLE类型同样的范围,但是显示尺寸和十进制小数位数是未定义的。在 MySQL 3.23 中,它是一个真实的浮点值。而在 MySQL 早期的版本中,FLOAT(precision)通常有 2 小数位。 注意,由于在 MySQL 中所有的计算都是以双精度执行的,所以使用FLOAT可能带来一些意想不到的问题。查看章节A.5.6 解决没有匹配行的问题。
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]一个小的(单精度) 浮点数字。允许的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。如果UNSIGNED被指定,负值是不允许的。M是显示宽度,D是小数位数。FLOAT没有参数或有X= 24 的FLOAT(X)代表一个单精度的浮点数字。
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]一个正常大小的(双精度)浮上数字。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308。如果UNSIGNED被指定,负值是不允许的。M是显示宽度,D是小数位数。DOUBLE没胡参数或有 25 =X= 53 的FLOAT(X)代表一个双精度的浮点数字。
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]
REAL[(M,D)] [UNSIGNED] [ZEROFILL]它们是DOUBLE同义词。
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]一个未压缩(unpacked)的浮点数。运作如同一个CHAR列:“unpacked” 意味着数字是以一个字符串存储的,值的每一位将使用一个字符。小数点并且对于负数,“-”符号不在M中计算(但是它们的空间是被保留的)。如果D是 0,值将没有小数点或小数部份。DECIMAL值的最大范围与DOUBLE一致,但是对于一个给定的DECIMAL列,实际的范围可以被所选择的M和D限制。如果UNSIGNED被指定,负值是不允许的。 如果D被忽略,缺省为 0。如果M被忽略,缺省为 10。 在 MySQL 3.23 以前,M参数必须包含符号与小数点所需的空间。
DEC[(M[,D])] [UNSIGNED] [ZEROFILL]
NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]DECIMAL的同义词。
DATE一个日期。支持的范围是'1000-01-01'到'9999-12-31'。MySQL 以'YYYY-MM-DD'格式显示DATE值,但是允许你以字符串或数字给一个DATE列赋值。查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。
DATETIME一个日期和时间的组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL 以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,但是允许你以字符串或数字给一个DATETIME列赋值。查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。
TIMESTAMP[(M)]一个时间戳。范围是'1970-01-01 00:00:00'到2037年间的任意时刻。 MySQL 4.0 和更早版本中,TIMESTAMP值是以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式显示的,它取决于M是否是14(或省略)、12、8或6,但是允许你以字符串或数字给一个TIMESTAMP列赋值。 从 MySQL 4.1 开始,TIMESTAMP以'YYYY-MM-DD HH:MM:DD'格式作为字符返回。如果你你希望以数字形式返回则必须在该时间戳字段后加上 +0。不同的时间戳长度是不支持的。从 MySQL 4.0.12 开始,选项--new可以被用来使服务器与 4.1 一样运作。TIMESTAMP列有益于记录一个INSERT或UPDATE操作的日期和时间,因为如果你自己没有给它赋值,它将被自动地设置为最近一次操作的日期和时间。也可以通过给它赋一个NULL而使它设置为当前的日期和时间。查看章节6.2.2 Date 和 Time 类型。 参数M只影响一个TIMESTAMP列的显示格式;它的值总是占用 4 个字节存储。 注意,当TIMESTAMP(M)列的M是 8 或 14 时,它返回的是数字而其它的TIMESTAMP(M)列返回的是字符串。这仅仅是为了可以可靠地转储并恢复到其它格式的表中。查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。TIME一个时间。范围是'-838:59:59'到'838:59:59'。MySQL 以'HH:MM:SS'格式显示TIME值,但是允许你使用字符串或数字来给TIME列赋值。查看章节6.2.2.3TIME类型。YEAR[(2|4)]一个 2 或 4 位数字格式的年(缺省为 4 位)。允许的值是1901到2155、0000(4 位年格式) 以及使用 2 位格式的 1970-2069 (70-69)。MySQL 以YYYY格式显示YEAR值,但是允许你使用字符串或数字来给YEAR列赋值。(YEAR类型在 MySQL 3.22 之前不支持。) 查看章节6.2.2.4YEAR类型。
[NATIONAL] CHAR(M) [BINARY]一个定长的字符串,当存储时,总是以空格填满右边到指定的长度。M的范围是 0 到 255 (在 MySQL 3.23 版本之前为 1 到 255)。当该值被检索时,尾部空格将被删除。CHAR值根据缺省的字符集进行忽略大小写的排索与比较,除非指定了关键词BINARY。NATIONAL CHAR(或短形式NCHAR) 是以 ANSI SQL 方式定义一个CHAR列,它将使用缺省的字符集。这在 MySQL 中是默认的。
CHAR是CHARACTER的缩写。 MySQL 允许以CHAR(0)类型建立一个列。一些老程序运行时必需一个列,却又并不使用这个列的值,你就不得不为了适应它而建立该列,在这情况下,CHAR(0)将是很有益的。当需要一个列仅保存两个值时:一个为CHAR(0)(该列没有定义为NOT NULL),这将仅占用一个比特位来存储 2 个值:NULL或""。查看章节6.2.3.1CHAR和VARCHAR类型。CHAR这是CHAR(1)的同义词。
[NATIONAL] VARCHAR(M) [BINARY]一个变长的字符串。注意:尾部的空格在存储时将会被删除(这与 ANSI SQL 约规不同)。M的范围是 0 到 255 (在 MySQL 4.0.2 之前的版本中是 1 到 255)。
VARCHAR值以大小写忽略方式进行排索与比较,除非关键词BINARY被指定。查看章节6.5.3.1 隐式的列定义变化。VARCHAR是CHARACTER VARYING的缩写。查看章节6.2.3.1CHAR和VARCHAR类型。
TINYBLOBTINYTEXT一个BLOB或TEXT列,最大长度为 255 (2^8 - 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。查看章节6.2.3.2BLOB和TEXT类型。
BLOBTEXT一个BLOB或TEXT列,最大长度为 65535 (2^16 - 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。查看章节6.2.3.2BLOB和TEXT类型。
MEDIUMBLOBMEDIUMTEXT一个BLOB或TEXT列,最大长度为 16777215 (2^24 - 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。查看章节6.2.3.2BLOB和TEXT类型。
LONGBLOBLONGTEXT一个BLOB或TEXT列,最大长度为 4294967295 (2^32 - 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。注意,由于服务器/客户端的协议以及 MyISAM 表通常有一个 16M 每通信包/表行的限制,你仍然不能使用这个类型的整个范围。查看章节6.2.3.2BLOB和TEXT类型。ENUM('value1','value2',...)一个枚举类型。一个仅能有一个值的字符串对象,这个值选自值列'value1'、'value2'、...、NULL或特殊的""出错值。一个ENUM列可以有最大 65535 不同的值。查看章节6.2.3.3ENUM类型。SET('value1','value2',...)一个集合。一个能有零个或更多个值的字符串对象,其中每个值必须选自值列'value1'、'value2'、...。一个SET列可以有最大 64 个成员。查看章节6.2.3.4SET类型。
MySQL 支持所有的 ANSI/ISO SQL92 数字类型。这些类型包括准确数字的数据类型(NUMERIC、DECIMAL、INTEGER和SMALLINT),也包括近似数字的数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键词INT是INTEGER的同义词,关键词DEC是DECIMAL的同义词。
NUMERIC和DECIMAL类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。当以它们中的之一声明一个列时,精度和数值范围可以(通常是)被指定;例如:
salary DECIMAL(5,2)
在这个例子中,5(精度(precision)) 代表重要的十进制数字的数目,2(数据范围(scale)) 代表在小数点后的数字位数。在这种情况下,因此,salary列可以存储的值范围是从-99.99到99.99。(实际上 MySQL 在这个列中可以存储的数值可以一直到999.99,因为它没有存储正数的符号)。
译者注:
M 与D 对DECIMAL(M, D) 取值范围的影响
类型说明 取值范围(MySQL 3.23) 取值范围(MySQL = 3.23)
DECIMAL(4, 1) -9.9 到 99.9 -999.9 到 9999.9
DECIMAL(5, 1) -99.9 到 999.9 -9999.9 到 99999.9
DECIMAL(6, 1) -999.9 到 9999.9 -99999.9 到 999999.9
DECIMAL(6, 2) -99.99 到 999.99 -9999.99 到 99999.99
DECIMAL(6, 3) -9.999 到 99.999 -999.999 到 9999.999
# 在MySQL 3.23 及以后的版本中,DECIMAL(M, D) 的取值范围等于早期版本中的DECIMAL(M + 2, D) 的取值范围。注释结束:
在 ANSI/ISO SQL92 中,句法DECIMAL(p)等价于DECIMAL(p,0)。同样的,在执行被允许决定值p的地方,句法DECIMAL等价于DECIMAL(p,0)。MySQL 目前还不支持DECIMAL/NUMERIC数据类型的这些变体形式中的任一种。一般来说这并不是一个严重的问题,通过明确地控制精度和数值范围可以得到这些类型的主要功能益处。
DECIMAL和NUMERIC值是作为字符串存储的,而不是作为二进制浮点数,以便保护这些值的十进制精确度。一个字符用于数值的每一位、小数点(如果scale 0) 和“-”符号(对于负值)。如果scale是 0,DECIMAL和NUMERIC值不包含小数点或小数部分。
DECIMAL和NUMERIC值的最大范围与DOUBLE一致,但是对于一个给定的DECIMAL或NUMERIC列,它的实际范围可制定该列时的precision或scale限制。当这样的列被赋给了小数点的位数超过scale所指定的值时,该将根据scale进行四舍五入。当一个DECIMAL或NUMERIC列被赋与一个大小超过指定(或缺省)的precisionandscale的限止范围时,MySQL 以该列范围的端点值存储该值。
mysql读法:英 [maɪ es kju: el] 美 [maɪ ɛs kju ɛl]
释义:n. 数据库系统(一种免费的跨平台的)
短语
1、JSP MySQL 小型酒吧在线管理系统 ; 网站在线客服系统 ; 二级联动菜单 ; 设计与实现
2、MySQL Chinese MySQL中文增强版
3、mysql server 服务器 ; 启动及停止 ; 数据库
4、MySQL Cluster 数据库集群 ; 概念学习汇总
用法:The default name of the instance is MYSQL.
实例的默认名称是MYSQL。
扩展资料
mysql近义词:database
读法:英 [ˈdeɪtəbeɪs; ˈdɑːtəbeɪs] 美 [ˈdeɪtəbeɪs,ˈdætəbeɪs]
释义:n. 数据库,资料库
短语
1、relational database [计] 关系数据库 ; 相关数据库 ; 关系数据库 ; 关联式资料库
2、Graph Database 图数据库 ; 图形数据库 ; 数据库
3、temporal database 时间数据库 ; 时态数据库 ; 时间资料库
以下命令是不是你想要的?
1、复制表结构及数据到新表
CREATE TABLE 新表SELECT * FROM 旧表
这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable;来删除。
不过这种方法的一个最不好的地方就是新表中没有了旧表的primary key、Extra(auto_increment)等属性。需要自己用alter添加,而且容易搞错。
2、只复制表结构到新表
CREATE TABLE 新表SELECT * FROM 旧表WHERE 1=2
或CREATE TABLE 新表LIKE 旧表
3、复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表SELECT * FROM 旧表
4、复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表
5、可以将表1结构复制到表2
SELECT * INTO 表2 FROM 表1 WHERE 1=2
6、可以将表1内容全部复制到表2
SELECT * INTO 表2 FROM 表1
7、 show create table 旧表;
这样会将旧表的创建命令列出。我们只需要将该命令拷贝出来,更改table的名字,就可以建立一个完全一样的表
8、mysqldump
用mysqldump将表dump出来,改名字后再导回去或者直接在命令行中运行
MySQL中的模式匹配(标准SQL匹配和正则表达式匹配)
1. 使用LIKE和NOT LIKE比较操作符(注意不能使用=或!=);
2. 模式默认是忽略大小写的;
3. 允许使用”_”匹配任何单个字符,”%”匹配任意数目字符(包括零字符);
MySQL还提供象UNIX实用程序的扩展正则表达式模式匹配的格式:
1. 使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,他们是同义词);
2. REGEXP模式匹配与被匹配字符的任何地方匹配,则匹配成功(即只要被匹配字符包含或者可以等于所定义的模式,就匹配成功);
不同于LIKE模式匹配,只有和整个值匹配,才匹配成功(即只有被匹配字符完全和所定义的模式匹配,才匹配成功)
3. REGEXP默认也是不区分大小写,可以使用BINARY关键词强制区分大小写;
如:SELECT * FROM pet WHERE name REGEXP BINARY ‘^B’;
4. 正则表达式为一个表达式,它能够描述一组字符串。REGEXP操作符完成MySQL的扩展正则表达式匹配。REGEXP实现的功能是如果被匹配字符中部分或完全符合所定义的表达式描述的字符,则表示匹配成功。
1)最简单的正则表达式是不含任何特殊字符的正则表达式,如hello。
SELECT * FROM pet WHERE name REGEXP ‘hello’;表示的意思是如果name这列的某一行包含hello这个单词,则匹配就成功了。(注意和LIKE的区别,LIKE要求name这列的某一行必须完全等于hello,才匹配成功)。
2)非平凡的正则表达式,除了含有最简单表达式那些东西,还需要采用特殊的特殊结构,用到的字符,往下看。(因此,通常的正则表达式是普通单词和这些正则表达式字符构成的表达式)
5. 扩展正则表达式的一些字符:
1) ‘.’匹配任何单个字符;
2) […]匹配在方括号内的任何字符,可以使用’-’表示范围,如[a-z],[0-9],而且可以混合[a-dXYZ]表示匹配a,b,c,d,X,Y,Z中的任何一个;(注意使用括号以及’|’的方法也可以达到相同的效果,如(a|b|c)匹配a,b,c中的任何一个);此外可以使用’^’表示否定,如[^a-z]表示不含有a-z中间的任何一个字符;
3) ‘*’表示匹配0个或多个在它前面的字符。如x*表示0个或多个x字符,.*表示匹配任何数量的任何字符;
4) 可以将模式定位必须匹配被匹配字符的开始或结尾,在匹配模式前加”^”:表示匹配从被匹配字符的最开头开始,在匹配模式后加”$”:表示匹配要进行到被匹配字符的最末尾。
5) ‘+’表示匹配1个或多个在它前面的字符。如a+表示1个或多个a字符。
6) ‘?’表示匹配0个或1个在它前面的字符。如a?表示0个或1个a字符。
7) ‘|’如de|abc表示匹配序列de或者abc。注意虽然[…]也可以表示匹配中的某一个,但是每次仅仅能表示单个字符及[a-bXYZ]实际每一次只代表了一个字符。
8) ()括号可以应用在表达式中,使得更容易理解。
9) a{5}表示匹配共5个a,a{2,8}表示匹配2~8个a。
a*可以写成a{0, } 第二个参数省略表示没有上界;a+可以写成a{1,};a?可以写成a{0,1}
更准确地讲,a{n}与a的n个实例准确匹配。a{n,}匹配a的n个或更多实例。a{m,n}匹配a的m~n个实例,包含m和n
m和n必须位于0~RE_DUP_MAX(默认为255)的范围内,包含0和RE_DUP_MAX。如果同时给定了m和n,m必须小于或等于n。
!--[if !supportLineBreakNewLine]--
!--[endif]--
10) 标准类别[:character_class:]:
常用的一些标准类别,一般在[]中使用,由于用在[]中故和[a-z]类似,每一次只能顶替一个字符。(这个有点类似perl里面定义的常用的一些标准类别:\w表示一个单词字符即[a-zA-Z0-9];\W一个非单词字符与\w相反; \d一个数字即[0-9];\D一个非数字;\s一个白空间字符即[\t\f\r\n];\f为换页符;\S一个非白空间字符)
标准的类别名称:
alnum
文字数字字符
alpha
文字字符
blank
空白字符
cntrl
控制字符
digit
数字字符
graph
图形字符
lower
小写文字字符
图形或空格字符
punct
标点字符
space
空格、制表符、新行、和回车
upper
大写文字字符
xdigit
十六进制数字字符
使用实例:
SELECT 'justalnums' REGEXP '[[:alnum:]]+';解释其中[[:alnum:]]由于[:alnum:]表示文字数字字符,它又用在[]中,故[[:alnum:]]代表一个字符它为一个文字或者数字。后面的+号表示1个或多个这样的文字或数字。
上述语句返回1.那是因为justalnums中是由字母组成的。
11)字边界:[[::]]表示开始,[[::]]表示结束:
其定义了一个单词的开始和结束边界,这个单词为字字符,这样[[::]]代表这个字字符前面的部分,[[::]]代表这个字字符后面的部分。字字符为alnum类的字母数字字符或下划线(_);因此[[::]], [[::]]均代表不是字字符的字符,即只要不是字母数字字符以及下划线(_)即可。因此其可以为什么都不是。因此[[::]]word[[::]]能够匹配如下的所有情况:
即word单词本身,word*** 解释***代表不是字母数字以及_的任何字符(如,word-net);***word(如,micorsoft word);***word***(如,this is a word program.)
举例:[[::]]word[[::]]:
SELECT 'a word a' REGEXP '[[::]]word[[::]]'; 结果为真SELECT 'a xword a' REGEXP '[[::]]word[[::]]'; 结果为假 最后注意的注意:要在正则表达式中使用特殊字符,需要在这些字符前面添加2个反斜杠’\’,举例:SELECT '1+2' REGEXP '1+2'; 结果为0SELECT '1+2' REGEXP '1\+2'; 结果为0SELECT '1+2' REGEXP '1\\+2'; 结果为1解释:这是因为MySQL解析程序解析该SQL语句时:首先将字符串’1\\+2’解析为1\+2;然后把1\+2当作正则表达式,由正则表达式库来解析,它代表1+2。因此需要加上2个反斜杠。 不要经常犯加一个反斜杠的错误,加一个反斜杠会莫名其妙:如SELECT '1t2' REGEXP '1\t2';结果会返回1本来的意思是匹配1制表符\t以及2,但是由于只添加了一个\所以,解析以后编程了1t2,所以匹配成功。12)[.characters.]和[=character_class=] 参考资料:
MySQL的模式匹配
MySQL的正则表达式匹配
=========================================================================================================
正则表达式:
正则表达式是为复杂搜索指定模式的强大方式。
^
所匹配的字符串以后面的字符串开头
mysql select "fonfo" REGEXP "^fo$"; - 0(表示不匹配)
mysql select "fofo" REGEXP "^fo"; - 1(表示匹配)
$
所匹配的字符串以前面的字符串结尾
mysql select "fono" REGEXP "^fono$"; - 1(表示匹配)
mysql select "fono" REGEXP "^fo$"; - 0(表示不匹配)
.
匹配任何字符(包括新行)
mysql select "fofo" REGEXP "^f.*"; - 1(表示匹配)
mysql select "fonfo" REGEXP "^f.*"; - 1(表示匹配)
a*
匹配任意多个a(包括空串)
mysql select "Ban" REGEXP "^Ba*n"; - 1(表示匹配)
mysql select "Baaan" REGEXP "^Ba*n"; - 1(表示匹配)
mysql select "Bn" REGEXP "^Ba*n"; - 1(表示匹配)
a+
匹配1个或多个a字符的任何序列。
mysql select "Ban" REGEXP "^Ba+n"; - 1(表示匹配)
mysql select "Bn" REGEXP "^Ba+n"; - 0(表示不匹配)
a?
匹配一个或零个a
mysql select "Bn" REGEXP "^Ba?n"; - 1(表示匹配)
mysql select "Ban" REGEXP "^Ba?n"; - 1(表示匹配)
mysql select "Baan" REGEXP "^Ba?n"; - 0(表示不匹配)
de|abc
匹配de或abc
mysql select "pi" REGEXP "pi|apa"; - 1(表示匹配)
mysql select "axe" REGEXP "pi|apa"; - 0(表示不匹配)
mysql select "apa" REGEXP "pi|apa"; - 1(表示匹配)
mysql select "apa" REGEXP "^(pi|apa)$"; - 1(表示匹配)
mysql select "pi" REGEXP "^(pi|apa)$"; - 1(表示匹配)
mysql select "pix" REGEXP "^(pi|apa)$"; - 0(表示不匹配)
(abc)*
匹配任意多个abc(包括空串)
mysql select "pi" REGEXP "^(pi)*$"; - 1(表示匹配)
mysql select "pip" REGEXP "^(pi)*$"; - 0(表示不匹配)
mysql select "pipi" REGEXP "^(pi)*$"; - 1(表示匹配)
{1} {2,3}
这是一个更全面的方法,它可以实现前面好几种保留字的功能
a*
可以写成a{0,}
a
可以写成a{1,}
a?
可以写成a{0,1}
在{}内只有一个整型参数i,表示字符只能出现i次;在{}内有一个整型参数i,
后面跟一个“,”,表示字符可以出现i次或i次以上;在{}内只有一个整型参数i,
后面跟一个“,”,再跟一个整型参数j,表示字符只能出现i次以上,j次以下
(包括i次和j次)。其中的整型参数必须大于等于0,小于等于 RE_DUP_MAX(默认是25
5)。 如果同时给定了m和n,m必须小于或等于n.
[a-dX], [^a-dX]
匹配任何是(或不是,如果使用^的话)a、b、c、d或X的字符。两个其他字符之间的“-”字符构成一个范围,与从第1个字符开始到第2个字符之间的所有字符匹配。例如,[0-9]匹配任何十进制数字 。要想包含文字字符“]”,它必须紧跟在开括号“[”之后。要想包含文字字符“-”,它必须首先或最后写入。对于[]对内未定义任何特殊含义的任何字符,仅与其本身匹配。
mysql select "aXbc" REGEXP "[a-dXYZ]"; - 1(表示匹配)
mysql select "aXbc" REGEXP "^[a-dXYZ]$"; - 0(表示不匹配)
mysql select "aXbc" REGEXP "^[a-dXYZ] $"; - 1(表示匹配)
mysql select "aXbc" REGEXP "^[^a-dXYZ] $"; - 0(表示不匹配)
mysql select "gheis" REGEXP "^[^a-dXYZ] $"; - 1(表示匹配)
mysql select "gheisa" REGEXP "^[^a-dXYZ] $"; - 0(表示不匹配)
[[.characters.]]
表示比较元素的顺序。在括号内的字符顺序是唯一的。但是括号中可以包含通配符,
所以他能匹配更多的字符。举例来说:正则表达式[[.ch.]]*c匹配chchcc的前五个字符
。
[=character_class=]
表示相等的类,可以代替类中其他相等的元素,包括它自己。例如,如果o和( )是
一个相等的类的成员,那么[[=o=]]、[[=( )=]]和[o( )]是完全等价的。
[:character_class:]
在括号里面,在[:和:]中间是字符类的名字,可以代表属于这个类的所有字符。
字符类的名字有: alnum、digit、punct、alpha、graph、space、blank、lower、uppe
r、cntrl、print和xdigit
mysql select "justalnums" REGEXP "[[:alnum:]] "; - 1(表示匹配)
mysql select "!!" REGEXP "[[:alnum:]] "; - 0(表示不匹配)
[[::]]
[[::]]
分别匹配一个单词开头和结尾的空的字符串,这个单词开头和结尾都不是包含在alnum中
的字符也不能是下划线。
mysql select "a word a" REGEXP "[[::]]word[[::]]"; - 1(表示匹配)
mysql select "a xword a" REGEXP "[[::]]word[[::]]"; - 0(表示不匹配)
mysql select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; - 1(表示
匹配)
要想在正则表达式中使用特殊字符的文字实例,应在其前面加上2个反斜杠“\”字符。MySQL解析程序负责解释其中一个,正则表达式库负责解释另一个。例如,要想与包含特殊字符“+”的字符串“1+2”匹配,在下面的正则表达式中,只有最后一个是正确的:
mysql SELECT '1+2' REGEXP '1+2'; - 0
mysql SELECT '1+2' REGEXP '1\+2'; - 0
mysql SELECT '1+2' REGEXP '1\\+2'; - 1
全文检索:
====================================================================================================
在括号里面,在[:和:]中间是字符类的名字,可以代表属于这个类的所有字符。字符类的名字有: alnum、digit、punct、alpha、graph、space、blank、lower、upper、cntrl、print和xdigit
mysql select "justalnums" REGEXP "[[:alnum:]]+"; - 1(表示匹配)
mysql select "!!" REGEXP "[[:alnum:]]+"; - 0(表示不匹配)
[[::]]
[[::]]
分别匹配一个单词开头和结尾的空的字符串,这个单词开头和结尾都不是包含在alnum中的字符也不能是下划线。
mysql select "a word a" REGEXP "[[::]]word[[::]]"; - 1(表示匹配)
mysql select "a xword a" REGEXP "[[::]]word[[::]]"; - 0(表示不匹配)
mysql select "weeknights" REGEXP "^(weeweek)(knightsnights)$"; - 1(表示匹配)