Mysql 表排序规则改变

Posted

技术标签:

【中文标题】Mysql 表排序规则改变【英文标题】:Mysql table collation change 【发布时间】:2020-02-13 06:06:37 【问题描述】:

我有一个带有几个西班牙关键字的旧表。它的排序规则是 latin1_swedish_ci。 包含关键字的列具有主索引。 当我尝试将排序规则更改为 utf8_general_ci 时,这是不可能的,因为如果发现重复项。 使用该索引是不可能的。 发生的情况是,例如,“cañada”被视为已经存在的“canada”,但它们是不同的词。 那是使用 phpMyAdmin。 另一种尝试是将表导出为 file.sql 并使用sed 's/STRING_SOURCE/STRING_REPLACE/' 但最后mysql源给了我同样的错误(确实期望:)) 我还尝试使用整个数据库进行最后一个。

MySQL 版本 5.5.64-MariaDB phpMyAdmin,选择数据库/表,选项卡结构,选择关键字的列更改,最后从下拉排序规则中选择ut8_general_ci

如何在保留所有关键字的情况下进行此更改?

【问题讨论】:

您很可能需要 utf8mb4_unicode_as 或更好的版本(utf8mb4_0900_as 如果您的 MySQL 版本支持它)。 嗯,我刚刚测试了你描述的过程,我没有遇到问题。您使用的是什么版本的 MySQL。您能准确描述一下您是如何更改排序规则的吗? Why should I provide a Minimal Reproducible Example for a very simple SQL query? @Lunc Change fo utf8mb4_unicode_ci (not _as) 成功,没有重复的错误输出 @dstonek - 你确定 utf8mb4_unicode_ci 吗? 【参考方案1】:

由于您专注于西班牙语,请使用西班牙语排序规则,而不是通用排序规则:utf8_spanish_ciutf8_spanish2_ci。他们将ñ 视为no 之间的单独字母。其他排序规则将ñn 视为相同。

同时,ç=c

但是 ll 被 utf8_spanish_ci 视为两个 l,而它被 utf8_spanish2_ci 视为在 lz 之后。 (关于字典与电话簿的区别——还记得古代历史中的那些文物吗?)

参考:http://mysql.rjweb.org/utf8_collations.html

升级到 8.0 后,将有另外两个选择:utf8mb4_es_0900_ai_ciutf8mb4_es_trad_0900_ai_ci

参考:http://mysql.rjweb.org/utf8mb4_collations.html

【讨论】:

以上是关于Mysql 表排序规则改变的主要内容,如果未能解决你的问题,请参考以下文章

PHP PHP函数改变MySQL数据库的排序规则

Mysql:修改字符集和排序规则

在 mySQL 中非法混合排序规则

MySQL:错误排序规则“正在使用”并且无法加载表

数据库、表、列排序规则的区别

发现 MySQL 列的排序规则