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

Jeg*_*gus 161 mysql sql collation

我们以前的程序员在表(Mysql)中设置了错误的排序规则.当它应该是UTF8时,他用拉丁校对设置它,现在我有问题.每个有中文和日文字符的记录都会转到??? 字符.

是否可以更改整理并获取角色的细节?

Tim*_*nen 347

更改数据库排序规则:

ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

更改表排序规则:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

更改列排序规则:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

更多信息:

  • 最好为完整的utf8支持执行以下操作:ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`.您应该对其他两个语句执行相同的操作. (7认同)
  • 当心`CHARACTER SET utf8`将默认为`utf8_general_ci`,但你也可以定义这样的校对`ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;`如果需要 (4认同)
  • 只想提一下,第二个会将整理改为`utf8_general_ci`; 如果要将其更改为`utf8_unicode_ci`,则可以定义排序规则:`ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;`.正如@KCD指出的那样,这对于与数据库工作的表完全相同. (2认同)

小智 44

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

- 更改数据库默认排序规则

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

- 更改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';
Run Code Online (Sandbox Code Playgroud)

- 更改COLUMN Collat​​ion/Char Set

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';
Run Code Online (Sandbox Code Playgroud)


blu*_*der 23

请注意,在Mysql中,utf8字符集只是真正的UTF8字符集的子集.为了节省一个字节的存储空间,Mysql团队决定只存储三个字节的UTF8字符而不是整个四字节字节.这意味着一些东亚语言和表情符号并不完全支持.要确保您可以存储所有UTF8字符,请使用utf8mb4数据类型和/ utf8mb4_binutf8mb4_general_ciMysql.


小智 6

除了David Whittaker发布的内容之外,我还创建了一个查询,该查询生成将转换每个表的完整表和列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;
Run Code Online (Sandbox Code Playgroud)

之前的答案之间的区别在于它使用的是utf8而不是ut8mb4,并且使用t1.CHARACTER_MAXIMUM_LENGTH的t1.data_type不适用于枚举.此外,我的查询排除了视图,因为这些视图必须单独更改.

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

我发现从latin1 - > utf8mb4改变时有些数据被破坏了.它似乎是在列中的utf8编码的latin1字符将在转换中得到充实.我只是从我知道的列中保存了数据,这些列是在alter之前和之后的内存中的一个问题,并比较它们并生成更新语句来修复数据.