Строковые функции возвращают NULL
, если длина результата оказывается
больше, чем указано в значении серверного параметра max_allowed_packet
.
See section 5.5.2 Настройка параметров сервера.
Для функций, работающих с позициями в строке, нумерация позиций начинается с 1.
str
; 0
если
str
является пустой строкой; NULL
, если str
равна NULL
:
mysql> SELECT ASCII('2'); -> 50 mysql> SELECT ASCII(2); -> 50 mysql> SELECT ASCII('dx'); -> 100См. также функцию
ORD()
.
ORD(str)
str
представляет собой многобайтный
символ, то данная функция возвращает его код, который вычисляется на
основе ASCII-кодов составляющих его символов по формуле: ((первый байт
ASCII-кода)*256+(второй байт ASCII-кода))[*256+третий байт ASCII-кода...].
Если крайний слева символ не является многобайтным, то данная функция
возвращает то же значение, что и ASCII():
mysql> SELECT ORD('2'); -> 50
CONV(N,from_base,to_base)
N
, преобразованного из системы счисления с
основой from_base
в систему счисления с основой to_base
. Если хотя бы один
из аргументов равен NULL
, то возвращается NULL
. Аргумент N
интерпретируется как целое число, но может быть задан как целое число или
строка. Минимальное значение основы системы счисления равно 2
, а
максимальное - 36
. Если аргумент to_base
представлен отрицательным числом,
то принимается, что N
- число со знаком. В противном случае N
трактуется
как беззнаковое число. Функция CONV
работает с 64-битовой точностью:
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
, где N
- целое число
большого размера (BIGINT
). Эквивалентна функции CONV(N,10,2)
. Если N
равно
NULL
, возвращается NULL
:
mysql> SELECT BIN(12); -> '1100'
OCT(N)
N
, где N
-
целое число большого размера. Эквивалентно функции CONV(N,10,8)
. Если N
равно NULL
, возвращается NULL
:
mysql> SELECT OCT(12); -> '14'
HEX(N_or_S)
N_OR_S
- число, то возвращается строковое представление
шестнадцатеричного числа N
, где N
- целое число большого размера (BIGINT
).
Эквивалентна функции CONV(N,10,16)
. Если N_OR_S
- строка, то функция
возвращает шестнадцатеричную строку N_OR_S
, где каждый символ в N_OR_S
конвертируется в 2 шестнадцатеричных числа. Является обратной по отношению
к строкам 0xff
.
mysql> SELECT HEX(255); -> 'FF' mysql> SELECT HEX("abc"); -> 616263 mysql> SELECT 0x616263; -> "abc"
CHAR(N,...)
CHAR()
интерпретирует аргументы как целые числа и возвращает строку,
состоящую из символов, соответствующих ASCII-коду этих чисел. Величины
NULL
пропускаются:
mysql> SELECT CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> SELECT CHAR(77,77.3,'77.3'); -> 'MMM'
CONCAT(str1,str2,...)
NULL
, возвращается NULL
. Может принимать
более 2 аргументов. Числовой аргумент преобразуется в эквивалентную
строковую форму:
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
() обозначает CONCAT With Separator
(конкатенация с
разделителем) и представляет собой специальную форму функции CONCAT()
.
Первый аргумент является разделителем для остальных аргументов.
Разделитель, так же как и остальные аргументы, может быть строкой. Если
разделитель равен NULL
, то результат будет NULL
. Данная функция будет
пропускать все величины NULL
и пустые строки, расположенные после
аргумента-разделителя. Разделитель будет добавляться между строками,
подлежащими конкатенации:
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)
mysql> SELECT LENGTH('text'); -> 4 mysql> SELECT OCTET_LENGTH('text'); -> 4Обратите внимание: для
CHAR_LENGTH()
и CHARACTER_LENGTH()
многобайтные
символы учитываются только однажды.
BIT_LENGTH(str)
str
в битах:
mysql> SELECT BIT_LENGTH('text'); -> 32
LOCATE(substr,str)
POSITION(substr IN str)
substr
в строку str
. Если
подстрока substr в строке str
отсутствует, возвращается 0
:
mysql> SELECT LOCATE('bar', 'foobarbar'); -> 4 mysql> SELECT LOCATE('xbar', 'foobar'); -> 0Данная функция поддерживает многобайтные величины. В MySQL 3.23 эта функция чувствительна к регистру, а в 4.0 она чувствительна к регистру только в случае, если хотя бы один из аргументов является строкой с двоичными данными.
LOCATE(substr,str,pos)
substr
в строку str
,
начиная с позиции pos
. Если подстрока substr
в строке str
отсутствует,
возвращается 0
:
mysql> SELECT LOCATE('bar', 'foobarbar',5); -> 7Данная функция поддерживает многобайтные величины. В MySQL 3.23 эта функция чувствительна к регистру, а в 4.0 она чувствительна к регистру, только в случае, если хотя бы один из аргументов является строкой с двоичными данными.
INSTR(str,substr)
substr
в строку str
. То же,
что и двухаргументная форма функции LOCATE()
, за исключением перемены мест
аргументов:
mysql> SELECT INSTR('foobarbar', 'bar'); -> 4 mysql> SELECT INSTR('xbar', 'foobar'); -> 0Данная функция поддерживает многобайтные величины. В MySQL 3.23 эта функция чувствительна к регистру, а в 4.0 она чувствительна к регистру только в случае, если хотя бы один из аргументов является строкой с двоичными данными.
LPAD(str,len,padstr)
str
, которая дополняется слева строкой padstr
, пока
строка str
не достигнет длины len
символов. Если строка str
длиннее, чем
len
, то она будет укорочена до len
символов.
mysql> SELECT LPAD('hi',4,'??'); -> '??hi'
RPAD(str,len,padstr)
str
, которая дополняется справа строкой padstr
, пока
строка str
не достигнет длины len
символов. Если строка str
длиннее, чем
len
, то она будет укорочена до len
символов.
mysql> SELECT RPAD('hi',5,'?'); -> 'hi???'
LEFT(str,len)
len
символов из строки str
:
mysql> SELECT LEFT('foobarbar', 5); -> 'fooba'Данная функция поддерживает многобайтные величины.
RIGHT(str,len)
len
символов из строки str
:
mysql> SELECT RIGHT('foobarbar', 4); -> 'rbar'Данная функция поддерживает многобайтные величины.
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
len
символов из строки str
, начиная от позиции
pos
. Существует форма с оператором FROM
, для которой используется
синтаксис ANSI SQL92:
mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica'Данная функция поддерживает многобайтные величины.
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
str
, начиная с позиции pos
:
mysql> SELECT SUBSTRING('Quadratically',5); -> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4); -> 'barbar'Данная функция поддерживает многобайтные величины.
SUBSTRING_INDEX(str,delim,count)
str
перед появлениям count
вхождений
разделителя delim
. Если count
положителен, то возвращается все, что
находится слева от последнего разделителя (считая слева). Если count
отрицателен, то возвращается все, что находится справа от последнего
разделителя (считая справа):
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); -> 'www.mysql' mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); -> 'mysql.com'Данная функция поддерживает многобайтные величины.
LTRIM(str)
str
с удаленными начальными пробелами:
mysql> SELECT LTRIM(' barbar'); -> 'barbar'Данная функция поддерживает многобайтные величины.
RTRIM(str)
str
с удаленными конечными пробелами:
mysql> SELECT RTRIM('barbar '); -> 'barbar'Данная функция поддерживает многобайтные величины.
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
str
с удаленными всеми префиксами и/или суффиксами,
указанными в remstr
. Если не указан ни один из спецификаторов BOTH
,
LEADING
или TRAILING
, то подразумевается BOTH
. Если аргумент remstr
не
задан, то удаляются пробелы:
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'Данная функция поддерживает многобайтные величины.
SOUNDEX(str)
SOUNDEX()
возвращает строку произвольной длины. Можно
использовать функцию SUBSTRING()
для извлечения стандартного саундекса
строки из результата функции SOUNDEX()
. В строке str
игнорируются все
символы, не являющиеся буквами или цифрами. Все международные буквенные
символы, не входящие в диапазон A-Z
, трактуются как гласные:
mysql> SELECT SOUNDEX('Hello'); -> 'H400' mysql> SELECT SOUNDEX('Quadratically'); -> 'Q36324'
SPACE(N)
N
пробелов:
mysql> SELECT SPACE(6); -> ' '
REPLACE(str,from_str,to_str)
str
, в которой все вхождения строки from_str
заменены
на to_str
:
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww'); -> 'WwWwWw.mysql.com'Данная функция поддерживает многобайтные величины.
REPEAT(str,count)
str
, повторенной count
раз. Если
значение count <= 0
, возвращает пустую строку. Возвращает NULL
, если str
или count
равны NULL
:
mysql> SELECT REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL'
REVERSE(str)
str
с обратным порядком символов:
mysql> SELECT REVERSE('abc'); -> 'cba'Данная функция поддерживает многобайтные величины.
INSERT(str,pos,len,newstr)
str
, в которой подстрока начиная с позиции pos
, имеющая
длину len
замещена на newstr
:
mysql> SELECT INSERT('Quadratic', 3, 4, 'What'); -> 'QuWhattic'Данная функция поддерживает многобайтные величины.
ELT(N,str1,str2,str3,...)
str1
, если N = 1
, str2
, если N = 2
, и так далее. Если N
меньше,
чем 1
или больше, чем число аргументов, возвращается NULL
. Функция ELT()
является дополненительной по отношению к функции 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
в списке str1, str2, str3, ...
. Если строка
str
не найдена, возвращается 0
. Функция FIELD()
является дополнительной по
отношению к функции 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
до N
, если строка str
присутствует в списке
strlist
, состоящем из N
подстрок. Список строк представляет собой строку,
состоящую из подстрок, разделенных символами `,'. Если первый аргумент
представляет собой строку констант, а второй является столбцом типа SET
,
функция FIND_IN_SET()
оптимизируется для использования двоичной
арифметики! Возвращает 0
, если str
отсутствует в списке strlist
или если
strlist
является пустой строкой. Если один из аргументов равен NULL
,
возвращается 0
. Данная функция не будет корректно работать, если первый
аргумент содержит символ `,':
mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2
MAKE_SET(bits,str1,str2,...)
bits
.
Аргумент str1
соответствует биту 0
, str2
- биту 1
, и так далее. Нулевые
строки в наборах str1
, str2
, ...
не прибавляются к результату:
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]])
bits
соответствует строка on
, а каждому сброшенному биту - off
.
Каждая строка отделена разделителем, указанным в параметре separator
(по
умолчанию - `,'), причем используется только количество битов, заданное
аргументом number_of_bits
(по умолчанию 64), из всего количества,
указанного в bits
:
mysql> SELECT EXPORT_SET(5,'Y','N',',',4) -> Y,N,Y,N
LCASE(str)
LOWER(str)
str
, в которой все символы переведены в нижний регистр
в соответствии с текущей установкой набора символов (по умолчанию -
ISO-8859-1 Latin1):
mysql> SELECT LCASE('QUADRATICALLY'); -> 'quadratically'Данная функция поддерживает многобайтные величины.
UCASE(str)
UPPER(str)
str
, в которой все символы переведены в верхний регистр
в соответствии с текущей установкой набора символов (по умолчанию -
ISO-8859-1 Latin1):
mysql> SELECT UCASE('Hej'); -> 'HEJ'Данная функция поддерживает многобайтные величины.
LOAD_FILE(file_name)
FILE
. Размер данного
файла должен быть меньше указанного в max_allowed_packet
и файл должен
быть открыт для чтения для всех. Если файл не существует или не может быть
прочитан по одной из вышеупомянутых причин, то функция возвращает NULL
:
mysql> UPDATE tbl_name SET blob_column=LOAD_FILE("/tmp/picture") WHERE id=1;При использовании версии MySQL, отличной от 3.23, чтение файла необходимо выполнять внутри вашего приложения и использовать команду
INSERT
для внесения в базу данных информации, содержащейся в файле. Один
из путей реализации этого с использованием библиотеки MySQL++
можно найти
на http://www.mysql.com/documentation/mysql++/mysql++-examples.html.
QUOTE(str)
NULL
, то тогда результатом будет слово "NULL" без окружающих кавычек.
mysql> SELECT QUOTE("Don't"); -> 'Don\'t!' mysql> SELECT QUOTE(NULL); -> NULL
MySQL при необходимости автоматически конвертирует числа в строки и наоборот:
mysql> SELECT 1+"1"; -> 2 mysql> SELECT CONCAT(2,' test'); -> '2 test'
Для преобразования числа в строку явным образом, необходимо передать его в
качестве аргумента функции CONCAT()
.
Если строковая функция содержит в качестве аргумента строку с двоичными данными, то и результирующая строка также будет строкой с двоичными данными. При этом число, конвертированное в строку, воспринимается как строка с двоичными данными. Это имеет значение только при выполнении операций сравнения.
User Comments
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.
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)
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'.
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.
SUBSTRING_INDEX is case sensitive. This should be in the manual.
Nice feature would be something that will work as || for Oracle or + in SQL Server to concatenate two strings.
For some reason, HEX() doesn't seem to work with 3.23.49:
mysql> select HEX("abc"),VERSION();
HEX() on strings must have been introduced after 3.23.49. I would suggest updating the docs to reflect this, and removing this comment, as not everyone will read these comments.
the ip thing... column with ip address "ip" and table "comp_systems" - should give 4 separate columns, each with 3-padded numbers. i guess you could do something else to join all of them togther...
SELECT
LPAD( SUBSTRING( ip, 1, locate( '.', ip ) - 1 - 0 ) , 3, '0' ) ,
LPAD( SUBSTRING( ip, locate( '.', ip ) + 1, ( locate( '.', ip, locate( '.', ip ) + 1 ) + 1 ) - ( locate( '.', ip ) + 1 ) - 1 ) , 3, '0' ),
LPAD( SUBSTRING( ip, locate( '.', ip, locate( '.', ip ) + 1 ) + 1, ( locate( '.', ip, locate( '.', ip, locate( '.', ip ) + 1 ) + 1 ) + 1 ) - ( locate( '.', ip, locate( '.', ip ) + 1 ) + 1 ) - 1 ) , 3, '0' ),
LPAD( SUBSTRING( ip, locate( '.', ip, locate( '.', ip, locate( '.', ip ) + 1 ) + 1 ) + 1, LENGTH( ip ) ) , 3, '0' )
FROM comp_systems
NEVER store IPV4 addresses in a CHAR(15) or VARCHAR(15) !
Use instead the INTEGER (4 bytes) type. To convert your ip from text to a 4 byte number, use inet_aton function (inet_ntoa function reverse the operation). This will solve lot of your problems.
You save 70% disk space on this column, you may not insert bad ip (195.10.320.590), all queries are easier and faster, for example:
select all ip of a table in the range 192.10.*.*:
select ip from ip_table where ip between inet_aton("192.10.0.0") and inet_aton("192.10.255.255")
This result in a range selection rather than a ugly "like" operation...
Patrick Allaert
It's worth noting that the position (pos) part of substring does not work quite the same as the PHP substr() command in that;
1 row in set (0.00 sec)mysql> select uid from auth_user WHERE substring(uid,0,6) = 'fe4fdf';
Empty set (0.00 sec)
Functionaly would work in PHP correctly whereas MySQL needs it to be;
mysql> select uid from auth_user WHERE substring(uid,1,6) = 'fe4fdf';
The reason being that PHP calls the first char position zero against MySQL calling it position 1
Might seem obvious but it caught me out properly!
Phil
By the way, RPAD can be used to create on-the-fly histograms right in the mysql client:
SELECT category,COUNT(*),RPAD('',COUNT(*),'X') FROM table1 GROUP BY 1;
For example, to get a quick idea of the distribution of string lengths in a certain field, I used:
SELECT DISTINCT(LENGTH(name)),COUNT(*),RPAD('',COUNT(*),'X') FROM topics GROUP BY 1;
Associative arrays -
using ELT(FIELD()) you can emulate associative arrays...
FIELD => ELT
50 => 1
40 => 33
30 => 49
25 => 57
20 => 61
10 => 63
SELECT col1, ELT(FIELD(col1, 50, 40, 30, 25, 20, 10), 1, 33, 49, 57, 61, 63) AS aa1 FROM t1;
On 3.23 I've found that if CONCAT_WS is called with arguments other than strings (in my case it was integer field) it returns binary string value, so queries like
"select int_field, str_field from some_table where concat_ws(' ', int_field, str_field) like '%keyword%'" become case sensitive.
is there a LOCATE based on pattern matching?
I am trying to extract the area of a postcode so CF would be the area for CF1 4HT, and S would be the area for s12 4DJ.
I need to do a LEFT and use the position of the first digit [0-9]
Working on a project recently I needed the ability to count the number of occurrences of a given character in a given string. Unfortunately there is not a character counting function in MySQL, but the following suffices:
SELECT LENGTH(t1.string) - LENGTH(REPLACE(t1.string, 'f', '')) AS count
FROM table1 t1
WHERE string = 'foo';
This would then return a single result with a value of 1 (assuming of course there was only one record for 'foo'). Changing the replace argument from a 'f' to 'o' for example would give you again a single result but of course with a value of 2 since the character 'o' occours twice. Please note that this is case sensitive check; if you wish to search in a non case sensitive manner then simply wrap all string references in a LOWER().
Hope this helps.
Add your own comment.