我正在将数据库从latin1迁移到utf8字符集/排序规则。
我编写了一个简单的脚本,循环遍历我的所有表并执行以下语句:
更改表{数据库}.
{table}转换为字符集utf8排序规则utf8_unicode_ci;
这对于几乎所有的表都很有用,但是我注意到有几个表无法转换-- ALTER成功了,没有错误,但是排序规则仍然是latin1。
经过进一步的检查,我注意到这个特定的表中只有Integer列,所以这也许就是原因?但是,如果我以后添加了VARCHAR,那么至少应该更改表排序规则吗?
编辑**
我使用phpMyAdmin的UI来转换表,它给了我一个稍微不同的命令:
ALTER
{table}默认字符集utf8排序规则utf8_unicode_ci
这些声明之间的区别是什么?为什么其中一种能起作用,而另一种则不行?
发布于 2014-04-22 03:36:00
ALTER TABLE ... DEFAULT CHARACTER SET ...命令设置表的默认字符集和排序规则。它不影响现有的VARCHAR/TEXT列及其数据。只有新创建的字段才会使用指定的字符集和排序规则。
ALTER TABLE ... CONVERT TO CHARACTER SET ...命令更改所有现有VARCHAR/TEXT字段的字符集和排序规则(并转换数据)。实际上,它还应该更改表的默认字符集。这里没有明确说明:http://dev.mysql.com/doc/refman/5.5/en/alter-table.html,但它以这种方式工作。在我的MySQL 5.1.45中,默认的字符集是由CONVERT操作更改的,即使它不包括VARCHAR-字段。此外,如果无法存储新的数据长度,CONVERT操作可能会更改数据类型。
发布于 2015-07-28 14:18:53
2014年4月22日,南厄斯特回答了这一问题。我最近的经验是,如果表没有包含任何基于文本的列,则转换将不会将排序规则添加到表定义中。Alter语法似乎成功,没有显示任何警告。
语法:将表表名转换为字符集utf8排序规则utf8_unicode_ci;
在这种情况下使用默认字符集可以确保显示create表的输出(排序规则字段)显示为"COLLATE=utf8_unicode_ci“。
语法:修改表表名字符集utf8整理utf8_unicode_ci;
https://dba.stackexchange.com/questions/63610
复制相似问题