【发布时间】:2018-02-21 13:47:11
【问题描述】:
当使用从选择结果中动态创建和定义的列创建表时,如何像创建具有列定义的表时那样指定排序规则?
即
CREATE TABLE IF NOT EXISTS my_table (
SELECT * FROM (
SELECT ....
) )
上面创建的动态列很好,但它没有使用我想要的排序规则。它使用的是 utf8_general_ci,我希望它是 utf8_unicode_ci。
下面这个不行
CREATE TABLE IF NOT EXISTS my_table (
SELECT * FROM (
SELECT ....
) ) DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;
它给出的错误信息表明命令在这个位置是无效的。
我意识到上述建议是无效的,那么实现这一点的方法是什么?我尝试设置数据库排序规则,认为这是为所有创建的表设置数据库的默认值,但它的行为似乎不像那样 - 或
当我ALTER 数据库排序规则时,也许我实际上并没有为数据库设置默认值。有没有办法为表设置默认值,以便上面的第一个代码块使用所需的排序规则创建表?
上述代码块中的SELECT...结果指的是使用case/when语句、字符串解析和函数结果的各种条件/逻辑值设置——它不仅仅是从另一个表中一对一地选择列已经定义了列,所以它不像定义其他表的列那么简单。
我已经尝试使用ALTER DATABASE my_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci 提前设置数据库排序规则,但这不会改变结果。从选择创建表(从选择结果动态定义的列)时,仍然使用utf8_general_ci 创建表(以及表中的列)
【问题讨论】:
-
CREATE TABLE上的文档概述了执行此类操作的几种方法,但在第二种情况下,它们都不符合您的期望。 -
对,这就是为什么我在这里问这个问题(?)我提供上面的第二个代码块只是作为我想要工作的建议,但我意识到它不正确。我正在寻找正确的解决方案。该文档提到了您可以从选择创建表以及存在排序规则的表选项这一事实,但我找不到将这两者一起显示的示例。上面的
SELECT ....是创建各种逻辑的结果集合,如case when表达式、其他表和函数结果。