String-valued functions return NULL
if the length of the result would
be greater than the max_allowed_packet
server parameter. See section 5.5.2 Tuning Server Parameters.
For functions that operate on string positions, the first position is numbered 1.
ASCII(str)
str
. Returns 0
if str
is the empty string. Returns
NULL
if str
is NULL
:
mysql> SELECT ASCII('2'); -> 50 mysql> SELECT ASCII(2); -> 50 mysql> SELECT ASCII('dx'); -> 100See also the
ORD()
function.
ORD(str)
str
is a multi-byte character,
returns the code for that character, calculated from the ASCII code values
of its constituent characters using this formula:
((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]
.
If the leftmost character is not a multi-byte character, returns the same
value that the ASCII()
function does:
mysql> SELECT ORD('2'); -> 50
CONV(N,from_base,to_base)
N
, converted from base from_base
to base to_base
. Returns NULL
if any argument is NULL
.
The argument N
is interpreted as an integer, but may be specified as
an integer or a string. The minimum base is 2
and the maximum base is
36
. If to_base
is a negative number, N
is regarded as a
signed number. Otherwise, N
is treated as unsigned. CONV
works
with 64-bit precision:
mysql> SELECT CONV("a",16,2); -> '1010' mysql> SELECT CONV("6E",18,8); -> '172' mysql> SELECT CONV(-17,10,-18); -> '-H' mysql> SELECT CONV(10+"10"+'10'+0xa,10,10); -> '40'
BIN(N)
N
, where
N
is a longlong (BIGINT
) number. This is equivalent to
CONV(N,10,2)
. Returns NULL
if N
is NULL
:
mysql> SELECT BIN(12); -> '1100'
OCT(N)
N
, where
N
is a longlong number. This is equivalent to CONV(N,10,8)
.
Returns NULL
if N
is NULL
:
mysql> SELECT OCT(12); -> '14'
HEX(N_or_S)
N
, where N
is a longlong (BIGINT
) number.
This is equivalent to CONV(N,10,16)
.
If N_OR_S is a string, returns a hexadecimal string of N_OR_S where each
character in N_OR_S is converted to 2 hexadecimal digits. This is the
invers of the 0xff
strings.
mysql> SELECT HEX(255); -> 'FF' mysql> SELECT HEX("abc"); -> 616263 mysql> SELECT 0x616263; -> "abc"
CHAR(N,...)
CHAR()
interprets the arguments as integers and returns a string
consisting of the characters given by the ASCII code values of those
integers. NULL
values are skipped:
mysql> SELECT CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> SELECT CHAR(77,77.3,'77.3'); -> 'MMM'
CONCAT(str1,str2,...)
NULL
if any argument is NULL
. May have more than 2 arguments.
A numeric argument is converted to the equivalent string form:
mysql> SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> SELECT CONCAT('My', NULL, 'QL'); -> NULL mysql> SELECT CONCAT(14.3); -> '14.3'
CONCAT_WS(separator, str1, str2,...)
CONCAT_WS()
stands for CONCAT With Separator and is a special form of
CONCAT()
. The first argument is the separator for the rest of the
arguments. The separator can be a string as well as the rest of the
arguments. If the separator is NULL
, the result will be NULL
.
The function will skip any NULL
s and empty strings, after the
separator argument. The separator will be added between the strings to be
concatenated:
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'
LENGTH(str)
OCTET_LENGTH(str)
CHAR_LENGTH(str)
CHARACTER_LENGTH(str)
str
:
mysql> SELECT LENGTH('text'); -> 4 mysql> SELECT OCTET_LENGTH('text'); -> 4Note that for
CHAR_LENGTH()
and CHARACTER_LENGTH()
, multi-byte
characters are only counted once.
BIT_LENGTH(str)
str
in bits:
mysql> SELECT BIT_LENGTH('text'); -> 32
LOCATE(substr,str)
POSITION(substr IN str)
substr
in string str
. Returns 0
if substr
is not in str
:
mysql> SELECT LOCATE('bar', 'foobarbar'); -> 4 mysql> SELECT LOCATE('xbar', 'foobar'); -> 0This function is multi-byte safe. In MySQL 3.23 this function is case sensitive, while in 4.0 it's only case-sensitive if either argument is a binary string.
LOCATE(substr,str,pos)
substr
in
string str
, starting at position pos
.
Returns 0
if substr
is not in str
:
mysql> SELECT LOCATE('bar', 'foobarbar',5); -> 7This function is multi-byte safe. In MySQL 3.23 this function is case sensitive, while in 4.0 it's only case-sensitive if either argument is a binary string.
INSTR(str,substr)
substr
in
string str
. This is the same as the two-argument form of
LOCATE()
, except that the arguments are swapped:
mysql> SELECT INSTR('foobarbar', 'bar'); -> 4 mysql> SELECT INSTR('xbar', 'foobar'); -> 0This function is multi-byte safe. In MySQL 3.23 this function is case sensitive, while in 4.0 it's only case-sensitive if either argument is a binary string.
LPAD(str,len,padstr)
str
, left-padded with the string padstr
until str
is len
characters long. If str
is longer
than len'
then it will be shortened to len
characters.
mysql> SELECT LPAD('hi',4,'??'); -> '??hi'
RPAD(str,len,padstr)
str
, right-padded with the string
padstr
until str
is len
characters long. If
str
is longer than len'
then it will be shortened to
len
characters.
mysql> SELECT RPAD('hi',5,'?'); -> 'hi???'
LEFT(str,len)
len
characters from the string str
:
mysql> SELECT LEFT('foobarbar', 5); -> 'fooba'This function is multi-byte safe.
RIGHT(str,len)
len
characters from the string str
:
mysql> SELECT RIGHT('foobarbar', 4); -> 'rbar'This function is multi-byte safe.
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
len
characters long from string str
,
starting at position pos
.
The variant form that uses FROM
is SQL-92 syntax:
mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica'This function is multi-byte safe.
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
str
starting at position pos
:
mysql> SELECT SUBSTRING('Quadratically',5); -> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4); -> 'barbar'This function is multi-byte safe.
SUBSTRING_INDEX(str,delim,count)
str
before count
occurrences of the delimiter delim
.
If count
is positive, everything to the left of the final delimiter
(counting from the left) is returned.
If count
is negative, everything to the right of the final delimiter
(counting from the right) is returned:
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); -> 'www.mysql' mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); -> 'mysql.com'This function is multi-byte safe.
LTRIM(str)
str
with leading space characters removed:
mysql> SELECT LTRIM(' barbar'); -> 'barbar'
RTRIM(str)
str
with trailing space characters removed:
mysql> SELECT RTRIM('barbar '); -> 'barbar'This function is multi-byte safe.
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
str
with all remstr
prefixes and/or suffixes
removed. If none of the specifiers BOTH
, LEADING
or
TRAILING
are given, BOTH
is assumed. If remstr
is not
specified, spaces are removed:
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'This function is multi-byte safe.
SOUNDEX(str)
str
. Two strings that sound almost the
same should have identical soundex strings. A standard soundex string
is 4 characters long, but the SOUNDEX()
function returns an
arbitrarily long string. You can use SUBSTRING()
on the result to get
a standard soundex string. All non-alphanumeric characters are ignored
in the given string. All international alpha characters outside the A-Z range
are treated as vowels:
mysql> SELECT SOUNDEX('Hello'); -> 'H400' mysql> SELECT SOUNDEX('Quadratically'); -> 'Q36324'
SPACE(N)
N
space characters:
mysql> SELECT SPACE(6); -> ' '
REPLACE(str,from_str,to_str)
str
with all occurrences of the string
from_str
replaced by the string to_str
:
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww'); -> 'WwWwWw.mysql.com'This function is multi-byte safe.
REPEAT(str,count)
str
repeated count
times. If count <= 0
, returns an empty string. Returns NULL
if
str
or count
are NULL
:
mysql> SELECT REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL'
REVERSE(str)
str
with the order of the characters reversed:
mysql> SELECT REVERSE('abc'); -> 'cba'This function is multi-byte safe.
INSERT(str,pos,len,newstr)
str
, with the substring beginning at position
pos
and len
characters long replaced by the string
newstr
:
mysql> SELECT INSERT('Quadratic', 3, 4, 'What'); -> 'QuWhattic'This function is multi-byte safe.
ELT(N,str1,str2,str3,...)
str1
if N
= 1
, str2
if N
=
2
, and so on. Returns NULL
if N
is less than 1
or greater than the number of arguments. ELT()
is the complement of
FIELD()
:
mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo'); -> 'ej' mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo'); -> 'foo'
FIELD(str,str1,str2,str3,...)
str
in the str1
, str2
,
str3
, ...
list.
Returns 0
if str
is not found.
FIELD()
is the complement of ELT()
:
mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 2 mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 0
FIND_IN_SET(str,strlist)
1
to N
if the string str
is in the list
strlist
consisting of N
substrings. A string list is a string
composed of substrings separated by `,' characters. If the first
argument is a constant string and the second is a column of type SET
,
the FIND_IN_SET()
function is optimised to use bit arithmetic!
Returns 0
if str
is not in strlist
or if strlist
is the empty string. Returns NULL
if either argument is NULL
.
This function will not work properly if the first argument contains a
`,':
mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2
MAKE_SET(bits,str1,str2,...)
bits
set. str1
corresponds to bit 0, str2
to bit 1,
etc. NULL
strings in str1
, str2
, ...
are not appended to the result:
mysql> SELECT MAKE_SET(1,'a','b','c'); -> 'a' mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world'); -> 'hello,world' mysql> SELECT MAKE_SET(0,'a','b','c'); -> ''
EXPORT_SET(bits,on,off,[separator,[number_of_bits]])
mysql> SELECT EXPORT_SET(5,'Y','N',',',4) -> Y,N,Y,N
LCASE(str)
LOWER(str)
str
with all characters changed to lowercase
according to the current character set mapping (the default is ISO-8859-1
Latin1):
mysql> SELECT LCASE('QUADRATICALLY'); -> 'quadratically'This function is multi-byte safe.
UCASE(str)
UPPER(str)
str
with all characters changed to uppercase
according to the current character set mapping (the default is ISO-8859-1
Latin1):
mysql> SELECT UCASE('Hej'); -> 'HEJ'This function is multi-byte safe.
LOAD_FILE(file_name)
FILE
privilege. The file must
be readable by all and be smaller than max_allowed_packet
.
If the file doesn't exist or can't be read due to one of the above reasons,
the function returns NULL
:
mysql> UPDATE tbl_name SET blob_column=LOAD_FILE("/tmp/picture") WHERE id=1;If you are not using MySQL Version 3.23, you have to do the reading of the file inside your application and create an
INSERT
statement
to update the database with the file information. One way to do this, if
you are using the MySQL++ library, can be found at
http://www.mysql.com/documentation/mysql++/mysql++-examples.html.
QUOTE(str)
NULL
, the return value is the word ``NULL'' without surrounding
single quotes.
The QUOTE
function was added in MySQL version 4.0.3.
mysql> SELECT QUOTE("Don't"); -> 'Don\'t!' mysql> SELECT QUOTE(NULL); -> NULL
Posted by [name withheld] on Friday May 17 2002, @6:24am | [Delete] [Edit] |
It appears that something like this does not work:\n
SELECT CASE c.flag_user WHEN 0 THEN 0 WHEN 1 THEN 2 ELSE 1 END AS myflag\n
FROM bi_clones c, bi_hits h WHERE h.clone = c.id ORDER BY c.name LIMIT 0, 50
\n
In this example, myflag will be 0 even if flag_user is 1. However, when there is no join,
the query works as expected. I.e.
\n
SELECT CASE c.flag_user WHEN 0 THEN 0 WHEN 1 THEN 2 ELSE 1 END AS myflag\n
FROM bi_clones c ORDER BY c.name LIMIT 0, 50
\n
produces the same result as
\n
SELECT IF(c.flag_user,IF(c.flag_user-1,1,2),0) AS myflag\n
FROM bi_clones c ORDER BY c.name LIMIT 0, 50
\n
The manual doesn't state the CASE only works for SELECTS on one
table, so I suppose I might have stumbled upon a bug of some sort.
Luckily it's easy to replace CASE with IF() wherever needed.
Posted by Gonzalo Aguirre on Friday May 17 2002, @6:24am | [Delete] [Edit] |
how could I emulate the XOR operator with abiable
logical operators in mysql?,
i've to do something like this:
select * from table1,table2 where (table1.a) xor
(table1.a=table2.a);
this've to work like minus operator..
thanks in advance
..
Posted by Duncan on Wednesday December 18 2002, @5:27pm | [Delete] [Edit] |
the min and max arguments to BETWEEN mean it.
contrary to english usage,
select 5 between 4 and 6 ; (1) is not equal to
select 5 between 6 and 4 ; (0)
the optimizer neither sorts the operands nor
catches the always-false case.
mysql> select id from speed where stamp between 6
and 4 ;
Empty set (28.51 sec)
(3 million records in table, server version
3.23.42-nt)
Posted by Joe Hofeditz on Friday May 17 2002, @6:24am | [Delete] [Edit] |
I was confused with the same problem: how to
return rows that may or may not have a related
record in another table.
Then I learned about left joins. A left join is
basically an XOR if statement. Look on the join
doc page for examples.
This one worked for me:
mysql> select * from table1 LEFT JOIN table2 ON
table1.id=table2.id;
Posted by Daniel Penning on Wednesday December 18 2002, @5:27pm | [Delete] [Edit] |
is the file for LOAD_FILE loaded from the client
or the server?
is LOAD_FILE replication safe?
Posted by Peter on Friday May 17 2002, @6:24am | [Delete] [Edit] |
ASP users: if you're getting empty recordset
returned when using IFNULL, add "OPTION=16384" to
your connectionstring, or check "Change Bigint to
Int" in the DSN manager!
Posted by [name withheld] on Monday May 20 2002, @4:13pm | [Delete] [Edit] |
a XOR b can also be accomplished as:
(a AND NOT b) OR (b AND NOT a)
(table1.a) xor (table1.a=table2.a) becomes:
(table1.a AND NOT (table1.a=table2.a)) OR
((table1.a=table2.a) AND NOT table1.a)
Posted by Leif Neland on Friday May 17 2002, @6:24am | [Delete] [Edit] |
Warning:
locate('',anything) always returns 1
Posted by Filip Wolak on Friday May 17 2002, @6:24am | [Delete] [Edit] |
nice feature would be something that will work as
SUM(), but on text results. something like join
(',', $array) in PHP. The result will be a joined
set, with and delimitter of text results.
i tried CONCAT and CONCAT_WS, but does not work
the way i want. or maybe i do something wrong
Posted by Jonny Prouty on Wednesday September 4 2002, @11:56am | [Delete] [Edit] |
I found a simple little way of converting a string to
an int in version 3.23. CONV(N, 10, 10) where N is
the
string. I had to use this because when i tried to
return SUM(varchar_column), it would funkify the
data. the string '1' got converted
to '1.00000071246087'. SUM(CONV
(varchar_column, 10, 10)) seems to work fine
though. it leaves '1' as '1'.
Posted by Alex Safonov on Tuesday October 1 2002, @10:19am | [Delete] [Edit] |
Perhaps I misunderstand how load_file works,
but the following does not seem right:
mysql> select load_file('/home/alex/.bashrc')
from test;
+-----------------------------------+
| load_file('/home/alex/.bashrc') |
+-----------------------------------+
| NULL |
+-----------------------------------+
1 row in set (0.00 sec)
Inserting an existing file into a BLOB field using
load_file() function does not work either.
Posted by Andrew Montgomery on Sunday January 26 2003, @1:23pm | [Delete] [Edit] |
If you are having trouble uploading a file via PHP into a MySQL database, you must use PHP's chmod command to change the permissions on the uploaded file. For example:
chmod($_FILES['myfield']['tmp_name'],0644);
This will allow the mysqld user (the unix user of the mysql daemon process, not the mysql user) to read the file. Also don't forget to set the FILE permission on the mysql user.
Posted by alex on Thursday February 20 2003, @3:14pm | [Delete] [Edit] |
Where is INSTRREV / LASTINDEXOF?
It seems the function to search a string starting from the end is missing. In VB/ASP, it's called InStrRev, in javascript it's lastIndexOf.
You can fake it by doing this:
SELECT LENGTH("The string to, search!") - INSTR(REVERSE("The string to, search!"), ",") + 1
but this is hardly practical. Ideally:
InStrRev(STRING_TO_SEARCH, SEARCH_FOR, START_AT_POSITION)
Where leaving out START_AT_POSITION or specifying -1 will begin at the end of the string and search towards the beginning.
Posted by Gonzalo Aguirre on Friday March 14 2003, @2:49am | [Delete] [Edit] |
to take off quote from string at the begining and at the end of it, you should do the this query:
update <table> set <attrib>= substring(<attrib>,2,length(<attrib>)-2);
"some text type attrib" (before)
some text type attrib (after / without quote)
Posted by Carl Furst on Wednesday April 2 2003, @10:33am | [Delete] [Edit] |
I think it would be nice to have a ucfirst function that would make the first character of a string upper case or lcfirst to do the inverse. Instead you have to do something like this to make your text a proper name (in 3.23.23):
concat(upper(substring(string,1,1)), substring(string,2))
Posted by Tiger on Wednesday April 16 2003, @12:50pm | [Delete] [Edit] |
It'll be also nice to have something like ucwords() to capitalize first character of each word in string.
Posted by Joe MySQLUser on Wednesday April 23 2003, @1:18am | [Delete] [Edit] |
Example of "order by" on a varchar column containing IP Addresses:
10.144.203.1
10.144.203.10
10.144.203.2
Example of How to order properly:
select IP from SomeTable order by lpad(mid(IP,locate('.',IP,locate('.',IP,locate('.',IP)+1)+1)+1,4),3,0);
Output:
10.144.203.1
10.144.203.2
10.144.203.10
One gripe I have is with the locate() function... Anyone ever consider adding an "nth" occurrance feature? Would make the above alot simpler - you could just specify locate('.',IP,n) where n would be the 3rd occurrence of the dot rather than n being the starting position in the string/field.
Posted by Dimitris Kounalakis on Saturday May 10 2003, @2:28am | [Delete] [Edit] |
Probably something good that will allow simple XML use with low network load and low clients' overhead, is to have a REPLACE function with regexp capabilities like the following:
REPLACEREGEXP(sourcestring,REGEXP condition,replacestring)
where the sourcestring can be a field
Posted by Chris Davies on Saturday July 12 2003, @7:35pm | [Delete] [Edit] |
Order by ip
order by inet_aton(ip);
Posted by [name withheld] on Friday July 18 2003, @7:31am | [Delete] [Edit] |
SUBSTRING_INDEX is case sensitive. This should be in the manual.
Posted by Jochem Klaver on Monday July 21 2003, @1:35am | [Delete] [Edit] |
Don't get me wrong, I also agree on the REGEXP function, but for now you can use nested REPLACE's:
SELECT title REPLACE(REPLACE(REPLACE(title, 'A ', ''), 'An ',''), 'The ', '') as sortedtitle FROM books WHERE 1
or beter use TRIM with this example, cause you only want these words to be remove from the front:
SELECT title TRIM(LEADING 'A ' FROM TRIM(LEADING 'An ' FROM TRIM(LEADING 'The ' FROM title))) as sortedtitle FROM books WHERE 1
Posted by [name withheld] on Thursday July 24 2003, @8:08am | [Delete] [Edit] |
Nice feature would be something that will work as || for Oracle or + in SQL Server to concatenate two strings.