2017-12-13 18 views
0

私は1億5000万行以上のMySQLテーブルtを持っています。列の1つ(c)は、VARCHAR(64)で、64桁の16進数を含んでいます。スペースを節約して物事をより速くするために、私はヘックスをデコードしてBINARY(32)のコラムに変えたいと思っていました。ALTER TABLEを使用してMySQLのBINARYカラムを切り捨てる

私の計画は3つのクエリを使用することでした:

  1. ALTER TABLE t CHANGE c c BINARY(64) NOT NULL;

  2. UPDATE t SET c=UNHEX(c);

  3. ALTER TABLE t CHANGE c c BINARY(32) NOT NULL;

最初の2は完全に働いたが、第三のクエリにし私はゲットですエラーをINGの:

#1265 - Data truncated for column 'c' at row 1

私はデータを切り捨てていますことを理解し、それは私が望むまさにです。 BINARY(64)の末尾にある32 0x00バイトを取り除き、BINARY(32)にします。

物事は私が試してみた:

  • UPDATE t SET c=LEFT(c, 32);は全く何もしていないようでした。

  • ALTER IGNORE TABLEを使用すると、構文エラーが発生します。あなたはグローバル変数sql_modeからSTRICT_TRANS_TABLESフラグを削除する必要があり#1265 - Data truncated for column ...エラーを回避するには

答えて

0

。私は切り捨て終わりだ後

安全のためSET GLOBAL sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

が、私はstrictモードを再度有効にします:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

は、だから私はこのクエリを実行しました:

クエリSHOW VARIABLES LIKE 'sql_mode';は私を与えました列。

関連する問題