修复破坏的UTF8字符MYSQL

时间:2011-06-13 20:12:41

标签: mysql database-design utf-8 internationalization

我正在尝试执行一个能够转换损坏的UTF8字符的过程。这是我的SP:

CREATE DEFINER=`root`@`localhost` PROCEDURE `conversorUTF8`()
BEGIN

DECLARE con_id, con_apellido, con_direccion VARCHAR (60);
DECLARE done INT DEFAULT 0;

DECLARE CID CURSOR FOR SELECT id, direccion FROM alumnos;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DECLARE exit handler for sqlexception rollback; 
DECLARE exit handler for sqlwarning rollback;


OPEN CID;

read_loop: LOOP
    FETCH CID into con_id, con_direccion;
    IF done THEN 
        LEAVE read_loop;
    END IF;

    CASE WHEN (SELECT CONVERT(CONVERT(CONVERT(con_direccion USING latin1)using binary)using utf8)) IS NOT NULL THEN
        UPDATE alumnos SET direccion=CONVERT(CONVERT(CONVERT(con_direccion USING latin1)using binary)using utf8) where id = con_id ;

    END CASE;
END LOOP;

CLOSE CID;

END

问题是:当我已经使用'á','é'等转换了字符串,并且我尝试再次转换该字符串时,更新失败并出现此错误:

UPDATE alumnos SET direccion=CONVERT(CONVERT(CONVERT(con_direccion USING latin1)using binary)using utf8) where id = con_id ; 

Invalid utf8 character string.

这就是我的案例声明:

CASE WHEN (SELECT CONVERT(CONVERT(CONVERT(con_direccion USING latin1)using binary)using utf8)) IS NOT NULL THEN

但事情仍然失败。

任何提示?

这里是解决方案:

alter table alumnos change direccion direccion VARCHAR(100) CHARACTER SET latin1;
alter table alumnos change direccion direccion VARBINARY(100);
alter table alumnos change direccion direccion VARCHAR(100) CHARACTER SET utf8;

谢谢:)

1 个答案:

答案 0 :(得分:2)

我可能读错了,但是......如果你的列是utf8字符串,存储为latin1(通常是瑞典语,那个)列,你改变你的表,以便列使用新的字符集和新的整理规则,然后:

  1. 您尚未更改生产中的表格......

    在这种情况下,请直接跳至WP documentation了解如何操作。

  2. 已更改的表已在生产中......

    在这种情况下,您只会转换表的一部分 - 更改发生之前的部分。如果不这样做,可能会收到错误消息,例如您在转换非ascii字符时获得的错误消息。 (您可以使用几个正则表达式检测utf8损坏的字符串。)