MySQL Cookbook读书笔记第5章

1,字符串属性


查看系统拥有那些字符集:

若需要来自多种语言存放到同一列中,会考虑Unicode字符集(utf8或ucs2),只有它能表示多语言的字符

有些字符集支持多字节,有些只包含单字节,判断是否支持多字节的方法是对比Length()h和char_length函数的返回值来判定字符串中是否有多字节。例如使用ucs2的字节长度为6,字符数目为3.

另外虽然Unicode字符集utf8包含多字节字符,但是一个具体的字符串有可能只包含单字节字

非二进制字符串另一特征是collation,决定字符集中字符排序的次序。

名称以ci,cs或bin结尾的collation分别是大小写不敏感,大小写敏感和二进制的。

Collation是如何影响排序的:

大小写不敏感(AAA,aaa和bbb,BBB相对次序不同):

大小写敏感:

二进制collation:

2,选择字符串的数据类型


当binary和char数据类型的列值中较短时,会被填满以达到要求的长度,填充值是0x00

而varbinary,varchar和blob,text类型,不需要添加或者去除填充值:

如果需要存储utf8(Unicode)和sjis(Japanese)字符串,可以以如下的方式来定义:

create table mytb1(

utf8data varchar(100) character set utf8 collation utf8_danish_ci,

sjisdata varchar(100) character set sjis collation sjis_japanese_ci

);

3,正确设置客户端连接的字符集

a,更改选项配置文件:

[mysql]

default-character-set=utf8

b,建立连接后执行set names语句

set names utf8

指定连接的collation:

set names ‘utf8’ collate ‘utf8-general_cl’

c,编程接口提供它们自己的方法来设置字符集

4,检查一个字符串的字符集或字符排序

使用charset()和collation()函数。

当配置变化时,从当前配置中获取字符集和collation属性也会发生变化。

5,改变字符串的字符集和字符排序

使用convert()函数改变字符串的字符集

使用collate操作符改变字符串的collation

需要同时改变字符串的字符集和collation,则首先使用convert来更改字符集然后使用collate操作符来更改排序

6,更改字符串字母的大小写

使用upper()和lower():

若只更改字符串str的第一个字符为大写,其他部分保持不变:

concat(upper(left(str,1),mid(str,2)))

为防止多次输入冗长表达式,可以定义一个函数:

更改大小写出现错误的情况:

当这两个函数失效时,通常是因为需要转换的是二进制串,在MySQL4.1之后,二进制串无法进行大小写转换,因为没有默认的字符集,而此时要想进行转换,必须先将字符串转换为使用字符集,然后对其使用大小写转换。

7,MySQL进行模式匹配

MySQL提供两种模式匹配的方法:基于SQL模式和基于正则表达式

a,使用SQL模式

SQL模式使用操作符like和not
like来匹配字符串和模式串,通常使用两个匹配符:_用来匹配任意一个字符,%用来匹配任意一个字符串(包括空串)。

not like用来匹配和like相反的模式匹配过程。

b,使用正则表达式进行模式匹配

使用REGEXP操作符和正则表达式,下图为常用的模式字符:

如,以特定子串开头:

以特定子串结尾:

含有特定子串:

特定子串出现在某一位置(开头数第三个位置):

使用正则表达式还可以实现很多MySQL模式不具有的功能如匹配某一字符集和的任一字符,MySQL也支持使用POSIX字符集定义正则表达式:

MySQL和vi,linux中的正则表达式基本一致,需要好好学习,上次去中国电信游戏的时候笔试当中就有使用正则表达式匹配邮件格式的题目所以这方面得多花下时间。

定义选择性匹配:

匹配以aeiou开头或者以er结尾的name字符串:

匹配完全由数字组成或者完全由字母组成的字符串:

可以发现结果并不正确,因为优先级的关系匹配的是以数字开头或者以字符结尾的字符串。需要使用括号,将匹配选项归为一组:

模式匹配中的大小写敏感问题同样是更改字符集(非二进制)和collation来匹配是否是敏感。一般collation以ci结尾是大小写不敏感,cs结尾的是大小写敏感。

8,分割或者串联字符串

使用substring-extraction函数取得子串,使用concat()函数串联字符串

常用的substring-extraction函数包括left()函数,right()函数和mid()函数。

substring()函数从指定为开始向右返回整个子串,如果mid()省略第三个参数,其执行结果与substring()相同/

substring_index(str,c,n)返回str中任意指定字符左侧或右侧的整个子串,str左侧查找字符c第n次出现的位置,并且返回该位置左侧的整个子串,如果n为负数,则为右侧相同处理。

使用concat()函数,将字符串串联:

9,查询子串

如何确定一个字符串中是否含有某个子串? locate()函数返回子串在字符串中第一次出现的位置。第三个参数指定查找开始位置。

locate()同样也需要collation的支持来判断是否大小写敏感

10,使用FULLTEXT查询

如何对大量文本进行查询?使用FULLTEXT索引

当数据量较大时,使用模式匹配进行查询虽然也能得到结构,但是效率会很低,也可以使用模式匹配从多个列中查询相同的字符串,但是效率一样不高。

对于大量文本或者多列,可以使用fulltext代替模式匹配。要使用fulltext查询,首先要给表加上fulltext索引,然后使用match操作符查询作为索引的列。fulltext可以作用于MyISAM表中的非二进制类型字符串

a,创建表kjv

b,从已经处理的txt文件中,导入数据到表kjv中

c,使用fulltext索引来准备使用fulltext检索

d,如想知道kjv.txt中某个名字出现多少次,那么只需要使用match()函数来指定索引,并使用against()函数来定义要查询的文本

或者查询细节:

如果在标准查询中频繁地包含其他一些非fulltext的列,可以通过在这些列加上规则的索引来提高相关的查询性能

如更改:alter table kjv add index (bnum), add index (cnum), add index (vnum);

如想使用fulltext同时对多列进行查询,则

alter table tbl_name add fulltext (col1, col2, col3)

查询时, select …from tbl_name where match(col1, col2, col3) against(‘search
string’);

11,用短语进行fulltext查询

在类似于kjv文本中比如“God”这些文本很重要,但是如果在kjv表中针对这几个单词进行fulltext查询,会发现查询不到

原因是索引引擎会会略太常见的词(即一般以上的行中出现的词),要想查询此时短语需要使用SQL模式匹配统计包含这两个单词的行数

或者修改配置文件中ft_min_word_len的值来更改。

使用boolean来搜索单词

当使用如下查询时,会查询含有名字David或Goliath的行:

而我们想查询的是同时含有这两个名字的行,可以如下解决:使用and联合查询条件:

另一种更方便的方法是使用boolean模式:

+表示符合某些词,-表示排除某些词,*充当通配符

boolean模式中使用双引号把词组括起来,可以支持词组搜索

MySQL Cookbook读书笔记第5章,布布扣,bubuko.com

时间: 2024-10-23 10:49:47

MySQL Cookbook读书笔记第5章的相关文章

MySQL Cookbook读书笔记第三章

1,查询指定列/从指定列中查询 若需要指定每一列在查询结果中出现的先后顺序,可以在select语句中指定(dstuser在dsthost之后): 查询显示用户所关注的列: 2,指定查询行 使用where关键字可以查询符合条件限制的数据例如:查找srchost为venus或者srchost以s开头的行记录: 使用操作符like进行模式匹配,其中%表示通配符,代表一个差多为任意值的字符串. where使用操作符and可以查询多个条件: 条件并集: 3,格式化显示查询结果 当查询语句中没有重命名列名,

MySQL cookbook读书笔记第六章

1,修改MySQL中的日期的格式 在显示一个日期值时,如果没有特别指定,MySQL按照ISO格式显示日期即(CCYY-MM0DD).如果不希望按照MySQL的默认格式输出时间和日期值,可以使用date_format()或者time_format()函数按照用户期望的格式重写日期或者时间值 date_format(),time_format()和str_to_date()三个函数都接受格式化串作为参数: 2,设置客户端时区 如果客户端和服务器处在不同的时区,那么客户端在服务器上保存timestam

MySQL Cookbook学习笔记第四章

1,克隆表(创建一个恰好与某个已有表结构一致的表) create table - like克隆表结构:使用insert into - select语句克隆部分或者全部表数据 2,将查询结果保存到表中 a,使用insert into...select将语句查询结果插入表中,若表不存在需要使用create table -select 语句为查询结果新建一张表. insert into dst_tb1(i,s) select val, name from src_tb1 insert into dst

Mysql Cookbook学习笔记第二章

1,使用python链接mysql + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # -*- coding: utf-8 -*- # connect.py --连接到MySQL服务器 import sys import MySQLdb try:     conn = MySQLdb.connect(db = "cookbook",                            host = "localhost"

《高性能MySQL》读书笔记--锁、事务、隔离级别 转

1.锁 为什么需要锁?因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对表中同一行记录进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了锁的概念. 1.1锁的分类 从对数据操作的类型(读\写)分 读锁(共享锁):针对同一块数据,多个读操作可以同时进行而不会互相影响. 写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁. 大多数时候,MySQL锁的内部管理都是透明的. 1.2锁粒度(Lock granula

SQL Server2012 T-SQL基础教程--读书笔记(5-7章)

SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5.1.2 使用参数 5.1.3 嵌套 5.1.4 多个引用 5.2 公用表表达式 5.2.1 分别列别名 5.2.2 使用参数 5.2.3 定义多个CTE 5.2.4 CTE的多次引用 5.2.5 递归CTE 5.3 视图 5.3.1 视图和ORDER BY 子句 5.3.2 视图选项 5.4 内嵌表

《Unix环境高级编程》读书笔记 第7章-进程环境

1. main函数 int main( int argc, char *argv[] ); argc是命令行参数的数目,包括程序名在内 argv是指向参数的各个指针所构成的数组,即指针数组 当内核执行C程序时(使用exec函数),在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址——这是由连接器设置的,而连接器则是由C编译器调用.启动例程从内核取得命令行参数和环境变量值,然后按上述方式调用main函数做好安排. 2. 进程终止 有8种方式使进程终止,其中5种

iOS开发中的那些的约定俗成(1)————《编写高质量iOS与OS X代码的52个有效方法》读书笔记(第一章)

iOS开发中的那些的约定俗成(1) ----<编写高质量iOS与OS X代码的52个有效方法>读书笔记(第一章) 前言 "我要成为一个高产的开发人员.""想要混的好,就得多努力." 写这些东西是因为毕竟看了书,但是看书看过去之后,也许印象不是很深刻,有些东西现在也理解不了,那我就把我理解的,现在就可以用到的东西,简单的写出来就好,让自己今后看到就能明白其中的意思. 还有就是锻炼一下表达,编辑能力,慢慢的提升自己,随时随地的都要有一个锻炼的心. 最后当然就

《高性能MySQL》读书笔记--优化服务器设置

MySQL有大量可以修改的参数--但不应该随便去修改.通常只需要把基本的项配置正确(大部分情况下只有很少一些参数是真正重要的),应该将更多的时间花在schema的优化.索引,以及查询设计上.在正确地配置了MySQL的基本配置项之后,再花力气去修改其它配置项的收益通常就比较小了. 1.创建MySQL配置文件 建议不要使用操作系统的安装包自带的配置文件,最好从头开始创建一个配置文件.(首先要确定MySQL使用了哪个配置文件!) 2.InnoDB缓冲池(Buffer Pool) 有一个流行的经验法则说