我在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个这样的表,我不知道我不想手动逐一更改它们。
我们是否有一种简单有效的方法来更改每个字段的Collate以存储和显示正确的unicodes?
答案 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和collation使用查询下面,这里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
个查询。