Latin-1转UTF-8数据库

10
我有一个数据库,它的编码方式是uft8_general_ci,唯一的问题是之前的开发人员编写的应用程序似乎在使用latin-1的方式与该数据库交互。
我已经更改了应用程序使用数据库的方式,现在可以将umlaut存储为umlaut,而不是ü。但问题是,该应用程序从数据库中读取以前存在的数据时,会显示为(例如)'Süddeutsche'而不是'Süddeutsche'。
是否有任何方法可以将数据库中的数据从一种格式转换为另一种格式?
谢谢。
ALTER TABLE TableName MODIFY ColumnName ColumnType CHARACTER SET latin1;
ALTER TABLE TableName MODIFY ColumnName ColumnType CHARACTER SET binary;
ALTER TABLE TableName MODIFY ColumnName ColumnType CHARACTER SET utf8;

这对我很有帮助。

谢谢,虽然不完全一样但是答案可行! - mr12086
经过一些测试,如果我在某些列上运行这个命令两次,数据将会被破坏 - 特定字符/点之后的所有数据都会丢失。这是因为我运行了两次命令,还是有可能它正在破坏数据库中的大量数据? - mr12086
4个回答

2

您可以尝试使用SET NAMES命令,让数据库在与应用程序交互时使用latin-1编码,而将数据存储为utf-8编码;否则,您需要将所有之前的数据集转换为utf-8字符串。


1

尝试

ALTER DATABASE your_db DEFAULT CHARACTER SET = 'utf8' COLLATE 'utf8_unicode_ci';

并且

ALTER TABLE a CONVERT TO CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci';

ALTER TABLE b CONVERT TO CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci';
ALTER TABLE c CONVERT TO CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci';

不要忘记替换 'ß':

UPDATE a SET field_1 = REPLACE(field_1, 'ß', 'ss') WHERE label LIKE '%ß%';

1

0
这是我在我的数据库中使用的一个SQL函数,用于将所有数据编码从latin1转换为UTF8:
DELIMITER //

CREATE PROCEDURE UpdateColumnEncoding(IN db_name VARCHAR(255))
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE tableName VARCHAR(255);
    DECLARE columnName VARCHAR(255);
    DECLARE cur CURSOR FOR 
        SELECT TABLE_NAME, COLUMN_NAME
        FROM information_schema.COLUMNS
        WHERE TABLE_SCHEMA = db_name 
          AND DATA_TYPE IN ('char', 'varchar', 'text', 'tinytext', 'mediumtext', 'longtext');
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO tableName, columnName;
        IF done THEN
            LEAVE read_loop;
        END IF;

        SET @s = CONCAT('UPDATE `', tableName, '` SET `', columnName, '` = CONVERT(CAST(CONVERT(`', columnName, '` USING latin1) AS BINARY) USING UTF8)');
        PREPARE stmt FROM @s;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP;

    CLOSE cur;
END //

DELIMITER ;

CALL UpdateColumnEncoding('your_database_name');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接