このセクションでは,(2)
の使用時に生じる可能性のある問題を取り上げ,既存の(2)
カラムを(4)
に変換するための情報にいて説明します。
(4)
と(2)
の値の内部範囲は同じですが(1901
から2155
,および0000
)、(2)
の表示幅は,表示値が内部値の最後の2桁しか示さず,世紀を表す最初の2桁を省略するので,その型があいまいになります。特定の状況下では情報が失われる結果になることもあります。このため,一年
デタ型が必要なときは必ず,アプリケション全体で(2)
の使用を避け,(4)
を使用するよう検討してください。MySQL 5.6.6以降では,4以外の表示値の一年
デタ型(特に(2)
)のサポートが縮小し,今後のリリースで完全に廃止される予定なので,ある時点で変換が必要になります。
年(2)の制限
(2)
データ型に関する問題には,表示値のあいまいさと,値のダンプおよびリロード時または文字列への変換時に情報損失の可能性があります。
(2)
の表示値はあいまいな場合があります。次の例で示すように,異なる内部値を持3(2)
値を同じ表示値にできます。CREATE TABLE t (y2 YEAR(2), y4 YEAR(4));查询OK, 0行影响(0.01秒)mysql> INSERT INTO t (y2) VALUES(1912),(2012),(2112);查询OK, 3 rows affected (0.00 sec) Records: 3 duplicate: 0 Warnings: 0 mysql> UPDATE t SET y4 = y2;查询OK, 3 rows affected (0.00 sec) rows matched: 3 Changed: 3 Warnings: 0 mysql> SELECT * FROM t;+------+------+ | y2 | y4 | +------+------+ | 12 | 1912 | | 2012 | | | | 2112 | +------+------+ 3行集(0.00秒)
, mysqldumpを使用して,前述の項目に作成されたテーブルをダンプする場合,ダンプファイルは,同じ2桁の表現(
12
を使用してすべてのy2
値を表します。ダンプファ邮箱ルからテ邮箱ブルをリロ邮箱ドした場合,邮箱すべての結果の行に内部値2012
と表示値12
を含まれるので,これらの違いが失われます。(2)
または(4)
デタ値を文字列形式に変換した場合,一年
型の表示幅が使用されます。(2)
と(4)
の両方のカラムに1970
の値が含まれるとします。それぞれのカラムを文字列に割り当てた結果,それぞれ“70”
と“1970”
の値になります。まり,(2)
から文字列への変換で情報の損失が起こります。1970
から2069
の範囲から外れた値は,CSV
テブルの(2)
カラムに挿入されるときに,間違って格納されます。たとえば,2111
を挿入すると,表示値は11
になりますが,内部値は2011
になります。
これらの問題を避けるには,(2)
ではなく(4)
を使用してください。移行戦略に関した提案は,このセクションで後述します。
MySQL 5.6のYEAR(2)サポトの縮小
MySQL 5.6.6以降で,(2)
のサポトは縮小されます。
新しいテブルの
(2)
カラム定義は,(4)
に(警告付きで)変換されます。CREATE TABLE t1 (y YEAR(2));查询好,0行影响,1警告(0.03秒)mysql >显示警告\ G *************************** 1。行 *************************** 级别:警告代码:1818年(2)列类型信息:弃用。改为创建YEAR(4)列。1行组(0.00秒)mysql >显示创建表t1 \ G *************************** 1。Create Table ' t1 ' (' y ' year(4) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
既存のテブルの
(2)
は(2)
として残され,古いバジョンのMySQLと同様にクエリ。ただし,複数のプログラムまたはステ,トメントが,(2)
を(4)
に自動的に変換します。テブルの再構築を招く
ALTER TABLE
ステトメント。修理表
((2)
カラムがテブルに含まれることが检查表
で検出された場合に,使用するように推奨されます)。mysql_upgrade(
修理表
を使用します)。, mysqldumpでのダンプおよびダンプファ邮箱ルのリロ邮箱ド。上記の3の項目が実行する変換とは異なり,ダンプとリロドは値を変更する可能性があります。
MySQLアップグレドでは通常,最後の2の項目のう少なくとも1を含みます。ただし,
(2)
にいてはmysql_upgradeをお勧めします。前述のように値を変更する可能性があるので,, mysqldumpは使用しないでください。
年(2)から年(4)への移行
(2)
カラムを(4)
に変換するには,手動でアップグレ。または,(2)
のサポートが縮小したバージョンのMySQL (MySQL 5.6.6以降)にアップグレードしてから,MySQLで(2)
カラムを自動的に変換できます。後者の場合は,デタのダンプとリロドによるアップグレドは行わないでください。デタ値を変更する可能性があります。さらに,レプリケ,ションを使用する場合は,注意の必要なアップグレ,ドに関する考慮事項があります。
(2)
カラムを(4)
に手動で変換するには,ALTER TABLE
を使用してください。テブルt1
に次の定義があるとします。
CREATE TABLE t1 (ycol YEAR(2) NOT NULL DEFAULT '70');
次のようにALTER TABLE
を使用してカラムを変更します。必ず,非空
や默认的
などのすべてのカラム属性を含めてください。
修改表1:修改ycol YEAR(4) NOT NULL DEFAULT '1970';
ALTER TABLE
ステトメントは,(2)
値を変更しないでテブルを変換します。サバがレプリケションマスタである場合,ALTER TABLE
ステトメントはスレブに複製され,各対応するテブルを変更します。
別の移行方法では、バ。デタのダンプおよびリロドを行わないでMySQL 5.6.6以降を。続いて,mysql_upgradeを実行します。これは,修理表
を使用して,デタ値を変更しないで(2)
カラムを(4)
に変換します。サバがレプリケションマスタである場合,——skip-write-binlog
オプションを付けてmysql_upgradeを呼び出さないかぎり,修理表
ステトメントはスレブに複製され,各対応するテブルを変更します。
レプリケーションサーバーへのアップグレードでは通常,新しいバージョンのMySQLへのスレーブのアップグレードと,マスターのアップグレードが行われます。たとえば,マスターとスレーブの両方で MySQL 5.5 が実行している場合、通常のアップグレードシーケンスでは、スレーブを 5.6 にアップグレードしてからマスターを 5.6 にアップグレードします。MySQL 5.6.6 以降での(2)
の異なる扱いに関しては,このアップグレドシケンスにより問題が生じます。スレブがアップグレドされているが,マスタがまだアップグレドされていないとします。この場合,マスタ上に(2)
カラムを含んだテブルを作成すると,スレブ上では(4)
カラムを含むテブルが作成されます。この結果,ステートメントベースのレプリケーションを使用した場合,これらの操作はマスターとスレーブで異なる結果になります。
数値
0
の挿入。結果の値は,マスタ上では2000
の内部値になりますが,スレブ上では0000
の内部値になります。文字列への
(2)
の変換。この操作は,マスタ上では(2)
の表示値を使用しますが,スレブ上では(4)
の表示値を使用します。
このような問題を避けるには,次の戦略のいずれかを使用します。
ステトメントベスのレプリケ。
アップグレド前に,マスタ上のすべての
(2)
カラムを(4)
に変更します。(前述のようにALTER TABLE
を使用します.)続いて,(2)
から(4)
の移行でマスターとスレーブ間で違いが生じることなく,通常どおりに(最初にスレーブ,次にマスター)アップグレードできます)。
, mysqldumpでデータをダンプし,アップグレードしたあとにダンプファイルをリロードするという移行方法は使用しないでください。前述のように,これは(2)
値を変更する可能性があります。
(2)
から(4)
への移行では,次のような条件下で動作が変更された可能性がないかどうかアプリケーションコードの検査も行う必要があります。
一年
カラムを選択すれば正確に2桁が生成されると予想しているコド。0
を(2)
または(4)
に挿入すると,それぞれ2000
または0000
の内部値になるという,数値0
の挿入に対する別々の処理に対応していないコド。