我搞错了:
非法组合排序规则(utf8_general_ci,隐式)和(utf8_unicode_ci,隐式)用于操作'='“
我尝试手动将两个表更改为utf8_general_ci,IMPLICIT
,但仍然会出现错误。
有没有一种方法可以将所有表转换为utf8_general_ci,IMPLICIT
并完成它?
发布于 2012-06-02 05:48:16
您需要为每个表执行一个alter语句。声明将采用以下形式:
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name]
[COLLATE collation_name]
现在,要获取数据库中的所有表,需要执行以下查询:
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="YourDataBaseName"
AND TABLE_TYPE="BASE TABLE";
现在让MySQL为您编写代码:
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE your_collation_name_here;") AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="YourDatabaseName"
AND TABLE_TYPE="BASE TABLE";
您可以复制结果并执行它们。我还没有测试语法,但是您应该能够找出其余的语法。把它当作一个小小的练习吧。
希望这能帮上忙!
发布于 2014-06-11 13:50:15
更改表中varchar列的排序规则的更好选项
SELECT CONCAT('ALTER TABLE `', TABLE_NAME,'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') AS mySQL
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA= "myschema"
AND TABLE_TYPE="BASE TABLE"
另外,如果在启动该集群脚本之前,非utf8列上有forein键的数据,请使用
SET foreign_key_checks = 0;
这意味着全局SQL将用于mySQL:
SET foreign_key_checks = 0;
ALTER TABLE `table1` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `table2` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `tableXXX` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
SET foreign_key_checks = 1;
但是如果根据mysql文档http://dev.mysql.com/doc/refman/5.1/en/charset-column.html,
如果使用ALTER将列从一个字符集转换为另一个字符集,则MySQL试图映射数据值,但如果字符集不兼容,则可能会丢失数据。“
编辑:特别是列类型枚举,它只是完全崩溃枚举集(即使没有特殊的字符) https://bugs.mysql.com/bug.php?id=26731。
发布于 2016-11-19 00:06:35
@两栖动物的建议对我有很大帮助.
不过,我们更进一步,在脚本中添加了列和视图。
只需在下面输入架构的名称,它就可以完成其余的工作。
-- set your table name here
SET @MY_SCHEMA = "";
-- tables
SELECT DISTINCT
CONCAT("ALTER TABLE ", TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as queries
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA=@MY_SCHEMA
AND TABLE_TYPE="BASE TABLE"
UNION
-- table columns
SELECT DISTINCT
CONCAT("ALTER TABLE ", C.TABLE_NAME, " CHANGE ", C.COLUMN_NAME, " ", C.COLUMN_NAME, " ", C.COLUMN_TYPE, " CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as queries
FROM INFORMATION_SCHEMA.COLUMNS as C
LEFT JOIN INFORMATION_SCHEMA.TABLES as T
ON C.TABLE_NAME = T.TABLE_NAME
WHERE C.COLLATION_NAME is not null
AND C.TABLE_SCHEMA=@MY_SCHEMA
AND T.TABLE_TYPE="BASE TABLE"
UNION
-- views
SELECT DISTINCT
CONCAT("CREATE OR REPLACE VIEW ", V.TABLE_NAME, " AS ", V.VIEW_DEFINITION, ";") as queries
FROM INFORMATION_SCHEMA.VIEWS as V
LEFT JOIN INFORMATION_SCHEMA.TABLES as T
ON V.TABLE_NAME = T.TABLE_NAME
WHERE V.TABLE_SCHEMA=@MY_SCHEMA
AND T.TABLE_TYPE="VIEW";
https://stackoverflow.com/questions/10859966
复制相似问题