前言
"<数据库原理及应用>(MySQL版)".以下称为"本书"中3.1.2节内容
引入
数据库常用系统函数的分析.上一篇帖子分析了,数据库函数需要看看能否被C语言函数替代
1.字符串函数
1)计算字符串字符数的函数和字符串长度的函数
语法:
CHAR_LENGTH(str); //计算字符个数
LENGTH(str); //返回字符串字节长度
代码如下(相比起例3-10有一点修改)
SET @name='china';
SELECT CHAR_LENGTH(@name) 字符数,LENGTH(@name) 字符长度;
运行结果
实用性分析:C语言中有计算字符串长度的函数(没有自己写一个也行,问题不大)
2)合并字符串函数
语法:
CONCAT(str1,str2....); //返回连接参数产生的字符串,如果有NULL,返回NULL
代码如下
SELECT CONCAT('MySQL版本:',@@version) 版本信息;
运行结果
实用性分析:C语言中有strcat函数处理字符串连接(两个函数名都有cat).
3)字符串大小写转换函数
在C语言中也有大小写转换函数.
试想他的应用场景:如果数据库中已确定所有该字段的符号是大写或者小写,那么可以在传入的时候先行用C语言函数处理,这种情况下可以不看这个函数,因为在传入之前可以先处理.同理如果返回值全部大写或小写,也可以用C语言处理.
4)删除空格函数
=============================内容分割线↓===================================
以下代码有问题待查
笔者尝试给出几个删除空格函数的C语言定义
1.删除前导空格
/*删除前导空格*/
char* remove_leading_spaces(char* original){
char *tmp=original;
while(*tmp=" "){
tmp++;
original++;
}
while(*tmp!='\0')
*tmp++=*original++;
*tmp='\0';
return tmp;
}
2.删除尾部空格
/*删除尾部空格*/
char* remove_trailing_spaces(char* original){
char *tmp=original;
int length=0;
while(*tmp!='\0'){
length++;
tmp++;
}
while(*tmp=' '){
tmp--;
length--;
}
for(int i=0;i<length;i++)
*tmp++=*original++;
return tmp;
}
不知道什么原因,编译通过了显示结果有问题,所以待查.
以此也说明学了的东西要经常看和使用,不然会生疏.
=============================内容分割线↑===================================
3.删除前导和尾部空格
调用函数1和2即可.
说明:删除空格的应用场景和上面一样,基本上可以不用.
5)取子串函数
本书P76例3-14的改写命令需注意
2.数学函数
包括取绝对值等函数在里面,按照原则来说,用外层宿主语言来处理更好,所以没有什么必要看
3.日期和时间函数
在C语言标准库里有个time.h的头文件,里边也有类似处理系统时间的函数,虽然用得不多(可能有的人都没听说过),但确实可以替代数据库的日期和时间函数.
4.系统信息函数
这些函数由于和MySQL数据库有关,所以在必要的情况下使用.
嵌套SQL的程序模型
在高级语言如C/C++中,使用的是"数据类型(数据结构)+函数定义"建立文件,主程序调用文件里的函数---这一整体思路来编写程序.现在多了数据库的操作.而操作数据库的语言SQL有个特点:就一个执行语句.如何将高级语言的程序思路继续放到引入数据的程序中呢?
外层函数传入参数给语句,语句封装SQL函数(或过程).数据返回到宿主语言的某个数据类型中.
如图所示:
从根本上讲,SQL是要取得数据库的数据,至于取得的数据由SQL语言处理,还是交给宿主语言处理,这是数据库设计者决定的.笔者个人看法是所有的数据处理都由宿主语言处理.因为数据库要考虑多人使用,尽可能占用最小的空间,最大可能提高交互的速度,笔者想到的原因很简单:如果定义了数据库函数,岂不是会让数据库的性能下降?---当然也仅属于个人看法.
小结
数据库常用系统函数的分析,嵌套SQL的程序模型分析