ALTER DATABASE 更改 COLLATE 不起作用

Ton*_*ony 6 mysql django collate

我在 Bluehost 上使用 Django。我为用户生成的输入创建了一个表单,但是来自该表单的 unicode 输入无法存储或显示字符。所以我做了一个 SO 和谷歌搜索,我应该更改我的数据库的整理和字符集。我运行这个 sql

ALTER DATABASE learncon_pywithyou CHARACTER SET utf8 COLLATE utf8_unicode_ci;

from python27 manage.py dbshell,它启动了一个 mysql shell,屏幕上显示的是 Query OK, 1 row affected (0.00 sec).

所以我假设问题已解决,但实际上并非如此。这个sql没有做任何事情,因为我后来在Bluehost提供的phpMyAdmin中找到了它。所有表的所有 Varchar 字段仍在lantin1_swedish_ci整理中。

所以假设它alter table应该起作用。我在 mysql 上运行这个 alter table mytable character set utf8 collate utf8_unicode_ci;

虽然在屏幕上显示Query OK. 4 rows affected,它实际上也没有做任何事情,这些字段的排序规则mytable根本没有改变。

所以我终于手动更改了 phpMyAdmin 中的字段,mytable这有效,现在我可以使用 unicode 在这个表中插入并且它们显示正确,但是我有大约 20 个这样的表,我不想更改它们一个手动。

我们是否有一种简单有效的方法来更改每个字段的 Collat​​e 以存储和显示正确的 unicode?

Stu*_*tLC 9

在数据库级别更改排序规则为新对象设置默认值 - 不会更改现有排序规则。

同样,在表级别,只有新列请参阅底部的评论)受此影响:

alter table mytable character set utf8 collate utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

但是,要转换现有列的排序规则,您需要添加convert to

alter table mytable convert to character set utf8 collate utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

  • 只是在那里放一个注释:如果表中没有任何转换,字符集保持不变 - 在这种情况下,您必须使用没有“转换为”的查询。 (7认同)

Abd*_*naf 4

除了@StuartLC之外,为了更改所有 20 个表的字符集和排序规则,请使用下面的查询,这里的 world 是数据库名称

SELECT 
CONCAT("ALTER TABLE ",TABLE_SCHEMA , ".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci") AS AlterSQL
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = "world";
Run Code Online (Sandbox Code Playgroud)

上面将准备ALTER您需要运行的所有查询。