(mysql.info.gz) Cast Functions
Info Catalog
(mysql.info.gz) Fulltext Search
(mysql.info.gz) Functions
(mysql.info.gz) Other Functions
12.7 Cast Functions and Operators
=================================
`BINARY'
The `BINARY' operator casts the string following it to a binary
string. This is an easy way to force a column comparison to be
done byte by byte rather than character by character. This causes
the comparison to be case sensitive even if the column isn't
defined as `BINARY' or `BLOB'. `BINARY' also causes trailing
spaces to be significant.
mysql> SELECT 'a' = 'A';
-> 1
mysql> SELECT BINARY 'a' = 'A';
-> 0
mysql> SELECT 'a' = 'a ';
-> 1
mysql> SELECT BINARY 'a' = 'a ';
-> 0
`BINARY' affects the entire comparison; it can be given before
either operand with the same result.
`BINARY' was added in MySQL 3.23.0. As of MySQL 4.0.2, `BINARY
str' is a shorthand for `CAST(str AS BINARY)'.
Note that in some contexts, if you cast an indexed column to
`BINARY', MySQL will not be able to use the index efficiently.
If you want to compare a `BLOB' value or other binary string in
case-insensitive fashion, you can do so as follows:
* Before MySQL 4.1.1, use the `UPPER()' function to convert the
binary string to uppercase before performing the comparison:
SELECT 'A' LIKE UPPER(BLOB_COL) FROM TBL_NAME;
If the comparison value is lowercase, convert the string
value using `LOWER()' instead.
* For MySQL 4.1.1 and up, binary strings have no character set,
and thus no concept of lettercase. To perform a
case-insensitive comparison, use the `CONVERT()' function to
convert the string value to a character set that is not case
sensitive. The result is a non-binary string, so the `LIKE'
operation is not case sensitive:
SELECT 'A' LIKE CONVERT(BLOB_COL USING latin1) FROM TBL_NAME;
To use a different character set, substitute its name for
`latin1' in the preceding statement.
`CONVERT()' can be used more generally for comparing strings that
are represented in different character sets.
`CAST(EXPR AS TYPE)'
`CONVERT(EXPR,TYPE)'
`CONVERT(EXPR USING TRANSCODING_NAME)'
The `CAST()' and `CONVERT()' functions can be used to take a value
of one type and produce a value of another type.
The TYPE can be one of the following values:
* `BINARY'
* `CHAR'
* `DATE'
* `DATETIME'
* `SIGNED [INTEGER]'
* `TIME'
* `UNSIGNED [INTEGER]'
`BINARY' produces a binary string. See the entry for the `BINARY'
operator in this section for a description of how this affects
comparisons.
`CAST()' and `CONVERT()' are available as of MySQL 4.0.2. The
`CHAR' conversion type is available as of 4.0.6. The `USING' form
of `CONVERT()' is available as of 4.1.0.
`CAST()' and `CONVERT(... USING ...)' are standard SQL syntax.
The non-`USING' form of `CONVERT()' is ODBC syntax.
`CONVERT()' with `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 the string `'abc'' in the server's default character set
to the corresponding string in the `utf8' character set:
SELECT CONVERT('abc' USING utf8);
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 sort:
SELECT ENUM_COL FROM TBL_NAME ORDER BY CAST(ENUM_COL AS CHAR);
`CAST(STR AS BINARY)' is the same thing as `BINARY STR'. `CAST(EXPR AS
CHAR)' treats the expression as a string with the default character set.
* In MySQL 4.0, a `CAST()' to `DATE', `DATETIME', or `TIME' only
marks the column to be a specific type but doesn't change the value of
the column.
As of 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
As of MySQL 4.1.1, `CAST()' also changes the result if you use it as
part of a more complex expression such as `CONCAT('Date: ',CAST(NOW()
AS DATE))'.
You should not use `CAST()' to extract data in different formats but
instead use string functions like `LEFT()' or `EXTRACT()'. Date
and time functions.
To cast a string to a numeric value in numeric context, you don't
normally have to do anything. Just use the string value as though it
were a number:
mysql> SELECT 1+'1';
-> 2
If you use a number in string context, the number automatically is
converted to a `BINARY' string.
mysql> SELECT CONCAT('hello you ',2);
-> 'hello you 2'
MySQL supports arithmetic with both signed and unsigned 64-bit values.
If you are using numeric operators (such as `+') and one of the
operands is an unsigned integer, the result is unsigned. You can
override this by using the `SIGNED' and `UNSIGNED' 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 preceding rule. (In
this context, `DECIMAL' column 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
support `BIGINT' values properly. If you have some code that you want
to run in both MySQL 4.0 and 3.23, you probably can't use the `CAST()'
function. You can use the following technique to get a signed result
when subtracting two unsigned integer columns `ucol1' and `ucol2':
mysql> SELECT (ucol1+0.0)-(ucol2+0.0) FROM ...;
The idea is that the columns are converted to floating-point values
before the subtraction occurs.
If you have a problem with `UNSIGNED' columns in old MySQL applications
when porting them to MySQL 4.0, you can use the
`--sql-mode=NO_UNSIGNED_SUBTRACTION' option when starting `mysqld'.
However, as long as you use this option, you will not be able to make
efficient use of the `BIGINT UNSIGNED' column type.
Info Catalog
(mysql.info.gz) Fulltext Search
(mysql.info.gz) Functions
(mysql.info.gz) Other Functions
automatically generated byinfo2html