Mysql 字元函式詳解
MySql 所有字串函式函式詳解
ASCII(str)
返回str最左邊第一位字元的ASCII編碼,如果str為空,則返回 0 。如果str為NULL,則返回NULL
-- 只返回a的ASCII編碼
SELECT ASCII('ab')
- 97
SELECT ASCII('a')
- 97
-- 如果是數字,帶不帶引號是一樣的效果
SELECT ASCII(23)
- 50
SELECT ASCII(2)
- 50
SELECT ASCII('2')
- 50
BIN(N)
返回N的二進位制數,N是數字型別,這個函式其實相當於CONV(N,10,2)。如果N是null則返回null,如果N是非數字的字串則會返回0
SELECT BIN(2);
- 10
SELECT CONV(2,10,2);
- 10
SELECT BIN('23');
- 10111
SELECT CONV(23,10,2);
- 10111
SELECT BIN('n');
- 0
BIT_LENGTH(str)
返回str的二進位制長度
SELECT BIT_LENGTH('test');
- 32
SELECT BIT_LENGTH('測');
- 24
SELECT BIT_LENGTH('你好啊');
- 72
CHAR(N,... [USING charset_name])
將所有引數轉換為int型別數字,將數字所代表的字元連線之後返回。null值會被跳過
SELECT CHAR(77,121,83,81,'76');
- 'MySQL'
SELECT CHAR(77,77.3,'77.3');
- 'MMM'
CHAR_LENGTH(str)
返回str的長度,像漢字這樣的多位元組字元將計算為一個長度。
SELECT CHAR_LENGTH('你好啊');
- 3
SELECT CHAR_LENGTH('2個包子');
- 4
CHARACTER_LENGTH(str)
和CHAR_LENGTH(str)是一樣的。
CONCAT(str1,str2,...)
把引數連線起來然後返回,可以有一個或者任意多個引數。如果所有引數都是非二進位制字串,那麼返回結果也是非二進位制字串。反之,如果引數有任意一個二進位制字串,那麼將返回一個二進位制字串。數字型別引數將被轉換為等價的非二進位制字串。如果引數中有任意一個值為NULL,那麼將返回NULL。
SELECT CONCAT('你','好','啊');
- '你好啊'
SELECT CONCAT('你',NULL,'啊');
- NULL
SELECT CONCAT(12.4);
- '12.4'
SELECT CONCAT(12.5,233);
- '12.5233'
帶有引號的字串放在一起會預設呼叫CONCAT函式
SELECT '啊' '哈哈'
- '啊哈哈'
CONCAT_WS(separator,str1,str2,...)
這個函式會用第一個引數separator作為分隔符將剩餘引數連線起來,separator像其他引數一樣可以是任意字元。separator如果是NULL值,將返回NULL
SELECT CONCAT_WS(',','First name','Second name','Last Name');
- 'First name,Second name,Last Name'
SELECT CONCAT_WS(',','你',NULL,'誰');
- '你,誰'
SELECT CONCAT_WS('舅,','大','二','三','');
- '大舅,二舅,三舅,'
SELECT CONCAT_WS(NULL,'First name','Last Name');
- NULL
CONCAT_WS() 不會跳過空字元,比如上面的大舅二舅三舅,但是會跳過NULL值
ELT(N,str1,str2,str3,...)
ELT() 函式會返回其餘引數中第 N 個值:N = 1,返回str1,N = 2 返回 str2.以此類推。
如果 N 大於引數個數或者小於1,,將返回 NULL。ELT函式和FIELD()函式互為補充
SELECT ELT(1,"第一","第二","第三","第四");
- '第一'
SELECT ELT(4,"第一","第二","第三","第四");
- '第四'
SELECT ELT(0,"第一","第二","第三","第四");
- NULL
SELECT ELT(5,"第一","第二","第三","第四");
- NULL
FIELD(str,str1,str2,str3,...)
返回str在其餘引數中的位置,如果在其餘引數中未找到str,則返回 0 。
如果所有的引數都是字元型別,那麼用字元型別進行比較。如果所有引數都是數字型別,那麼用數字型別進行比較。其他情況將用double型別進行比較
如果str為NULL,將返回 0 ,因為NULL不能與其他引數做比較。
FIELD() 函式和ELT()函式互為補充
SELECT FIELD('ll', 'He', 'll', 'o', ',wor', 'ld!');
- 2
SELECT FIELD('沒到', '午', '時', '已', '到');
- 0
EXPORT_SET(bits,on,off[,separator[,number_of_bits]])
在我看來很奇葩的一個函式,老實說不知道有什麼用
這個函式會將第一個值 bits 轉為 number_of_bits 長度的二進位制數。(number_of_bits預設為64)。
從右向左檢測這個二進位制數,如果是 1 則得到一個 on 字串,如果是 0 則得到一個off字串。
將得到的所有結果從左向右用separator連線起來返回。separator預設為 ','
SELECT EXPORT_SET(5,'Y','N',',',4);
- 'Y,N,Y,N'
5轉成4位長度的二進位制是:
0101
對應:
NYNY
倒轉加分隔得到結果:
Y,N,Y,N
FIND_IN_SET(str,strlist)
函式將返回str在strList中的位置,strList 是被 ',' 字元分隔的一串字串。
這個函式太無聊了,看官方文件吧
https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set
SELECT FIND_IN_SET('b','a,b,c,d');
- 2
FORMAT(X,D[,locale])
格式化一個數字,四捨五入至 D 位小數,返回結果是字元型別。
如果 D = 0 。返回結果就沒有小數部分
可選項 local 指定本地化格式,預設為 'en_US',具體可用值可以參考這個文件
https://dev.mysql.com/doc/refman/5.7/en/locale-support.html
mysql> SELECT FORMAT(233.123456, 4);
-> '233.1235'
mysql> SELECT FORMAT(12332.1,4);
-> '12,332.1000'
mysql> SELECT FORMAT(12332.2,0);
-> '12,332'
mysql> SELECT FORMAT(12332.2,2,'de_DE');
-> '12.332,20'
FROM_BASE64(str)
不想翻譯這個
HEX(str), HEX(N)
不想翻譯這個
INSERT(str,pos,len,newstr)
將str第pos位開始len長度的字元替換為newstr,然後返回。
如果str沒有pos位則返回str。
如果有任意一個引數為NULL,則返回NULL
SELECT INSERT('very What?', 6, 100, 'niubility');
- 'very niubility'
SELECT INSERT('中華人民共和國萬歲', 8, 2, '萬萬歲');
- '中華人民共和國萬萬歲'
SELECT INSERT('為中華民族值崛起而讀書', 6, 1, '之');
- '為中華民族之崛起而讀書'
SELECT INSERT('小日本兒', 3, 100, '本本本本本本本本');
- '小日本本本本本本本本'
這個函式是多位元組安全的
POSITION(substr IN str)
POSITION(substr IN str) 和 LOCATE(substr,str)功能是一樣的
INSTR(str,substr)
返回substr在str中出現的第一個字母的位置。這個函式個LOCATE()函式作用是一樣的,只不過引數順序顛倒過來了。
SELECT INSTR('one car come,one car go', 'car');
- 5
SELECT INSTR('two car pengpeng,people die', 'PENGPENG');
- 9
這個函式是多位元組安全的,一般不會區分大小寫,只有任何一個引數為二進位制字元型別時才會。
LOCATE(substr,str), LOCATE(substr,str,pos)
返回substr在str中出現的第一個字母的位置。
如果有pos值,從pos作為開始位置進行計算。
如果substr沒有在str中,則返回0。
如果substr或者str為NULL則返回NULL。
SELECT LOCATE('車來車往', '車');
- 2
SELECT LOCATE('車來車往', '車', 2);
- 3
SELECT LOCATE('兩車相撞,都死了', '你說啥');
- 0
這個函式是多位元組安全的。一般不區分大小寫,只有當某一引數為二進位制型別才會。
LCASE(str)
LCASE()函式個LOWER()函式是一樣的,名字不同而已。
LEFT(str,len)
擷取返回str從左往右len長度的字元。如果任一引數為NULL,則返回NULL。
SELECT LEFT('你這樣做是對的嗎?', 7);
- '你這樣做是對的'
這個函式是多位元組安全的。
LENGTH(str)
返回str的位元組長度。
SELECT LENGTH('text');
- 4
SELECT LENGTH("漢字");
- 6
因為是返回位元組長度,utf8編碼下一個漢字會佔用三個位元組,所以SELECT LENGTH("漢字")返回的是6.
latin1和gbk編碼下漢字佔用兩個位元組,所以如果是這兩種編碼,則SELECT LENGTH("漢字")會返回4.
如果是要取字元長度,可用CHAR_LENGTH()函式。
LOAD_FILE(file_name)
這個函式也是暫時不想翻譯
LOWER(str)
將str轉換為小寫。根據編碼進行,預設為latin1。
SELECT LOWER('THIS IS DAXIE');
- 'this is daxie'
LOWER() 和 UPPER() 對二進位制字元型別(BINARY,VARBINARY,BLOB)是無效的。
這個函式是多位元組安全的。
LPAD(str,len,padstr)
LTRIM(str)
去掉str左邊的空格。
SELECT LTRIM(' barbar');
- 'barbar'
這個函式是多位元組安全的
MAKE_SET(bits,str1,str2,...)
MID(str,pos,len)
MID(str,pos,len) is a synonym for SUBSTRING(str,pos,len).
OCT(N)
將N轉換為八進位制並返回。相當於CONV(N,10,8);
如果N為NULL,則返回NULL。
SELECT OCT(12);
- '14'
SELECT OCT(10);
- '12'
OCTET_LENGTH(str)
OCTET_LENGTH() 和 LENGTH() 功能是一樣的
ORD(str)
QUOTE(str)
REPEAT(str,count)
將str重複count次然後返回。
如果count小於1,則返回空字元。
如果任一引數為NULL則返回NULL
SELECT REPEAT('啊~', 3);
- '啊~啊~啊~'
REPLACE(str,from_str,to_str)
將str中所有的from_str欄位替換為to_str。區分大小寫。
SELECT REPLACE('Oh~ OH~ Oh~', 'Oh~', 'OHH~');
- 'OHH~ OH~ OHH~'
這個函式是多位元組安全的。
REVERSE(str)
顛倒返回str。
SELECT REVERSE('abc');
- 'cba'
這個函式是多位元組安全的
RIGHT(str,len)
擷取返回str最右邊長度len的字元。任一字元為NULL則返回NULL。
SELECT RIGHT('foobarbar', 4);
- 'rbar'
這個函式是多位元組安全的
RPAD(str,len,padstr)
RTRIM(str)
去掉str右邊的空格。
SELECT RTRIM('barbar ');
- 'barbar'
這個函式是多位元組安全的
SOUNDEX(str)
expr1 SOUNDS LIKE expr2
SPACE(N)
返回N個空格。
SELECT SPACE(6);
- ' '
SUBSTR(str,pos), SUBSTR(str FROM pos), SUBSTR(str,pos,len), SUBSTR(str FROM pos FOR len)
SUBSTR() 和 SUBSTRING()函式功能是一樣的。
SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len)
SUBSTRING(str,pos) 擷取str從第pos位到結尾的字元,並返回
Sample:
SELECT SUBSTRING('12345678',3);
- '345678'
SUBSTRING(str FROM pos) 效果和SUBSTRING(str,pos)是一樣的,語法不同而已。
SUBSTRING(str,pos,len) 中len值是指定擷取長度。
Sample:
SELECT SUBSTRING('12345678',3,2);
- '34'
pos的值為正整數時從左往右數,當為負整數時,則是從右往左數。
Sample
SELECT SUBSTRING('12345678',-3);
- '678'
SELECT SUBSTRING('87654321',-4,2);
- '43'
這個函式是多位元組安全的。
SUBSTRING_INDEX(str,delim,count)
懶得翻譯了,直接看程式碼吧
SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
- 'www.mysql'
SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
- 'mysql.com'