CREATE_ASYMMETRIC_PRIV_KEY(algorithm, {key_len|dh_secret})
使用给定的算法和密钥长度或DH机密创建私钥,并以PEM格式的二进制字符串形式返回密钥。如果密钥生成失败,则结果为 NULL。
支持的algorithm值: 'RSA','DSA', 'DH'
支持的key_len值:最小密钥长度(以位为单位)为1,024。最大密钥长度取决于算法:RSA为16,384,DSA为10,000。
CREATE_ASYMMETRIC_PUB_KEY(algorithm, priv_key_str)
使用给定的算法从给定的私钥派生公钥,并以PEM格式的二进制字符串形式返回该密钥
SET @priv = CREATE_ASYMMETRIC_PRIV_KEY('DSA',2048);
SET @pub = CREATE_ASYMMETRIC_PUB_KEY('DSA',@priv);
选择密钥长度和加密算法时的一些一般注意事项:
专用密钥和公用密钥的加密强度随密钥大小的增加而增加,但是密钥生成的时间也随之增加。
DH密钥的生成比RSA或RSA密钥花费的时间长得多。
非对称加密功能比对称功能慢。如果性能是一个重要因素,并且要经常使用这些功能,那么最好使用对称加密。例如,考虑使用 AES_ENCRYPT()和 AES_DECRYPT()。
ASYMMETRIC_ENCRYPT(algorithm, str, key_str)
使用给定的算法和密钥字符串对字符串进行加密,然后将生成的密文作为二进制字符串返回。如果加密失败,则结果为NULL。
str的长度不能大于key_str长度,以字节为单位
key_str必须是PEM格式的有效密钥字符串。algorithm表示用于创建密钥的加密算法。
ASYMMETRIC_DECRYPT(algorithm, crypt_str, key_str)
使用给定的算法和密钥字符串解密加密的字符串,并以二进制字符串的形式返回结果纯文本。如果解密失败,则结果为 NULL。
key_str必须是PEM格式的有效密钥字符串。为了成功解密,它必须是与ASYMMETRIC_ENCRYPT()生成加密字符串的私钥或公钥字符串相对应的公钥或私钥字符串。algorithm表示用于创建密钥的加密算法
-生成私钥/公钥对
SET @priv = CREATE_ASYMMETRIC_PRIV_KEY('RSA', 1024);
SET @pub = CREATE_ASYMMETRIC_PUB_KEY('RSA', @priv);
-使用私钥加密,使用公钥解密
SET @ciphertext = ASYMMETRIC_ENCRYPT('RSA', 'The quick brown fox', @priv);
SET @plaintext = ASYMMETRIC_DECRYPT('RSA', @ciphertext, @pub);
-使用公钥加密,使用私钥解密
SET @ciphertext = ASYMMETRIC_ENCRYPT('RSA', 'The quick brown fox', @pub);
SET @plaintext = ASYMMETRIC_DECRYPT('RSA', @ciphertext, @priv);
AES_DECRYPT(crypt_str,key_str[,init_vector])
将AES_ENCRYPT加密的字符串使用key_str进行AES解密
AES_ENCRYPT(crypt_str,key_str[,init_vector])
使用密钥字符串key_str对字符串str进行AES加密,然后返回包含加密输出的二进制字符串
AES标准允许各种密钥长度。默认情况下,这些功能使用128位密钥长度实现AES。
-- 修改密钥长度为256
mysql> SET block_encryption_mode = 'aes-256-cbc';
mysql> SET @key_str = SHA2('My secret passphrase',512);
mysql> SET @init_vector = RANDOM_BYTES(16);
mysql> SET @crypt_str = AES_ENCRYPT('text',@key_str,@init_vector);
mysql> SELECT AES_DECRYPT(@crypt_str,@key_str,@init_vector);
CAST(expr AS type)
将任何类型的数据转换为指定的类型,类似CONVERT()
CONVERT(expr, type)
-- 在不同字符集之间转换数据
CONVERT(expr USING transcoding_name)
允许转换的类型:
BINARY[(N)]
CHAR[(N)]
- 产生具有CHAR数据类型的字符串 。如果给出了可选的长度N,则导致强制类型转换最多使用N参数的字符。字符长度小于N的不会出现填充值。
- 如果没有charset_info子句,则CHAR使用默认字符集生成一个字符串。要明确指定字符集,可以使用以下charset_info值:
- CHARACTER SET charset_name:产生具有给定字符集的字符串。
- ASCII:的简写 CHARACTER SET latin1。
- UNICODE:的简写 CHARACTER SET ucs2。
DATE
DATETIME
DECIMAL[(M[,D])]
JSON
NCHAR[(N)]:类似于CHAR,但生成带有国家字符集的字符串,与CHAR不同,NCHAR不允许指定结尾字符集信息。
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
CAST(1 AS char(1));
CONVERT(1 ,char(1));
SELECT CONVERT('abc' USING utf8);
CHAR_LENGTH(str)
返回字符串str的长度,以字符为单位。多字节字符算作单个字符
CHARACTER_LENGTH(str)
返回字符串str的长度,以字符为单位。多字节字符算作单个字符
CHARSET(str)
返回字符串参数的字符集。
COLLATION(str)
返回字符串参数的排序规则。
CONCAT(str1,str2,...)
SELECT CONCAT('m','s','q');
-- 'msq'
连接指定的字符串,任何参数为NULL则结果返回null
CONCAT_WS(separator,str1,str2,...)
/*
mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name');
-> 'First name,Second name,Last Name'
mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
-> 'First name,Last Name'
*/
使用指定字符串separator连接指定的字符串,如果分隔符为null,则结果返回null
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
/*
mysql> SELECT student_name,
GROUP_CONCAT(test_score)
FROM student
GROUP BY student_name;
*/
将多条数据组合为一条数据,如果没有NULL则返回非NULL值,SEPARATOR指定数据间的分隔符,默认为, 如果要清楚则指定为''
FIND_IN_SET(str,strlist)
返回字符串str在由N子字符串组成的strlist字符串列表中的位置(1到N之间的值)。strlist字符串列表是由,字符分隔的子字符串组成的字符串
LCASE(str)
LOWER(str)
根据当前字符集映射将str所有字符更改为小写的字符串
LEFT(str,len)
mysql> SELECT LEFT('foobarbar', 5);
->'fooba'
返回字符串str中最左边的len个字符,任何参数为NULL则返回NULL
RIGHT(str,len)
mysql> SELECT RIGHT('foobarbar', 5);
->'arbar'
返回str字符串中最右边的len个字符,任何参数为NULL则返回NULL
LENGTH(str)
mysql> SELECT LENGTH('text');
-> 4
返回字符串str的长度,以字节为单位。多字节字符计为多个字节。这意味着对于包含五个2字节字符的字符串, LENGTH()返回 10,而CHAR_LENGTH()返回5。
LOCATE(substr,str), LOCATE(substr,str,pos)
第一种语法返回子串substr在str中第一次出现的位置。
第二种语法返回子字符串substr在str中第一次出现的位置,从position开始。如果substr不在str中返回0,则返回str。如果substr或者str是NULL则返回NULL。
LPAD(str,len,padstr)
mysql> SELECT LPAD('hi',4,'??');
-> '??hi'
mysql> SELECT LPAD('hi',1,'??');
-> 'h'
返回字符串str,左侧填充字符串padstr到长度len字符。如果str大于len,则返回值将缩短为个len字符。
LTRIM(str)
mysql> SELECT LTRIM(' barbar');
->"barbar"
删除字符串str的左侧前导空格字符
RTRIM(str)
删除字符串str的尾空格字符
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str)
TRIM([remstr FROM] str)
mysql> SELECT TRIM(' bar ');
->"bar"
mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
->"barxxx"
mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
->"bar"
mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
->'barx'
删除str所有remstr前缀或后缀的字符串。如果未指定BOTH, LEADING或TRAILING,则假定为BOTH。remstr是可选的,如果未指定,则删除空格。
LOAD_FILE(file_name)
读取文件并以字符串形式返回文件内容。要使用此功能,文件必须位于服务器主机上,必须指定文件的完整路径名,并且必须具有FILE特权。该文件必须全部可读,并且其大小小于 max_allowed_packet字节。如果secure_file_priv系统变量设置为非空目录名称,则要加载的文件必须位于该目录中。如果由于不满足上述条件之一而导致文件不存在或无法读取,则该函数返回NULL。
SPACE(N)
返回由N个空格字符组成的字符串
SUBSTR(str,pos)
SUBSTR(str FROM pos)
SUBSTR(str,pos,len)
SUBSTR(str FROM pos FOR len)
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
不带len参数的形式:从string中返回一个从pos开始的子字符串str
带len参数的:从字符串pos位置开始,返回一个长len的子字符串字符str。
使用的表单FROM是标准SQL语法。
可以对pos使用负值。在这种情况下,子字符串的开头是字符串从pos起始的字符。pos负值可用于此函数的任何形式。pos值为0返回空字符串。
对于所有形式的SUBSTRING(),从中提取子字符串的字符串中第一个字符的位置都应计为1。
SUBSTRING_INDEX(str,delim,count)
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
->'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
->"mysql.com"
返回出现定界符delim之前的指定count数的字符串。
如果count为正,则从定界符左侧开始计数,如果为负,则从定界符右侧开始计数,区分大小写
UPPER(str)
根据当前字符集映射将str所有字符更改为大写的字符串
REPEAT(str,count)
由count数量的str组成字符串,如果count小于1,则返回一个空字符串。如果str或count有NULL返回NULL。
REPLACE(str,from_str,to_str)
替换str中的from_str为to_str。执行匹配的from_str区分大小写
REVERSE(str)
颠倒字符串str的顺序
HEX(str)
HEX(N)
mysql> SELECT X'616263', HEX('abc'), UNHEX(HEX('abc'));
-> 'abc', 616263, 'abc'
mysql> SELECT HEX(255), CONV(HEX(255),16,10);
-> 'FF', 255
对于字符串参数str, HEX()返回str的十六进制字符串表示,其中str中的每个字符的每个字节被转换为两个十六进制数字。(因此多字节字符会超过两个数字。)与此操作相反的是UNHEX()函数。
对于数字参数N, HEX()返回作为longlong(BIGINT)数字处理的N值的十六进制字符串表示。它等价于CONV(N,10,16),此操作的逆操作由CONV(HEX(N),16,10)执行
UNHEX(str)
mysql> SELECT UNHEX(HEX('string'));
-> 'string'
mysql> SELECT HEX(UNHEX('1267'));
-> '1267'
将字符串参数str中的每对字符解释为十六进制数,并将其转换为该数字所表示的字节。返回值是一个二进制字符串。
参数字符串中的字符必须是合法的十六进制数字:'0'...'9','A'...'F','a'...'f'。如果参数包含任何非十六进制数字,结果为NULL
如果UNHEX()的参数是一个二进制列,则可能出现空结果,因为值在存储时被填充为0x00字节,但在检索时这些字节不会被剥离。
例如,'41'作为'41'存储在CHAR(3)列中,检索为'41'(去掉了末尾的填充空间),因此列值的UNHEX()返回X'41'。相比之下,'41'作为'41\0'存储在二进制(3)列中,并作为'41\0'检索(尾部衬垫0x00字节未被删除)。'\0'不是合法的十六进制数字,因此列值的UNHEX()返回NULL。
对于数值参数N, UNHEX()不会执行HEX(N)的倒数。使用CONV(HEX(N), 16,10)。
CONV(N,from_base,to_base)
mysql> SELECT CONV('6E',18,8);
-> '172'
mysql> SELECT CONV(-17,10,-18);
-> '-H'
mysql> SELECT CONV(10+'10'+'10'+X'0a',10,10);
-> '40'
在不同的数字基之间转换数字。返回数字N的字符串表示形式,由base from_base转换为base to_base。如果任何参数为NULL,则返回NULL。参数N被解释为整数,但也可以指定为整数或字符串。最小的底数是2,最大的底数是36。如果from_base是负数,则N被视为有符号数。否则,N被视为无符号。CONV()具有64位精度。