12.10 캐스트 함수와 연산자
표 12.14 캐스트 함수
이름 | 설명 |
---|---|
BINARY | 문자열을 바이너리 문자열로 변환합니다 |
CAST() | 값을 특정 형태로 캐스팅합니다 |
CONVERT() | 값을 특정 형태로 캐스팅합니다 |
BINARY
BINARY
연산자는 연속적인 문자열을 바이너리 문자열로 변환합니다. 이것은 컬럼의 비교를 문자별로하는 것이 아니라 바이트마다 강제로 실행시키는 간단한 방법입니다. 그러면 열이BINARY
또는BLOB
로 정의되지 않은 경우에도 비교에서 대소 문자를 구분합니다. 또한,BINARY
는 말미의 공백이 중요합니다.mysql>
SELECT 'a' = 'A';
-> 1 mysql>SELECT BINARY 'a' = 'A';
-> 0 mysql>SELECT 'a' = 'a ';
-> 1 mysql>SELECT BINARY 'a' = 'a ';
-> 0비교시
BINARY
의해 연산 전체가 영향을받습니다. 이 같은 결과를 가질 피연산자 앞에 지정할 수 있습니다.BINARY
은str
CAST(
의 약자입니다.str
AS BINARY)일부 컨텍스트에서는 인덱스의 컬럼을
BINARY
에 캐스트하면 MySQL은 인덱스를 효율적으로 사용할 수 없습니다.CAST(
expr
AStype
)CONVERT()
와 마찬가지로,CAST()
함수는 모든 유형의식이 지정되어 지정된 형태의 결과 값이 생성됩니다. 자세한 내용은CONVERT()
의 설명을 참조하십시오.CONVERT(
,expr
,type
)CONVERT(
expr
USINGtranscoding_name
)CONVERT()
및CAST()
함수는 모든 유형의식이 지정되어 지정된 형태의 결과 값이 생성됩니다.결과의
type
다음 값 중 하나를 지정할 수 있습니다.BINARY[(
N
)]CHAR[(
N
)]DATE
DATETIME
DECIMAL[(
M
[,D
])]SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
BINARY
는BINARY
데이터 형의 문자열을 생성합니다. 이에 따른 비교에 미치는 영향에 대해서는 섹션 11.4.2 "BINARY 및 VARBINARY 형" 을 참조하십시오. 옵션의 길이N
이 지정된 경우,BINARY(
을 사용하면 캐스트N
)N
바이트의 인수 밖에 사용되지 않습니다. 값이N
바이트보다 짧은 경우N
의 길이가 될 때까지0x00
바이트로 패딩됩니다.CHAR(
어구를 사용하면 캐스트N
)N
문자의 인수 밖에 사용되지 않습니다.CAST()
와CONVERT(... USING ...)
은 표준 SQL 구문입니다.USING
형식 이외의CONVERT()
는 ODBC 구문입니다.USING
함께CONVERT()
을 사용하면 다양한 문자 집합간에 데이터가 변환됩니다. MySQL에서는 트랜스 코딩 이름은 해당 문자 집합 이름과 동일합니다. 예를 들어,이 문은 기본 문자 집합의 문자열'abc'
를utf8
문자 집합의 해당 문자열로 변환합니다.SELECT CONVERT ( 'abc'USING utf8);
이진 문자열은 문자 세트가없고, 대문자와 소문자의 구별의 개념도 없기 때문에 일반적으로 대문자와 소문자가 구별되지 않는 방법으로, BLOB
값 또는 기타 이진 문자열을 비교할 수 없습니다. 대문자와 소문자가 구별되지 않는 비교를 수행하려면 CONVERT()
함수를 사용하여 값을 비 이진 문자열로 변환합니다. 결과의 비교는 문자열 데이터 정렬이 사용됩니다. 예를 들어, 결과의 문자 세트에 대소 문자를 구분하지 않는 데이터 정렬이 포함 된 경우 LIKE
연산자에서 대소 문자를 구분하지 않습니다.
SELECT 'A'LIKE CONVERT ( blob_col
USING latin1) FROM tbl_name
;
다른 문자 집합을 사용하려면 위의 문장 latin1
에 이름을 할당합니다. 변환 된 문자열에 특정 데이터 정렬을 지정하려면 섹션 10.1.9.2 "CONVERT ()와 CAST ()" 에서 설명하는 바와 같이, CONVERT()
호출 다음에 COLLATE
절을 사용합니다 . 예를 들어, latin1_german1_ci
를 사용하는 경우는 다음과 같습니다.
SELECT 'A'LIKE CONVERT (blob_col
USING latin1) COLLATE latin1_german1_ci FROMtbl_name
;
CONVERT()
는 서로 다른 문자 집합으로 표시되는 문자열을 비교할 때보다 일반적으로 사용할 수 있습니다.
LOWER()
(와 UPPER()
)를 바이너리 문자열 ( BINARY
, VARBINARY
, BLOB
)에 적용해도 아무런 효과가 없습니다. 대 / 소문자 변환을 실행하려면 이진 문자열을 비 이진 문자열로 변환합니다.
mysql>SET @str = BINARY 'New York';
mysql>SELECT LOWER(@str), LOWER(CONVERT(@str USING latin1));
+-------------+-----------------------------------+ | LOWER(@str) | LOWER(CONVERT(@str USING latin1)) | +-------------+-----------------------------------+ | New York | new york | +-------------+-----------------------------------+
캐스트 함수는 CREATE TABLE ... SELECT
문에서 특정 형태를 가지는 컬럼을 만들 때 도움이됩니다.
CREATE TABLE new_table SELECT CAST ( '2000-01-01'AS DATE);
이 함수는 ENUM
컬럼을 사전 순으로 정렬 할 때 도움이 될 수 있습니다. 보통 ENUM
컬럼 정렬은 내부 수치를 사용하여 수행됩니다. 값을 CHAR
로 캐스팅하면 어휘 순으로 정렬됩니다.
SELECT enum_col
FROM tbl_name
ORDER BY CAST ( enum_col
AS CHAR);
CAST(
는 str
AS BINARY)BINARY
과 같습니다. str
CAST(
는 수식은 기본 문자 집합을 가진 문자열로 처리됩니다. expr
AS CHAR)
CONCAT('Date: ',CAST(NOW() AS DATE))
와 같이 복잡한 수식의 일부로 사용하는 경우에도 CAST()
의 결과가 달라집니다.
데이터를 다른 형식으로 추출하려면 CAST()
대신 대신 LEFT()
또는 EXTRACT()
와 같은 문자열 함수를 사용하십시오. 섹션 12.7 "날짜 및 시간 함수" 를 참조하십시오.
숫자 컨텍스트에서 문자열을 숫자로 변환하려면 일반적으로 문자열 값을 숫자처럼 사용하는 것 외에 아무것도 할 필요가 없습니다.
mysql> SELECT 1+'1';
-> 2
산술 연산에서 문자열을 사용하는 경우는 식의 평가시에 부동 소수점 숫자로 변환됩니다.
문자열의 컨텍스트에서 숫자를 사용하는 경우 자동으로 숫자가 문자열로 변환됩니다.
mysql> SELECT CONCAT('hello you ',2);
-> 'hello you 2'
MySQL 5.6.4 이전에서는 어떤 테이블도 선택되지 않는 문 TIMESTAMP
값에 명시 적으로 CAST()
를 사용하면 변환이 실행되기 전에 그 값이 MySQL 5.6에서 문자열로 처리됩니다 . 이렇게하면 값을 수치 형으로 변환하면 다음과 같이 값이 잘립니다.
mysql>SELECT CAST(TIMESTAMP '2014-09-08 18:07:54' AS SIGNED);
+-------------------------------------------------+ | CAST(TIMESTAMP '2014-09-08 18:07:54' AS SIGNED) | +-------------------------------------------------+ | 2014 | +-------------------------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql>SHOW WARNINGS;
+---------+------+----------------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: '2014-09-08 18:07:54' | +---------+------+----------------------------------------------------------+ 1 row in set (0.00 sec)
다음과 같이 이것은 테이블에서 행을 선택하는 경우에는 적용되지 않습니다.
mysql>USE test;
Database changed mysql>CREATE TABLE c_test (col TIMESTAMP);
Query OK, 0 rows affected (0.07 sec) mysql>INSERT INTO c_test VALUES ('2014-09-08 18:07:54');
Query OK, 1 row affected (0.05 sec) mysql>SELECT col, CAST(col AS UNSIGNED) AS c_col FROM c_test;
+---------------------+----------------+ | col | c_col | +---------------------+----------------+ | 2014-09-08 18:07:54 | 20140908180754 | +---------------------+----------------+ 1 row in set (0.00 sec)
MySQL 5.6.4 이후에서는 다음과 같이 어떤 줄도 선택되지 않은 쿼리에서도 선택되는 경우와 같이 CAST ()에서 TIMESTAMP 값이 처리됩니다.
mysql> SELECT CAST(TIMESTAMP '2014-09-08 18:07:54' AS SIGNED);
+-------------------------------------------------+
| CAST(TIMESTAMP '2014-09-08 18:05:07' AS SIGNED) |
+-------------------------------------------------+
| 20140908180754 |
+-------------------------------------------------+
1 row in set (0.00 sec)
숫자에서 문자열의 암시 적 변환은 섹션 12.2 "수식 계산에서의 타입 변환" 을 참조하십시오.
MySQL 그럼, 부호 첨부와 부호 없음 모두 64 비트 값을 사용하여 연산을 지원하고 있습니다. 수치 연산자 ( +
또는 -
)를 사용하고, 피연산자 중 하나가 부호없는 정수이면, 디폴트의 결과가 부호없이됩니다 ( 섹션 12.6.1 "산술 연산자" 를 참조 하십시오). 이것은 SIGNED
또는 UNSIGNED
캐스트 연산자를 사용하여 값을 각각 부호있는 또는 부호없는 64 비트 정수로 변환하여 재정의 할 수 있습니다.
mysql>SELECT CAST(1-2 AS UNSIGNED);
-> 18446744073709551615 mysql>SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
-> -1
피연산자 중 하나가 부동 소수점 값이면 결과가 부동 소수점 값이 위의 규칙에 의한 영향을받지 않습니다. (이 맥락에서 DECIMAL
컬럼 값은 부동 소수점 값으로 간주됩니다.)
mysql> SELECT CAST(1 AS UNSIGNED) - 2.0;
-> -1.0
SQL 모드 변환 연산의 결과에 영향을 미칩니다. 예 :
"zero"날짜 문자열을 날짜로 변환 할 때
CONVERT()
와CAST()
는NULL
을 반환NO_ZERO_DATE
SQL 모드가 활성화 될 때 경고를 발행합니다.정수의 뺄셈은
NO_UNSIGNED_SUBTRACTION
SQL 모드가 활성화되어있는 경우 피연산자 중 하나가 부호 없음에도 결과가 부호 첨부합니다.
자세한 내용은 섹션 5.1.7 "서버 SQL 모드" 를 참조하십시오.