2010-02-03 111 views
2

我目前正在尝试调整存储在MySQL表中的值。存储的值包含一系列Unicode字符。我需要截断了价值储存的40个字节,但是当我尝试:MySQL截断命令 - 统一码字符

UPDATE `MYTABLE` SET `MYCOLUMN` = LEFT(`MYCOLUMN`, 40); 

MySQL是过分热情,并保留40个字符,而不是40个字节。有没有办法解决这个问题?

的问候,并与感谢,

gaioshin

回答

3

我不太确定你是否真的想截断到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 ; 
+0

工作在一个正确的解决方案,只是想快速给你的想法 – uuid0 2010-02-03 19:57:30

+0

似乎现在的工作,调整“CHARACTER SET utf8”到你正在使用的那个 – uuid0 2010-02-03 20:08:16

+0

酷超级 - 刚使用它,它似乎工作得很好 - 谢谢! – Gaioshin 2010-02-04 18:42:04

0

左边是字节安全的。

如何修改列数据类型,以便它只能保存40个字节。 MySQL会自动为你截断。

ALTER TABLE table_name 
    MODIFY column_name column_type_40_bytes; 
+0

只是改变了定义,但遗憾的是它没有工作 - 我似乎无法找到一个方法来强制MySQL定义它作为40个字节,而不是40个字符:( – Gaioshin 2010-02-03 19:41:29