12.10 캐스트 함수와 연산자
표 12.14 캐스트 함수
| 이름 | 설명 |
|---|---|
BINARY | 문자열을 바이너리 문자열로 변환합니다 |
CAST() | 값을 특정 형태로 캐스팅합니다 |
CONVERT() | 값을 특정 형태로 캐스팅합니다 |
BINARYBINARY연산자는 연속적인 문자열을 바이너리 문자열로 변환합니다. 이것은 컬럼의 비교를 문자별로하는 것이 아니라 바이트마다 강제로 실행시키는 간단한 방법입니다. 그러면 열이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은strCAST(의 약자입니다.strAS BINARY)일부 컨텍스트에서는 인덱스의 컬럼을
BINARY에 캐스트하면 MySQL은 인덱스를 효율적으로 사용할 수 없습니다.CAST(exprAStype)CONVERT()와 마찬가지로,CAST()함수는 모든 유형의식이 지정되어 지정된 형태의 결과 값이 생성됩니다. 자세한 내용은CONVERT()의 설명을 참조하십시오.CONVERT(,expr,type)CONVERT(exprUSINGtranscoding_name)CONVERT()및CAST()함수는 모든 유형의식이 지정되어 지정된 형태의 결과 값이 생성됩니다.결과의
type다음 값 중 하나를 지정할 수 있습니다.BINARY[(N)]CHAR[(N)]DATEDATETIMEDECIMAL[(M[,D])]SIGNED [INTEGER]TIMEUNSIGNED [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_colUSING 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 과 같습니다. strCAST( 는 수식은 기본 문자 집합을 가진 문자열로 처리됩니다. 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_DATESQL 모드가 활성화 될 때 경고를 발행합니다.정수의 뺄셈은
NO_UNSIGNED_SUBTRACTIONSQL 모드가 활성화되어있는 경우 피연산자 중 하나가 부호 없음에도 결과가 부호 첨부합니다.
자세한 내용은 섹션 5.1.7 "서버 SQL 모드" 를 참조하십시오.