11.3.4 YEAR (2)의 제한 및 YEAR (4)로 전환
이 섹션에서는 YEAR(2) 를 사용할 때 발생할 수있는 문제를 거론 기존 YEAR(2) 컬럼을 YEAR(4) 로 변환하기위한 정보를 제공합니다.
YEAR(4) 와 YEAR(2) 의 값의 내부 범위는 같지만 ( 1901 에서 2155 및 0000 ), YEAR(2) 의 표시 폭은 표시 값이 내부 값의 마지막 두 자리 만 표시하고, 세기를 나타내는 최초의 2 자리를 생략하기 때문에 그 형태가 모호합니다. 특정 상황에서 정보가 손실되는 결과가 될 수도 있습니다. 따라서 YEAR 데이터 형식이 필요할 때마다 응용 프로그램 전체에서 YEAR(2) 의 사용을 피하고 YEAR(4) 를 사용하도록 고려하십시오. MySQL 5.6.6 이후에서는 4 이외의 표시 값 YEAR 데이터 형 (특히 YEAR(2) )의 지원을 축소하고 향후 릴리스에서 완전히 제거 될 예정이므로, 어느 시점 변환이 필요합니다 .
YEAR (2) 제한
YEAR(2) 데이터 형 문제는 표시 값의 모호성과 가치 덤프 및 리로드시 또는 문자열로 변환 할 때 정보 손실의 가능성이 있습니다.
YEAR(2)의 표시 값은 모호한 경우가 있습니다. 다음의 예와 같이 다른 내부 값을 가진 최대 3 개의YEAR(2)값을 같은 표시 값으로 할 수 있습니다.mysql>
CREATE TABLE t (y2 YEAR(2), y4 YEAR(4));Query OK, 0 rows affected (0.01 sec) mysql>INSERT INTO t (y2) VALUES(1912),(2012),(2112);Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>UPDATE t SET y4 = y2;Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql>SELECT * FROM t;+------+------+ | y2 | y4 | +------+------+ | 12 | 1912 | | 12 | 2012 | | 12 | 2112 | +------+------+ 3 rows in set (0.00 sec)mysqldump를 사용하여 위의 항목에 작성된 테이블을 덤프하는 경우 덤프 파일은 같은 2 자리 표현 (
12)를 사용하여 모든y2값을 나타냅니다. 덤프 파일에서 테이블을 다시로드하면 모든 결과 행 내부 값2012과 표시 값12를 포함되기 때문에 이러한 차이가 없어집니다.YEAR(2)또는YEAR(4)데이터 값을 문자열 표현으로 변환하는 경우YEAR형의 표시 폭이 사용됩니다.YEAR(2)와YEAR(4)의 두 컬럼에1970값이 포함된다고합니다. 각각의 컬럼을 문자열에 할당 한 결과 각각'70'과'1970'의 값이됩니다. 즉,YEAR(2)에서 문자열로 변환 할 정보의 손실이 발생합니다.1970에서2069의 범위에서 벗어난 값은CSV테이블YEAR(2)컬럼에 삽입 될 때 잘못 저장됩니다. 예를 들어,2111을 삽입하면 표시 값은11입니다 만, 내부 값은2011입니다.
이러한 문제를 방지하려면 YEAR(2) 대신 YEAR(4) 를 사용하십시오. 마이그레이션 전략에 관한 제안은이 섹션 뒷부분합니다.
MySQL 5.6의 YEAR (2) 지원의 축소
MySQL 5.6.6 이후로 YEAR(2) 의 지원은 축소됩니다.
새 테이블
YEAR(2)컬럼 정의는YEAR(4)에 (경고와 함께) 변환됩니다.mysql>
CREATE TABLE t1 (y YEAR(2));Query OK, 0 rows affected 1 warning (0.03 sec) mysql>SHOW WARNINGS\G*************************** 1. row ******************** ******* Level : Warning Code : 1818 Message : YEAR (2) column type is deprecated. Creating YEAR (4) column instead. 1 row in set (0.00 sec) mysql>SHOW CREATE TABLE t1\G*************************** 1. row ******************** ******* Table : t1 Create Table : CREATE TABLE`t1` ( `y` year (4) DEFAULT NULL ) ENGINE = InnoDB DEFAULT CHARSET = latin1 1 row in set (0.00 sec)기존 테이블
YEAR(2)는YEAR(2)로 남아 이전 버전의 MySQL과 마찬가지로 쿼리에서 처리됩니다. 그러나 여러 프로그램 또는 문이YEAR(2)를YEAR(4)로 자동 변환합니다.테이블 재구성을 초래
ALTER TABLE문.REPAIR TABLE(YEAR(2)컬럼이 테이블에 포함될 수CHECK TABLE에서 감지 된 경우에 사용하도록 권장됩니다).mysql_upgrade (
REPAIR TABLE을 사용합니다).mysqldump로 덤프 및 덤프 파일 다시로드합니다. 위의 3 가지 항목이 수행하는 변환과는 달리, 덤프 및 리로드 값을 변경할 수 있습니다.
MySQL 업그레이드는 일반적으로 마지막 두 항목 중 적어도 하나를 포함합니다. 그러나
YEAR(2)에 대해서는 mysql_upgrade를 권장합니다. 전술 한 바와 같이 값을 변경할 수 있으므로, mysqldump는 사용하지 마십시오.
YEAR (2)에서 YEAR (4)로 전환
YEAR(2) 컬럼을 YEAR(4) 로 변환하려면 수동으로 업그레이드없이 언제든지 가능합니다. 또는 YEAR(2) 의 지원이 축소 된 버전의 MySQL (MySQL 5.6.6 이후)으로 업그레이드 한 후 MySQL에서 YEAR(2) 컬럼을 자동으로 변환 할 수 있습니다. 후자의 경우는 데이터의 덤프 및 리로드에 의한 업그레이드하지 마십시오. 데이터 값을 변경할 수 있습니다. 또한 복제를 사용하는 경우는주의를 요하는 업그레이드 고려 사항이 있습니다.
YEAR(2) 컬럼을 YEAR(4) 수동으로 변환하려면 ALTER TABLE 을 사용하십시오. 테이블 t1 에 다음의 정의가 있다고합니다.
CREATE TABLE t1 (ycol YEAR (2) NOT NULL DEFAULT '70');
다음과 같이 ALTER TABLE 을 사용하여 열을 변경합니다. 반드시 NOT NULL 과 DEFAULT 등의 모든 컬럼 속성을 포함해야합니다.
ALTER TABLE t1 MODIFY ycol YEAR (4) NOT NULL DEFAULT '1970';
ALTER TABLE 문은 YEAR(2) 값을 변경하지 않고 테이블을 변환합니다. 서버가 복제 마스터 인 경우, ALTER TABLE 문은 슬레이브에 복제 된 각 대응하는 테이블을 변경합니다.
다른 이동 방법은 바이너리 업그레이드를 실행합니다. 데이터 덤프 및 리로드하지 않고 MySQL 5.6.6 이상을 설치합니다. 이어 mysql_upgrade를 실행합니다. 이것은 REPAIR TABLE 을 사용하여 데이터 값을 변경하지 YEAR(2) 컬럼을 YEAR(4) 로 변환합니다. 서버가 복제 마스터 인 경우, --skip-write-binlog 옵션으로 mysql_upgrade를 호출하지 않는 한, REPAIR TABLE 문은 슬레이브에 복제 된 각 대응하는 테이블을 변경합니다.
복제 서버로 업그레이드는 일반적으로 새로운 버전의 MySQL의 노예 업그레이드와 마스터의 업그레이드가 이루어집니다. 예를 들어, 마스터와 슬레이브에 MySQL 5.5를 실행하는 경우, 통상의 업그레이드 순서는 슬레이브을 5.6로 업그레이드 한 후 마스터를 5.6로 업그레이드합니다. MySQL 5.6.6 이상에서 YEAR(2) 다른 취급에 관해서는이 업그레이드 순서에 따라 문제가 발생합니다. 슬레이브가 업그레이드되어 있지만, 주인이 아직 업그레이드되지 않는다고합니다. 이 경우 마스터에 YEAR(2) 컬럼을 포함한 테이블을 작성하면 슬레이브에서는 YEAR(4) 컬럼을 포함하는 테이블이 생성됩니다. 따라서 문 기반 복제를 사용하면 이러한 작업은 마스터와 슬레이브로 다른 결과입니다.
숫자
0의 삽입. 결과 값은 마스터에서는2000의 내부 값되지만 슬레이브에서는0000의 내부 값입니다.문자열에
YEAR(2)의 변환. 이 작업은 마스터에서는YEAR(2)의 표시 값을 사용하지만, 슬레이브에서는YEAR(4)의 표시 값을 사용합니다.
이러한 문제를 피하려면 다음 전략 중 하나를 사용합니다.
문 기반 복제 대신 행 기반 복제를 사용합니다.
업그레이드 전에 마스터의 모든
YEAR(2)컬럼을YEAR(4)로 변경합니다. (전술 한 바와 같이ALTER TABLE을 사용합니다.) 이어YEAR(2)에서YEAR(4)마이그레이션 마스터와 슬레이브간에 차이가 발생하지 않고 정상적으로 (먼저 슬레이브 다음 마스터 ) 업그레이드 할 수 있습니다).
mysqldump로 데이터를 덤프하고 업그레이드 한 후에 덤프 파일을 다시로드하는 전환 방법은 사용하지 마십시오. 전술 한 바와 같이, 이것은 YEAR(2) 값을 변경할 수 있습니다.
YEAR(2) 에서 YEAR(4) 로 전환에서는 다음과 같은 조건에서 동작이 변경되었을 가능성이 있는지 응용 프로그램 코드의 검사도해야합니다.
YEAR컬럼을 선택하면 정확히 2 자리가 생성 될 것으로 예상하고있다 코드.0을YEAR(2)또는YEAR(4)에 삽입하면 각각2000또는0000의 내부 값이된다는 숫자0의 삽입에 대한 별도의 처리에 대응하지 않는 코드.