我正在尝试执行一个能够转换损坏的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;
谢谢:)
答案 0 :(得分:2)
我可能读错了,但是......如果你的列是utf8字符串,存储为latin1(通常是瑞典语,那个)列,你改变你的表,以便列使用新的字符集和新的整理规则,然后:
您尚未更改生产中的表格......
在这种情况下,请直接跳至WP documentation了解如何操作。
已更改的表已在生产中......
在这种情况下,您只会转换表的一部分 - 更改发生之前的部分。如果不这样做,可能会收到错误消息,例如您在转换非ascii字符时获得的错误消息。 (您可以使用几个正则表达式检测utf8损坏的字符串。)