CONVERT() functions may be used to take a
value of one type and produce a value of another type. Their syntax is:
CAST(expression AS type) CONVERT(expression,type) CONVERT(expr USING transcoding_name)
type value can be one of the following:
CONVERT() are available as of MySQL 4.0.2.
CHAR conversion type is available as of 4.0.6.
USING form of
CONVERT() is available as of 4.1.0.
CONVERT(... USING ...) are SQL-99 syntax.
USING form of
CONVERT() is ODBC syntax.
The cast functions are useful when you want to create a column with
a specific type in a
CREATE ... SELECT statement:
CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);
The functions also can be useful for sorting
ENUM columns in lexical
order. Normally sorting of
ENUM columns occurs using the internal
numeric values. Casting the values to
CHAR results in a lexical
SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);
CAST(string AS BINARY) is the same thing as
CAST(expr AS CHAR) treats the expression as a string with the
default character set.
NOTE: In MysQL 4.0 the
TIME only marks the column to be a specific
type but doesn't change the value of the column.
In MySQL 4.1.0 the value is converted to the correct column type when it's sent to the user (this is a feature of how the new protocol in 4.1 sends date information to the client):
mysql> SELECT CAST(NOW() AS DATE); -> 2003-05-26
In later MySQL versions (probably 4.1.2 or 5.0) we will fix that
also changes the result if you use it as part of a more complex expression,
CONCAT("Date: ",CAST(NOW() AS DATE)).
You should not use
CAST() to extract data in different formats but
instead use string functions like
EXTRACT(). See section 12.4 Date and Time Functions.
To cast a string to a numeric value, you don't normally have to do anything; just use the string value as it would be a number:
mysql> SELECT 1+'1'; -> 2
If you use a number in string context, the number will automatically be
converted to a
mysql> SELECT CONCAT("hello you ",2); -> "hello you 2"
MySQL supports arithmetic with both signed and unsigned 64-bit values.
If you are using numerical operations (like
+) and one of the
unsigned integer, the result will be unsigned.
You can override this by using the
cast operators to cast the operation to a signed or
unsigned 64-bit integer, respectively.
mysql> SELECT CAST(1-2 AS UNSIGNED) -> 18446744073709551615 mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED); -> -1
Note that if either operand is a floating-point value, the result is
a floating-point value and is not affected by the above rule.
(In this context,
DECIMAL values are regarded as floating-point values.)
mysql> SELECT CAST(1 AS UNSIGNED) - 2.0; -> -1.0
If you are using a string in an arithmetic operation, this is converted to a floating-point number.
The handing of unsigned values was changed in MySQL 4.0 to be able to
BIGINT values properly. If you have some code that you
want to run in both MySQL 4.0 and 3.23 (in which case you probably can't
CAST() function), you can use the following technique to get
a signed result when subtracting two unsigned integer columns:
The idea is that the columns are converted to floating-point values before the subtraction occurs.
If you get a problem with
UNSIGNED columns in your old MySQL
application when porting to MySQL 4.0, you can use the
--sql-mode=NO_UNSIGNED_SUBTRACTION option when starting
mysqld. Note however that as long as you use this, you will not
be able to make efficient use of the
BIGINT UNSIGNED column type.
USING is used to convert data between different
character sets. In MySQL, transcoding names are the same as the
corresponding character set names. For example, this statement converts
'abc' in the server's default character set to the
corresponding string in the
utf8 character set:
SELECT CONVERT('abc' USING utf8);