【问题标题】:How do I change a MySQL table to UTF-8?如何将 MySQL 表更改为 UTF-8?
【发布时间】:2011-02-23 14:28:50
【问题描述】:

我知道表和数据库的语言有很多设置。

我已经创建了数据库。我相信当我创建它时,它是默认的/LATIN。我想改变一切——我的意思是...表和数据库都改为 UTF-8

我该怎么做?谢谢。

【问题讨论】:

    标签: mysql database encoding utf-8


    【解决方案1】:
    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;
    

    【讨论】:

    • 我认为这个答案并不完整。据我了解,这将尝试将所有列转换为给定的字符集,但可能会或可能不会更改表默认值。它也没有解决数据库默认值。我会将我的方法作为单独的答案发布
    • 澄清一下,这个命令确实改变了表的默认值,但不影响数据库的默认值。
    【解决方案2】:

    看看Using alter command to change character set

    另一个有用的链接:http://dev.mysql.com/doc/refman/5.0/en/charset-table.html

    一般形式是

    ALTER DATABASE db_name
        [[DEFAULT] CHARACTER SET charset_name]
        [[DEFAULT] COLLATE collation_name]
    

    对于表中的特定列

    ALTER TABLE column COLLATE utf8_general_ci
    

    【讨论】:

    • Developer-Sid 的答案,加上这个答案,形成一个完整的答案
    【解决方案3】:

    aioobe 的回答讲述了如何更改数据库、表或列的字符集。你应该记住

    • 为表设置字符集只是为该表中的新列指定默认字符集。它不会更改预先存在的列的字符集;您必须单独执行这些列,或者如果要将表中的每个字符串类型列更改为相同的字符集,则可以使用一个命令来执行此操作:“alter table ... 转换为字符集”( http://dev.mysql.com/doc/refman/5.1/en/alter-table.html)

    • 如果您已经在列中存储了错误编码的数据,那么使用“alter table ... modify”来更改列并不能完全解决问题。例如,如果您将 UTF-8 数据存储在 Latin1 列中,并且您将字符集直接从 Latin1 更改为 UTF-8,那么之后它仍然会被错误编码。这可以通过二进制从 Latin-1 转换为 UTF-8 来解决。

    【讨论】:

    • “通过二进制”到底是什么意思?
    • 这意味着首先转换为 BLOB 之类的东西,然后转换为 UTF-8(或其他),因为更改为二进制不会进行任何类型的转换
    • 在 phpmyadmin 中通过二进制文件转换我的数据库后,所有“客户端名称”字段都显示为“[blob 11b]”而不是客户端名称。即使对于那些纯 ascii 的记录。现在呢?
    【解决方案4】:

    1) 数据库默认字符集和排序规则:

    SELECT @@character_set_database, @@collation_database;
    

    修改自:ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;

    2) 表格默认字符集和排序规则:

    SELECT T.table_name, CCSA.character_set_name 
    FROM information_schema.TABLES T, information_schema.COLLATION_CHARACTER_SET_APPLICABILITY CCSA 
    WHERE CCSA.collation_name = T.table_collation AND T.table_schema = "YOUR_DB";`
    

    修改自:ALTER TABLE [table_name] CHARACTER SET utf8 COLLATE utf8_general_ci

    3) 列字符集和排序规则:

    SELECT c.TABLE_NAME, c.COLUMN_NAME, c.CHARACTER_SET_NAME, c.COLLATION_NAME 
    FROM information_schema.COLUMNS c
    WHERE c.table_schema = "YOUR_DB";`
    

    修改自:ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

    第三个要求您禁用数据转换的外键检查。所以把这一切放在一起:

    DELIMITER //
    CREATE PROCEDURE migrate_charset_to_utf8()
      BEGIN
        DECLARE done TINYINT DEFAULT 0;
        DECLARE curr_table VARCHAR(64);
    
        DECLARE table_cursor CURSOR FOR
        SELECT T.table_name
          FROM information_schema.TABLES T
          WHERE T.TABLE_TYPE = 'BASE TABLE' AND
            T.TABLE_SCHEMA = 'YOUR_DB';
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
        OPEN table_cursor;
    
        table_loop: LOOP
          FETCH table_cursor INTO curr_table;
          IF done THEN
            LEAVE table_loop;
          END IF;
    
          # Convert table data(columns) charset
          SET @sql_str1 = CONCAT("ALTER TABLE ", curr_table, " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
          PREPARE stmt1 FROM @sql_str1;
          EXECUTE stmt1;
          DEALLOCATE PREPARE stmt1;
    
          # Set table's default charset e.g for new columns added
          SET @sql_str2 = CONCAT("ALTER TABLE ", curr_table, " CHARACTER SET utf8 COLLATE utf8_general_ci");
          PREPARE stmt2 FROM @sql_str2;
          EXECUTE stmt2;
          DEALLOCATE PREPARE stmt2;
    
        END LOOP table_loop;
    
        CLOSE table_cursor;
      END//
    
    DELIMITER ;
    
    
    SET @@FOREIGN_KEY_CHECKS = 0;
    CALL migrate_charset_to_utf8();
    SET @@FOREIGN_KEY_CHECKS = 1;
    
    ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;
    

    编辑:改为查看here

    【讨论】:

      【解决方案5】:

      将此添加到您的 my.cnf:

      [mysqld]
      character-set-server=utf8
      default-collation=utf8_unicode_ci
      

      并重新启动 mysqld 守护进程。

      添加:

      ALTER DATABASE your_base_name CHARACTER SET utf8 COLLATE utf8_unicode_ci;
      

      和我的.cnf

      SET collation_connection     = utf8_unicode_ci;
      SET character_set_results    = utf8;
      SET character_set_connection = utf8;
      SET character_set_client     = utf8;
      

      【讨论】:

      • 不会改变现有数据库或表的字符集
      • 是的,但至少他完全解决了性格问题。更改 db/table 字符他可以简单地使用 phpMyAdmin...
      • 如果他安装了 php/httpd/phpMyAdmin。
      • 没有那些东西。我只有一个基本的数据库和表。我输入什么?应该很简单吧?
      • @Alexander 我只是给出了一个解决方案,你不是......也许它不是最好的,但仍然是答案之一:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      相关资源
      最近更新 更多