如何更改数据库的默认sorting规则?

我们以前的程序员在表中设置了错误的sorting规则(Mysql)。 他用拉丁语整理,当它应该是UTF8,现在我有问题。 每个中日文字符都转成??? 字符。

是否有可能改变整理和取回字符的细节?

更改数据库整理:

ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

更改表格整理:

 ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

更改列整理:

 ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

更多信息:

  • utf8_general_ci和utf8_unicode_ci有什么区别?
  • utf8_general_ci和utf8_unicode_ci有什么区别?
  • 如何更改数据库,表,列的sorting规则?

如何更改所有数据库/表/列 运行这些查询,它们将输出将整个模式转换为utf8所需的所有后续查询。 希望这可以帮助!

– 更改数据库默认sorting规则

 SELECT DISTINCT concat('ALTER DATABASE `', TABLE_SCHEMA, '` CHARACTER SET utf8 COLLATE utf8_unicode_ci;') from information_schema.tables where TABLE_SCHEMA like 'database_name'; 

– 更改TABLE整理/字符集

 SELECT concat('ALTER TABLE `', TABLE_SCHEMA, '`.`', table_name, '` CHARACTER SET utf8 COLLATE utf8_unicode_ci;') from information_schema.tables where TABLE_SCHEMA like 'database_name'; 

– 更改COLUMN整理/字符集

 SELECT concat('ALTER TABLE `', t1.TABLE_SCHEMA, '`.`', t1.table_name, '` MODIFY `', t1.column_name, '` ', t1.data_type , '(' , t1.CHARACTER_MAXIMUM_LENGTH , ')' , ' CHARACTER SET utf8 COLLATE utf8_unicode_ci;') from information_schema.columns t1 where t1.TABLE_SCHEMA like 'database_name' and t1.COLLATION_NAME = 'old_charset_name'; 

请注意,在Mysql中, utf8字符集只是真正的UTF8字符集的一个子集。 为了节省一个字节的存储空间,Mysql团队决定只存储三个字节的UTF8字符而不是四个字节。 这意味着一些东亚语言和表情符号得不到充分的支持。 为确保可以存储所有UTF8字符,请使用Mysql中的utf8mb4数据types和utf8mb4_binutf8mb4_general_ci

这里描述的过程很好。 然而,一些不适合拉丁空间的angular色却一去不复返了。 UTF-8是latin1的SUPERSET。 不是相反的。 大多数将适合单字节空间,但任何未定义的将不会(检查latin1列表 – 不是所有的256个字符被定义,取决于MySQL的latin1定义)

添加到David Whittaker发布的内容中,我创build了一个查询来生成将转换每个表的完整表和alter语句。 运行可能是一个好主意

SET SESSION group_concat_max_len = 100000;

首先要确保你的小组concat不会超过这里看到的极小的限制。

  SELECT a.table_name, concat('ALTER TABLE ', a.table_schema, '.', a.table_name, ' DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci, ', group_concat(distinct(concat(' MODIFY ', column_name, ' ', column_type, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ', if (is_nullable = 'NO', ' NOT', ''), ' NULL ', if (COLUMN_DEFAULT is not null, CONCAT(' DEFAULT \'', COLUMN_DEFAULT, '\''), ''), if (EXTRA != '', CONCAT(' ', EXTRA), '')))), ';') as alter_statement FROM information_schema.columns a INNER JOIN INFORMATION_SCHEMA.TABLES b ON a.TABLE_CATALOG = b.TABLE_CATALOG AND a.TABLE_SCHEMA = b.TABLE_SCHEMA AND a.TABLE_NAME = b.TABLE_NAME AND b.table_type != 'view' WHERE a.table_schema = ? and (collation_name = 'latin1_swedish_ci' or collation_name = 'utf8mb4_general_ci') GROUP BY table_name; 

以前的答案之间的差异是它使用utf8而不是ut8mb4和t1.data_type与t1.CHARACTER_MAXIMUM_LENGTH不适用于枚举。 此外,我的查询排除视图,因为那些将不得不单独更改。

我简单地使用Perl脚本将所有这些更改作为数组返回,并对它们进行迭代,修复了太长的列(当数据通常只有20个字符时,通常是varchar(256)),这是一个简单的修复)。

我发现从latin1 – > utf8mb4改变了一些数据被破坏了。 它似乎是utf8编码latin1字符列将在转换中被搞砸。 我简单地从列前面和后面的列中知道将要成为内存问题的列中的数据,并比较它们并生成更新语句来修复数据。