ALTER DATABASE更改COLLATE无法正常工作

时间:2014-01-25 17:58:06

标签: mysql django collate

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

ALTER DATABASE learncon_pywithyou CHARACTER SET utf8 COLLATE utf8_unicode_ci;

来自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中这些字段的整理根本没有变化。

所以我最终手动更改了php mytable的phpMyAdmin中的字段,这样就行了,现在我可以在这个表中插入unicode并且它们显示正确,但我有大约20个这样的表,我不知道我不想手动逐一更改它们。

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

2 个答案:

答案 0 :(得分:4)

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

同样,在表格级别,only new columns见底部的评论)受此影响:

alter table mytable character set utf8 collate utf8_unicode_ci;

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

alter table mytable convert to character set utf8 collate utf8_unicode_ci;

答案 1 :(得分:2)

除了@StuartLC之外, 对于更改所有20个表charset和collat​​ion使用查询下面,这里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";

以上内容将准备您需要运行的所有ALTER个查询。