MySQL基础教程12 —— 函数之其他函数
对于比特运算,MySQL使用BIGINT (64比特)算法,因此这些操作符的最大范围是64比特。
|Bitwise OR:
mysql>SELECT 29 | 15;
-> 31
其结果为一个64比特无符号整数。
&Bitwise AND:
mysql>SELECT 29 & 15;
-> 13
其结果为一个64比特无符号整数。
^Bitwise XOR:
mysql>SELECT 1 ^ 1;
-> 0
mysql>SELECT 1 ^ 0;
-> 1
mysql>SELECT 11 ^ 3;
-> 8
结果为一个64比特无符号整数。
<<把一个longlong (BIGINT)数左移两位。
mysql>SELECT 1 << 2;
-> 4
其结果为一个64比特无符号整数。
>>把一个longlong (BIGINT)数右移两位。
mysql>SELECT 4 >> 2;
-> 1
其结果为一个64比特无符号整数。
~反转所有比特。
mysql>SELECT 5 & ~1;
-> 4
其结果为一个64比特无符号整数。
BIT_COUNT(N)返回参数N中所设置的比特数
mysql>SELECT BIT_COUNT(29);
-> 4
2.加密函数本节介绍了加密和加密值。若你想要储存一些由可能包含任意字节值的加密函数返回的结果,使用BLOB列而不是CHAR或VARCHAR列,从而避免由于结尾空格的删除而改变一些数据值的潜在问题。
AES_ENCRYPT(str,key_str) , AES_DECRYPT(crypt_str,key_str)这些函数允许使用官方AES进行加密和数据加密(高级加密标准)算法,即以前人们所熟知的 “Rijndael”。保密关键字的长度为128比特,不过你可以通过改变源而将其延长到256比特。我们选择了128比特的原因是它的速度要快得多,且对于大多数用途而言这个保密程度已经够用。
输入参数可以为任何长度。若任何一个参数为NULL,则函数的结果也是NULL。
因为AES是块级算法,使用填充将不均衡长度字符串编码,这样结果字符串的长度的算法为16 * (trunc(string_length/ 16) + 1)。
若AES_DECRYPT()检测到无效数据或不正确填充,它会返回NULL。然而,若输入的资料或密码无效时,AES_DECRYPT()有可能返回一个非NULL值(可能为无用信息)。
你可以通过修改你的问询,从而使用AES函数以加密形式来存储数据:
INSERT INTO t VALUES (1,AES_ENCRYPT(’text’,’password’));
AES_ENCRYPT()和AES_DECRYPT()可以被看作MySQL中普遍通用的密码最安全的加密函数。
DECODE(crypt_str,pass_str)使用pass_str作为密码,解密加密字符串crypt_str,crypt_str应该是由ENCODE()返回的字符串。
ENCODE(str,pass_str)使用pass_str作为密码,解密str。 使用DECODE()解密结果。
结果是一个和str长度相同的二进制字符串。若你想要将其保留在一个列中,可使用BLOB列类型。
DES_DECRYPT(crypt_str[,key_str])使用DES_ENCRYPT()加密一个字符串。若出现错误,这个函数会返回NULL。
注意,这个函数只有当MySQL在SSL的支持下配置完毕时才会运作。
假如没有给定key_str参数, DES_DECRYPT()会首先检查加密字符串的第一个字节, 从而确定用来加密原始字符串的DES密码关键字数字,之后从DES关键字文件中读取关键字从而解密信息。为使其运行,用户必须享有SUPER特权。可以选择--des-key-file服务器指定关键字文件。
假如你向这个函数传递一个key_str参数,该字符串被用作解密信息的关键字。
若crypt_str参数看起来不是一个加密字符串,MySQL会返回给定的crypt_str。
DES_ENCRYPT(str[,(key_num|key_str)])用Triple-DES算法给出的关键字加密字符串。若出现错误,这个函数会返回NULL。
注意,这个函数只有当MySQL在SSL的支持下配置完毕后才会运行。
使用的加密关键字的选择基于第二个到DES_ENCRYPT()的参数,假如给定:
参数说明无参数使用来自DES关键字文件的第一个关键字。key_num使用DES关键字文件给出的关键字数字(0-9)。key_str使用给出的关键字字符串为str加密。选择--des-key-file服务器指定关键字文件。
返回字符串是一个二进制字符串,其中第一个字符为CHAR(128 | key_num)。
加上128使得识别加密关键字更加容易。若你使用一个字符串关键字,则key_num为127。
结果的字符串长度为new_len=orig_len+ (8-(orig_len% 8))+1。
DES关键字文件中的每一行都具有如下格式:
key_numdes_key_str
每个key_num必须是一个从0到0范围内的数字。文件中行的排列顺序是任意的。des_key_str是用来加密信息的字符串。在数字和关键字之间应该至少有一个空格。若你未指定任何到DES_ENCRYPT()的关键字参数,则第一个关键字为默认的使用关键字。
使用FLUSH DES_KEY_FILE语句,你可以让MySQL从关键字文件读取新的关键字值。这要求你享有RELOAD特权。
拥有一套默认关键字的一个好处就是它向应用程序提供了一个检验加密列值的方式,而无须向最终用户提供解密这些值的权力。
mysql>SELECT customer_address FROM customer_table
> WHERE crypted_credit_card = DES_ENCRYPT(’credit_card_number’);
ENCRYPT(str[,salt])使用Unix crypt()系统调用加密str。salt参数应为一个至少包含2个字符的字符串。若没有给出salt参数,则使用任意值。
mysql>SELECT ENCRYPT(’hello’);
-> ’VxuFAJXVARROc’
至少在一些系统中,ENCRYPT()除了str的前八位字符之外会忽略所有内容。这个行为由下划线的crypt()系统调用的执行所决定。
假如crypt()在你的系统中不可用(正如在Windows系统), ENCRYPT()则会始终返回NULL。鉴于这个原因,我们向你推荐使用MD5()或SHA1()来代替,因为这两个函数适合所有的平台。
MD5(str)为字符串算出一个MD5 128比特检查和。该值以32位十六进制数字的二进制字符串的形式返回,若参数为NULL则会返回NULL。例如,返回值可被用作散列关键字。
mysql>SELECT MD5(’testing’);
-> ’ae2b1fca515949e5d54fb22b8ed95575’
这是'RSA Data Security, Inc. MD5 Message-Digest Algorithm.'
假如你想要将这个值转化为大写字母,参见“Cast函数和操作符”中BINARY操作符项中给出的二进制字符串转换。
OLD_PASSWORD(str)当PASSWORD()的执行变为改善安全性时,OLD_PASSWORD()会被添加到MySQL。OLD_PASSWORD()返回从前的PASSWORD()执行值( 4.1之前),同时允许你为任何4.1之前的需要连接到你的5.1版本MySQL服务器前客户端设置密码,从而不至于将它们切断。
PASSWORD(str)从原文密码str计算并返回密码字符串,当参数为NULL时返回NULL。这个函数用于用户授权表的Password列中的加密MySQL密码存储
mysql>SELECT PASSWORD(’badpwd’);
-> ’7f84554057dd964b’
PASSWORD()加密是单向的(不可逆)。
PASSWORD()执行密码加密与Unix密码被加密的方式不同。请参见ENCRYPT()。
注释: PASSWORD()函数在MySQL服务器中的鉴定系统使用;你不应将它用在你个人的应用程序中。为达到同样目的,可使用MD5()或SHA1()代替。更多关于在您的应用程序中处理密码及安全鉴定的信息见RFC 2195
SHA1(str) SHA(str)为字符串算出一个SHA1 160比特检查和,如RFC 3174 (安全散列算法)中所述。该值被作为40位十六进制数字返回,而当参数为NULL时则返回NULL。这个函数的一个可能的用处就在于其作为散列关键字。你也可以将其作为存储密码的密码安全函数使用。
mysql>SELECT SHA1(’abc’);
-> ’a9993e364706816aba3e25717850c26c9cd0d89d’
SHA1()可以被视为一个密码更加安全的函数,相当于 MD5()。SHA()和SHA1()具有相同的意义。
3.信息函数BENCHMARK(count,expr)BENCHMARK()函数重复count次执行表达式expr。 它可以被用于计算 MySQL处理表达式的速度。结果值通常为0。另一种用处来自mysql客户端内部,能够报告问询执行的次数:
mysql> SELECT BENCHMARK(1000000,ENCODE(’hello’,’goodbye’));
+----------------------------------------------+| BENCHMARK(1000000,ENCODE(’hello’,’goodbye’)) |+----------------------------------------------+| 0 |+----------------------------------------------+1 row in set (4.74 sec)
此处报告的时间是客户端上的共用时间,而不是服务器端上的CPU时间。建议执行多遍BENCHMARK(),并解释与服务器机器负荷程度有关的结果。
·CHARSET(str)
返回字符串自变量的字符集。
mysql> SELECT CHARSET(’abc’); -> ’latin1’mysql> SELECT CHARSET(CONVERT(’abc’ USING utf8)); -> ’utf8’mysql> SELECT CHARSET(USER()); -> ’utf8’
·COERCIBILITY(str)
返回字符串自变量的整序可压缩性值。
mysql> SELECT COERCIBILITY(’abc’ COLLATE latin1_swedish_ci); -> 0mysql> SELECT COERCIBILITY(USER()); -> 3mysql> SELECT COERCIBILITY(’abc’); -> 4
返回值具有如下意义:
可压缩性意义举例0明确排序带有COLLATE子句的值1无排序不同排序的字符串连接2明确排序列值3系统常量USER()返回值4可压缩文字字符串5可忽略NULL得来的NULL或一个表达式下方值得优先级较高。
COLLATION(str)返回惠字符串参数的排序方式。
mysql>SELECT COLLATION(’abc’);
-> ’latin1_swedish_ci’
mysql>SELECT COLLATION(_utf8’abc’);
-> ’utf8_general_ci’
CONNECTION_ID()返回对于连接的连接ID (线程ID)。每个连接都有各自的唯一ID。
mysql>SELECT CONNECTION_ID();
-> 23786
CURRENT_USER, CURRENT_USER()返回当前话路被验证的用户名和主机名组合。这个值符合确定你的存取权限的MySQL账户。在被指定SQL SECURITY DEFINER特征的存储程序内,CURRENT_USER()返回程序的创建者。
CURRENT_USER()的值可以和USER()的值有所不同。
mysql>SELECT USER();
-> ’davida@localhost’
mysql>SELECT * FROM mysql.user;
ERROR 1044: Access denied for user ’’@’localhost’ to
database ’mysql’
mysql>SELECT CURRENT_USER();
-> ’@localhost’
这个例子解释了虽然客户端指定了一个davida用户名(正如USER()函数的值所指示的),服务器却使用一个匿名的用户账户确认该客户端(见CURRENT_USER()值得空用户名部分)。这种情况发生的一个原因是One在向davida的授权列表中没有足够的账户。
CURRENT_USER()返回的字符串使用utf8字符集。
DATABASE()返回使用utf8字符集的默认(当前)数据库名。在存储程序里,默认数据库是同该程序向关联的数据库,但并不一定与调用语境的默认数据库相同。
mysql>SELECT DATABASE();
-> ’test’
若没有默认数据库, DATABASE()返回NULL。
FOUND_ROWS()A SELECT语句可能包括一个LIMIT子句,用来限制服务器返回客户端的行数。在有些情况下,需要不用再次运行该语句而得知在没有LIMIT时到底该语句返回了多少行。为了知道这个行数,包括在SELECT语句中选择 SQL_CALC_FOUND_ROWS,随后调用FOUND_ROWS():
mysql>SELECT SQL_CALC_FOUND_ROWS * FROMtbl_name
->WHERE id > 100 LIMIT 10;
mysql>SELECT FOUND_ROWS();
第二个SELECT返回一个数字,指示了在没有LIMIT子句的情况下,第一个SELECT返回了多少行(若上述的SELECT语句不包括SQL_CALC_FOUND_ROWS选项,则使用LIMIT和不使用时,FOUND_ROWS()可能会返回不同的结果)。
通过FOUND_ROWS()的有效行数是瞬时的,并且不用于越过SELECT SQL_CALC_FOUND_ROWS语句后面的语句。若你需要稍候参阅这个值,那么将其保存:
mysql>SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
mysql>SET @rows = FOUND_ROWS();
假如你正在使用SELECT SQL_CALC_FOUND_ROWS, MySQL必须计算出在全部结果集合中有所少行。然而, 这比不用LIMIT而再次运行问询要快,原因是结果集合不需要被送至客户端。
SQL_CALC_FOUND_ROWS和FOUND_ROWS()在当你希望限制一个问询返回的行数时很有用,同时还能不需要再次运行问询而确定全部结果集合中的行数。一个例子就是提供页式显示的Web脚本,该显示包含显示搜索结果其它部分的页的连接。使用FOUND_ROWS()使你确定剩下的结果需要多少其它的页。
SQL_CALC_FOUND_ROWS和FOUND_ROWS()的应用对于UNION问询比对于简单SELECT语句更为复杂,原因是在UNION中,LIMIT可能会出现在多个位置。它可能适用于UNION中的个人SELECT语句,或是总体上到UNION结果的全程。
SQL_CALC_FOUND_ROWS对于UNION的意向是它应该不需要全程LIMIT而返回应返回的行数。SQL_CALC_FOUND_ROWS和UNION一同使用的条件是:
SQL_CALC_FOUND_ROWS关键词必须出现在UNION的第一个SELECT中。FOUND_ROWS()的值只有在使用UNION ALL时才是精确的。若使用不带ALL的UNION,则会发生两次删除, 而 FOUND_ROWS()的指只需近似的。假若UNION中没有出现 LIMIT,则SQL_CALC_FOUND_ROWS被忽略,返回临时表中的创建的用来处理UNION的行数。LAST_INSERT_ID() LAST_INSERT_ID(expr)自动返回最后一个INSERT或UPDATE问询为AUTO_INCREMENT列设置的第一个发生的值。
mysql>SELECT LAST_INSERT_ID();
-> 195
产生的ID每次连接后保存在服务器中。这意味着函数向一个给定客户端返回的值是该客户端产生对影响AUTO_INCREMENT列的最新语句第一个AUTO_INCREMENT值的。这个值不能被其它客户端影响,即使它们产生它们自己的AUTO_INCREMENT值。这个行为保证了你能够找回自己的ID而不用担心其它客户端的活动,而且不需要加锁或处理。
假如你使用一个非“magic”值来更新某一行的AUTO_INCREMENT列,则LAST_INSERT_ID()的值不会变化(换言之,一个不是NULL也不是0的值)。
重点:假如你使用单INSERT语句插入多个行, LAST_INSERT_ID()只返回插入的第一行产生的值。其原因是这使依靠其它服务器复制同样的INSERT语句变得简单。
例如:
mysql> USE test;
Database changedmysql> CREATE TABLE t ( -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -> name VARCHAR(10) NOT NULL -> );Query OK, 0 rows affected (0.09 sec)mysql> INSERT INTO t VALUES (NULL, ’Bob’);Query OK, 1 row affected (0.01 sec)mysql> SELECT * FROM t;+----+------+| id | name |+----+------+| 1 | Bob |+----+------+1 row in set (0.01 sec)mysql> SELECT LAST_INSERT_ID();+------------------+| LAST_INSERT_ID() |+------------------+| 1 |+------------------+1 row in set (0.00 sec)mysql> INSERT INTO t VALUES -> (NULL, ’Mary’), (NULL, ’Jane’), (NULL, ’Lisa’);Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0mysql> SELECT * FROM t;+----+------+| id | name |+----+------+| 1 | Bob || 2 | Mary || 3 | Jane || 4 | Lisa |+----+------+4 rows in set (0.01 sec)mysql> SELECT LAST_INSERT_ID();+------------------+| LAST_INSERT_ID() |+------------------+| 2 |+------------------+1 row in set (0.00 sec)
虽然第二个问询将3个新行插入t,对这些行的第一行产生的ID为2,这也是LAST_INSERT_ID()返回的值。
假如你使用INSERT IGNORE而记录被忽略,则AUTO_INCREMENT计数器不会增量,而LAST_INSERT_ID()返回0,这反映出没有插入任何记录。
若给出作为到LAST_INSERT_ID()的参数expr,则参数的值被函数返回,并作为被LAST_INSERT_ID()返回的下一个值而被记忆。这可用于模拟序列:
创建一个表,用来控制顺序计数器并使其初始化:omysql>CREATE TABLE sequence (id INT NOT NULL);
omysql>INSERT INTO sequence VALUES (0);
使用该表产生这样的序列数 :omysql>UPDATE sequence SET id=LAST_INSERT_ID(id+1);
omysql>SELECT LAST_INSERT_ID();
UPDATE语句会增加顺序计数器并引发向LAST_INSERT_ID()的下一次调用,用来返回升级后的值。SELECT语句会检索这个值。 mysql_insert_id() C API函数也可用于获取这个值。
你可以不用调用LAST_INSERT_ID()而产生序列,但这样使用这个函数的效用在于ID值被保存在服务器中,作为自动产生的值。它适用于多个用户,原因是多个用户均可使用UPDATE语句并用SELECT语句(或mysql_insert_id()),得到他们自己的序列值,而不会影响其它产生他们自己的序列值的客户端或被其它产生他们自己的序列值的客户端所影响。
注意,mysql_insert_id()仅会在INSERT和UPDATE语句后面被升级, 因此你不能在执行了其它诸如SELECT或SET这样的SQL语句后使用C API函数来找回LAST_INSERT_ID(expr)对应的值。
ROW_COUNT()ROW_COUNT()返回被前面语句升级的、插入的或删除的行数。 这个行数和mysql客户端显示的行数及mysql_affected_rows() C API函数返回的值相同。
mysql>INSERT INTO t VALUES(1),(2),(3);
问询完成,表中有3行(0.00秒)
记录: 3重复: 0警告: 0
mysql>SELECT ROW_COUNT();+-------------+| ROW_COUNT() |+-------------+| 3 |+-------------+
表中有1行(0.00秒)
mysql>DELETE FROM t WHERE i IN(1,2);
问询完成,找到2行(0.00秒)
mysql>SELECT ROW_COUNT();
+-------------+| ROW_COUNT() |+-------------+| 2 |+-------------+
表中有1行(0.00秒)
SCHEMA()这个函数和DATABASE()具有相同的意义。
SESSION_USER()SESSION_USER()和USER()具有相同的意义。
SYSTEM_USER()SYSTEM_USER()合USER()具有相同的意义。
USER()返回当前MySQL用户名和机主名/
mysql>SELECT USER();
-> ’davida@localhost’
这个值指示了你指定的连接服务器时的用户名,及你所连接的客户主机。这个值可以和CURRENT_USER()的值不同。
你可以这样提取用户名部分:
mysql>SELECT SUBSTRING_INDEX(USER(),’@’,1);
-> ’davida’
由于USER()返回一个utf8字符集中的值,你也应确保’@’字符串文字在该字符集中得到解释:
mysql>SELECT SUBSTRING_INDEX(USER(),_utf8’@’,1);
-> ’davida’
VERSION()返回指示MySQL服务器版本的字符串。这个字符串使用utf8字符集。
mysql>SELECT VERSION();
-> ’5.1.2-alpha-standard’
注意,假如你的版本字符串以-log结尾,这说明登录已被激活。
4.其他函数DEFAULT(col_name)返回一个表列的默认值。若该列没有默认值则会产生错误。
mysql>UPDATE t SET i = DEFAULT(i)+1 WHERE id < 100;
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’
GET_LOCK(str,timeout)设法使用字符串str给定的名字得到一个锁, 超时为timeout秒。若成功得到锁,则返回1,若操作超时则返回0 (例如,由于另一个客户端已提前封锁了这个名字),若发生错误则返回NULL (诸如缺乏记忆或线程mysqladmin kill被断开)。假如你有一个用GET_LOCK()得到的锁,当你执行RELEASE_LOCK()或你的连接断开(正常或非正常)时,这个锁就会解除。
这个函数可用于执行应用程序锁或模拟记录锁定。名称被锁定在服务器范围内。假如一个名字已经被一个客户端封锁,GET_LOCK()会封锁来自另一个客户端申请封锁同一个名字的任何请求。这使对一个封锁名达成协议的客户端使用这个名字合作执行建议锁。然而要知道它也允许不在一组合作客户端中的一个客户端封锁名字,不论是服役的还是非故意的,这样阻止任何合作中的客户端封锁这个名字。一个减少这种情况发生的办法就是使用数据库特定的或应用程序特定的封锁名。例如,使用db_name.str或app_name.str形式的封锁名。
mysql>SELECT GET_LOCK(’lock1’,10);-> 1
mysql>SELECT IS_FREE_LOCK(’lock2’);-> 1
mysql>SELECT GET_LOCK(’lock2’,10);-> 1
mysql>SELECT RELEASE_LOCK(’lock2’);-> 1
mysql>SELECT RELEASE_LOCK(’lock1’);-> NULL
注意,第二个RELEASE_LOCK()调用返回NULL,原因是锁’lock1’杯第二个GET_LOCK()调用解开。
INET_ATON(expr)给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。地址可以是4或8比特地址。
mysql>SELECT INET_ATON(’209.207.224.40’);
-> 3520061480
产生的数字总是按照网络字节顺序。如上面的例子,数字按照209×2563+ 207×2562+ 224×256 + 40进行计算。
INET_ATON()也能理解短格式IP地址:
mysql>SELECT INET_ATON(’127.0.0.1’), INET_ATON(’127.1’);-> 2130706433, 2130706433
注释:在存储由INET_ATON()产生的值时,推荐你使用INT UNSIGNED列。假如你使用(带符号) INT列,则相应的第一个八位组大于127的IP地址值会被截至 2147483647 (即, INET_ATON(’127.255.255.255’)所返回的值)。
INET_NTOA(expr)给定一个数字网络地址(4或8比特),返回作为字符串的该地址的电地址表示。
mysql>SELECT INET_NTOA(3520061480);-> ’209.207.224.40’
IS_FREE_LOCK(str)检查名为str的锁是否可以使用(换言之,没有被封锁)。若锁可以使用,则返回 1 (没有人在用这个锁),若这个锁正在被使用,则返回0,出现错误则返回NULL (诸如不正确的参数)。
IS_USED_LOCK(str)检查名为str的锁是否正在被使用(换言之,被封锁)。若被封锁,则返回使用该锁的客户端的连接标识符。否则返回NULL。
MASTER_POS_WAIT(log_name,log_pos[,timeout])该函数对于控制主从同步很有用处。它会持续封锁,直到从设备阅读和应用主机记录中所有补充资料到指定的位置。返回值是其为到达指定位置而必须等待的记录事件的数目。若从设备SQL线程没有被启动、从设备主机信息尚未初始化、参数不正确或出现任何错误,则该函数返回NULL。若超时时间被超过,则返回-1。若在MASTER_POS_WAIT()等待期间,从设备SQL线程中止,则该函数返回NULL。若从设备由指定位置通过,则函数会立即返回结果。
假如已经指定了一个超时时间值,当超时时间秒数经过后MASTER_POS_WAIT()会停止等待。超时时间必须大于0;一个为零或为负值的超时时间表示没有超市时间。
NAME_CONST(name,value)返回给定值。 当用来产生一个结果集合列时, NAME_CONST()促使该列使用给定名称。
mysql>SELECT NAME_CONST(’myname’, 14);
+--------+| myname |+--------+| 14 |+--------+
这个函数被添加进MySQL 5.0.12。它只做内部使用。你可能会在mysqlbinlog的书橱中看到这个函数。
RELEASE_LOCK(str)解开被GET_LOCK()获取的,用字符串str所命名的锁。若锁被解开,则返回 1,若改线程尚未创建锁,则返回0 (此时锁没有被解开),若命名的锁不存在,则返回NULL。若该锁从未被对GET_LOCK()的调用获取,或锁已经被提前解开,则该锁不存在。
DO语句和RELEASE_LOCK()同时使用很方便。
SLEEP(duration)睡眠(暂停)时间为duration参数给定的秒数,然后返回0。若SLEEP()被中断,它会返回1。duration或许或包括一个给定的以微秒为单位的分数部分。
UUID()返回一个通用唯一标识符(UUID),其产生的根据是《DCE 1.1:远程过程调用》(附录A) CAE (公共应用软件环境)的说明,该作品于1997年10月由The Open Group出版(文件编号C706,http://www.opengroup.org/public/pubs/catalog/c706.htm).
UUID被设计成一个在时间和空间上都独一无二的数字。2个对UUID()的调用应产生2个不同的值,即使这些调用的执行是在两个互不相连的单独电脑上进行。
UUID是一个由5位十六进制数的字符串表示的128比特数字 ,其格式为 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee:
前3个数字从一个时间戳产生。第4个数字保持暂时唯一性,以防时间戳值失去单一性(例如,由于经济时)。第5个数字是一个IEEE 802节点号,它提供空间唯一性。若后者不可用,则用一个随机数字替换。(例如,由于主机没有以太网卡,或我们不知道怎样在你的操作系统上找到界面的机器地址)。假若这样,空间唯一性就不能得到保证。尽管如此,一个冲突的发生机率还是非常低的。目前,一个界面的MAC地址尽被FreeBSD和Linux考虑到。在其它操作系统中, MySQL使用随机产生的48比特数字。
mysql>SELECT UUID();
-> ’6ccd780c-baba-1026-9564-0040f4311e29’
注意,UUID()不支持复制功能。
VALUES(col_name)在一个INSERT…ON DUPLICATE KEY UPDATE…语句中,你可以在UPDATE子句中使用VALUES(col_name)函数,用来访问来自该语句的INSERT部分的列值。换言之,UPDATE子句中的VALUES(col_name)访问需要被插入的col_name的值,并不会发生重复键冲突。这个函数在多行插入中特别有用。 VALUES()函数只在INSERT ... UPDATE语句中有意义,而在其它情况下只会返回NULL。
mysql>INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
->ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
相关文章: