更改列排序规则 - 安全吗?

Posted

技术标签:

【中文标题】更改列排序规则 - 安全吗?【英文标题】:Changing Column Collation - Is it Safe? 【发布时间】:2011-11-12 20:48:56 【问题描述】:

我的票务系统中有一个包含 15,000 条记录的表,每条记录都包含一封电子邮件,该电子邮件已转换为要添加到票证中的消息。

我们当前的问题是排序规则 - 当我拿到系统时,它使用的是 latin1_swedish_ci。但是,我们在系统中使用了几种欧洲语言,因此我们需要能够正确存储非 ASCII 字符。

我无法让它与 latin1_swedish_ci 排序规则一起使用,但我在系统的测试版本中发现,将排序规则切换为 utf8_bin 可以解决问题。

所以我需要知道在实时系统上对我的表/列进行此更改是否安全。这会花费很长时间(phpMyAdmin 在你努力让它工作时非常糟糕)还是会破坏任何现有数据?

【问题讨论】:

问题不在于数据库本身;问题是票务系统是否可以处理UTF-8数据。 【参考方案1】:

当第一个字符集中的所有字符都可以在第二个字符集中表示时,从一个字符集转换为另一个字符集是安全的。

latin1 到 utf8 就是这种情况:它是安全的。

但是您必须确保应用程序本身可以处理 utf8 数据。

在 utf8_bin 上:utf8 部分是字符集(字符的编码方式),bin 部分是排序规则。不要使用 bin,它会使所有内容区分大小写,这可能不是您所期望的。改用 utf8_unicode_ci。 (见http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-sets.html

【讨论】:

太好了,当我执行更改列操作时,它会对 15,000 行中的每一行执行一些转换吗?我很担心这一点,因为我什至无法从 PHPMyAdmin 转储这么多数据而不会无响应 是的,它会转换数据。 (像往常一样,在此之前做一个备份,以防万一。) 还可以尝试ALTER TABLE foo CONVERT TO CHARACTER SET ... 一次转换所有列。 谢谢 - 我会尝试做一个备份,但正如我所说,PHPMyAdmin 真的不喜欢这样做! 只是为了让大家知道 - 我今晚做了这个,它没有转换任何数据。为了以防万一,我确实进行了完整备份,但这不是必需的,因为更改会立即执行,没有任何问题。

以上是关于更改列排序规则 - 安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

更改列排序规则

powerbi 怎么指定排序规则

在 Postgres 上更改排序规则(保持编码)是不是安全?

如何使用 Doctrine 更改列字符集和排序规则?

如何在不转换列的情况下更改 MySQL 中的表(默认)排序规则[重复]

使用 laravel 更新列排序规则