現在、MySQL のテーブルに格納されている値を調整しようとしています。格納される値には、一連の Unicode 文字が含まれます。40バイト相当のストレージに切り詰める必要がありますが、試してみると:
UPDATE `MYTABLE` SET `MYCOLUMN` = LEFT(`MYCOLUMN`, 40);
MySQL は非常に役に立ち、 40バイトではなく40文字を保持します。これを回避する方法はありますか?
よろしくお願いします。
外王神
現在、MySQL のテーブルに格納されている値を調整しようとしています。格納される値には、一連の Unicode 文字が含まれます。40バイト相当のストレージに切り詰める必要がありますが、試してみると:
UPDATE `MYTABLE` SET `MYCOLUMN` = LEFT(`MYCOLUMN`, 40);
MySQL は非常に役に立ち、 40バイトではなく40文字を保持します。これを回避する方法はありますか?
よろしくお願いします。
外王神
正確に 40 バイトに切り詰める必要があるかどうかはよくわかりません。
Unicode 文字が台無しになる可能性があるため、条件は「最後の文字がまだ有効な状態で最大 40 バイト」にする必要があります。
そのためのストアド関数を作成します。それが機能するかどうかはわかりませんが、私のドリフトをキャッチすると思います:
DELIMITER &&&
CREATE FUNCTION MYTRUNCATE (subject VARCHAR(255) CHARACTER SET utf8, max_bytes INT UNSIGNED)
RETURNS VARCHAR(255) CHARACTER SET utf8
DETERMINISTIC
BEGIN
DECLARE byte_len INT;
DECLARE char_len INT;
DECLARE res VARCHAR(255) CHARACTER SET utf8;
SET res = LEFT(subject, max_bytes);
SET byte_len = BIT_LENGTH(res)/8;
SET char_len = CHAR_LENGTH(res);
WHILE byte_len > max_bytes DO
SET char_len = char_len - 1;
SET res = LEFT(res, char_len);
SET byte_len = BIT_LENGTH(res)/8;
END WHILE;
RETURN res;
END&&&
DELIMITER ;
LEFT はバイトセーフです。
列のデータ型を変更して、40 バイトしか保持できないようにするにはどうすればよいでしょうか。MySQL は自動的に切り捨てを行います。
ALTER TABLE table_name
MODIFY column_name column_type_40_bytes;