1. 程式人生 > >Mysql 字元函式詳解

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'