|
用于SELECT和WHERE子句的SQL函数
|
|
来源:网络 作者:本站整理 发布时间:2007-06-18
|
|
mysql> SELECT SHA1("abc"); -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1() 在MySQL 4.0.2 中被加入,并可被当做比 MD5() 加密更安全的等价物。SHA() 是 SHA1() 的同义词。
AES_ENCRYPT(string,key_string) AES_DECRYPT(string,key_string) 这些函数允许使用官方的 AES(Advanced Encryption Standardadvanced 先进的密码技术标准) 算法加密/解密数据。加密时使用 128 位长的密钥,但是你可以通过修改源码将其扩展到 256 位。我们选择 128 位是因为它更快一点并且已足够安全了。输入的参数可以是任意长度的。如果任何一个参数是 NULL,这个函数返回值也将是 NULL。 因为 AES 是一个块级的算法,加密不同长度的字符串时会对其进行填充,因而结果字符串的长度也可以通过 16*(trunc(string_length/16)+1) 计算出。 如果 AES_DECRYPT() 发现数据无效或错误的填料,它将返回 NULL。可是,如果输入的数据或密钥是无效的,函数仍然可能返回一个非 NULL 值 (可能是无用的信息)。 通过修改你的 SQL 语句,你可以使用 AES 函数以一个加密的形式存储数据:
INSERT INTO t VALUES (1,AES_ENCRYPT("text","password"));
尽量避免在一个连接上的每个查询中传递密钥,这样可以得到更高的安全性,上述方式可以通过连接时在服务器端存储密钥来完成:
SELECT @password:="my password"; INSERT INTO t VALUES (1,AES_ENCRYPT("text",@password));
AES_ENCRYPT() 和 AES_DECRYPT() 在 MySQL 4.0.2 中被加入,可以被考虑为当前 MySQL 中可用的加解密函数中最密码安全的。
DES_ENCRYPT(string_to_encrypt [, (key_number | key_string) ] ) 使用 Triple-DES 算法以给定的密钥对字符串加密。 注意,只有配置了 MySQL 对 SSL 的支持,这个函数才能正常工作。查看章节 4.3.9 使用安全地连接。 编码密钥以下列各项方法选择: 参数 含义 只有一个参数 des-key-file 中的第一个密钥被使用。 key number des-key-file 中给定的密钥 (0-9) 被使用。 string 给定的 key_string 将被用于加密 string_to_encrypt。 返回字符串是一个二进制字符串,并且第一个字符是 CHAR(128 | key_number)。 128 被加入是为了更加容易地识别一个加密密钥。如果你使用一个字符串密钥,key_number 将是 127。 当发生错误时,这个函数返回 NULL。 返回字符串的长度将为:new_length= org_length + (8-(org_length % 8))+1。 des-key-file 的格式如下:
key_number des_key_string key_number des_key_string
每个 key_number 必须是一个在 0 到 9 范围之内的数字。文件中的行可以是任何次序的。des_key_string 是用于加密消息的字符串。在数字与密钥之间至少要有一个空格。如果你没在 DES_ENCRYPT() 指定任何密钥参数,那么文件中的第一个密钥将被缺省使用。 以 FLUSH DES_KEY_FILE 命令,你可以告诉 MySQL 从密钥文件中读取新的密钥值。这个操作需要你有 Reload_priv 权限。 有一套默认密钥的一个好处就是,它给应用程序一个检查存在的加密列值的方法,而不需要给最终用户解密这些值的权限。
mysql> SELECT customer_address FROM customer_table WHERE crypted_credit_card = DES_ENCRYPT("credit_card_number");
DES_DECRYPT(string_to_decrypt [, key_string]) 解密 DES_ENCRYPT() 加密后的字符串。 注意,只有配置了 MySQL 对 SSL 的支持,这个函数才能正常工作。查看章节 4.3.9 使用安全地连接。 如果 key_string 参数没有给出,DES_DECRYPT() 检查加密字符串的第一个字节,以确定用于加密原始字符串的 DES 密钥数字,然后从 des-key-file 读取密钥用于解密消息。为了能这样工作,该用户必须有 SUPER 权限。 如果将一个 key_string 参数传递给该函数,这个字符串将被作为解密消息的密钥。 如果 string_to_decrypt 看上去不像是一个加密字符串,MySQL 将返回给定的 string_to_decrypt。 当发生错误时,该函数返回 NULL。
LAST_INSERT_ID([expr]) 返回被插入到一个 AUTO_INCREMENT 列中的最后一个自动产生的值。查看章节 8.1.3.130 mysql_insert_id()。
mysql> SELECT LAST_INSERT_ID(); -> 195
最后产生的 ID 是以每个连接为基础在服务器端被维护的。它不可能被其它的客户端连接改变。如果你以一个非特殊值(即一个非 NULL 和非 0 的值)更新其它的 AUTO_INCREMENT,它甚至也不会改变。 如果你在同一时间内以一个插入语句插入了许多记录行,LAST_INSERT_ID() 将返回第一个被插入行的值。这样做的原因是因为,这可能列容易地在其它服务器上再现同一条 INSERT 语句。 如果 expr 被作为一个参数传递给 LAST_INSERT_ID(),那么函数将返回这个参数的值,并且被设置为 LAST_INSERT_ID() 返回的下一个值。这可被用于模拟一个序列: 首先创建一个表:
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);
然后这个表可以被用来以下面的方式产生序列值:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
你也可以不调用 LAST_INSERT_ID() 产生序列,但是以这种方式使用这个函数的作用就是,ID 值是在服务器端叙谈最后的自动产生值被维护的(是多用户安全的)。你可以检索这的新的 ID 值,就好像读取 MySQL 中任何正常的 AUTO_INCREMENT 值一样。举例来说,LAST_INSERT_ID()(无任何参数) 将返回一个新的 ID。C API 函数 mysql_insert_id() 也可以用来得到这个值。 注意,由于 mysql_insert_id() 仅仅只能用于在 INSERT 和 UPDATE 语句的更新之后,所以在执行了其它的 SQL 语句(比如 SELECT 或 SET)之后,你不能够使用 C API 函数检索到 LAST_INSERT_ID(expr) 的值。
FORMAT(X,D) 将数字 X 格式化为一个 '#,###,###.##' 的形式,四舍五入到 D 位小数。如果 D 为 0,返回的结果将没有小数点和小数部分:
mysql> SELECT FORMAT(12332.123456, 4); -> '12,332.1235' mysql> SELECT FORMAT(12332.1,4); -> '12,332.1000' mysql> SELECT FORMAT(12332.2,0); -> '12,332'
VERSION() 以一个字符串形式返回 MySQL 服务器的版本:
mysql> SELECT VERSION(); -> '3.23.13-log'
注意,如果你的版本以 -log 结果,那就意味着日志是被设为可用的。
CONNECTION_ID() 返回当前连接的连接 ID(thread_id)。每个连接均有一个自己唯一的 id:
mysql> SELECT CONNECTION_ID(); -> 1
GET_LOCK(str,timeout) 尝试获得一个由字符串 str 给定名字的锁定与一个 timeout 秒的超时。如果锁定被获得成功,返回 1,如果尝试超时,返回 0,或者一个错误发生(比如内存溢出或线程被 mysqladmin kill 杀死),返回NULL。当你执行 RELEASE_LOCK()、执行一个新的 GET_LOCK(),或线程终止时,一个锁定被释放。这个函数可以被用于执行应用程序锁定或模拟记录锁定。它会阻塞其它的客户端用同样的名字的锁定请求;遵从一个给定锁定字符串名的客户端可以使用这个字符串来执行子协作建议的锁定:
mysql> SELECT GET_LOCK("lock1",10); -> 1
(阅读次数:)
共12页: 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 11 [12] 下一页
|
| 上一篇:Linux/Unix下ODBC的安装、配置与编程 下一篇:怎么备份MySQL数据库 |
|
[ 收藏]
[ 推荐]
[ 评论(0条)]
[返回顶部] [打印本页]
[关闭窗口] |
|
|
| |
|
|
|
|