我目前正在尝试调整存储在MySQL表中的值。存储的值包含一系列Unicode字符。我需要截断了价值储存的40个字节,但是当我尝试:MySQL截断命令 - 统一码字符
UPDATE `MYTABLE` SET `MYCOLUMN` = LEFT(`MYCOLUMN`, 40);
MySQL是过分热情,并保留40个字符,而不是40个字节。有没有办法解决这个问题?
的问候,并与感谢,
gaioshin
我目前正在尝试调整存储在MySQL表中的值。存储的值包含一系列Unicode字符。我需要截断了价值储存的40个字节,但是当我尝试:MySQL截断命令 - 统一码字符
UPDATE `MYTABLE` SET `MYCOLUMN` = LEFT(`MYCOLUMN`, 40);
MySQL是过分热情,并保留40个字符,而不是40个字节。有没有办法解决这个问题?
的问候,并与感谢,
gaioshin
我不太确定你是否真的想截断到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 ;
左边是字节安全的。
如何修改列数据类型,以便它只能保存40个字节。 MySQL会自动为你截断。
ALTER TABLE table_name
MODIFY column_name column_type_40_bytes;
只是改变了定义,但遗憾的是它没有工作 - 我似乎无法找到一个方法来强制MySQL定义它作为40个字节,而不是40个字符:( – Gaioshin 2010-02-03 19:41:29
工作在一个正确的解决方案,只是想快速给你的想法 – uuid0 2010-02-03 19:57:30
似乎现在的工作,调整“CHARACTER SET utf8”到你正在使用的那个 – uuid0 2010-02-03 20:08:16
酷超级 - 刚使用它,它似乎工作得很好 - 谢谢! – Gaioshin 2010-02-04 18:42:04