我正在尝试做一个能够转换损坏的 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;
谢谢:)
最佳答案
我可能读错了,但是......如果你的列是存储为 latin1(通常是瑞典语)列的 utf8 字符串,并且你更改了你的表,以便该列使用新的字符集和新的排序规则,然后:
您尚未在生产环境中更改表...
在这种情况下,直接跳转到 WP documentation关于如何去做。
修改后的表已经在生产中...
在这种情况下,您将只转换表的一部分——更改发生之前的部分。如果不这样做,您可能会收到错误消息,就像您在来回转换非 ascii 字符时收到的错误消息一样。 (您可以使用几个正则表达式来检测带有损坏的 utf8 的字符串。)
关于mysql - 修复损坏的 UTF8 字符 MYSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6335775/