我目前正在尝试调整存储在 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 字符,因此条件应该是“最后一个字符仍然有效的 MAX 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;