在mysql中从select创建表时如何指定排序规则?

Str*_*ine 6 mysql collation

在从选择结果中创建具有动态创建和定义的列的表时,如何像在创建具有列定义的表时一样指定排序规则?

IE

CREATE TABLE IF NOT EXISTS my_table (
  SELECT * FROM (
    SELECT ....
  ) )
Run Code Online (Sandbox Code Playgroud)

上面创建了带有动态列的表就好了,但它没有使用我想要的排序规则。它使用的是 utf8_general_ci,我希望它是 utf8_unicode_ci。

这下面不起作用

CREATE TABLE IF NOT EXISTS my_table (
  SELECT * FROM (
    SELECT ....
  ) ) DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

它给出错误消息,指示命令在此位置无效。

我意识到上述建议无效,那么实现这一目标的方法是什么?我试过设置数据库排序规则,认为这是为所有创建的表设置数据库的默认值,但它的行为似乎并非如此 - 或者我在进行ALTER数据库排序规则时实际上并没有设置数据库的默认值。有没有办法为表设置默认值,以便上面的第一个代码块使用所需的排序规则创建表?

SELECT...上述代码块中的结果是指使用case/when语句、字符串解析和函数结果进行的各种条件/逻辑值设置——它不仅仅是从另一个已定义列的表中一对一地选择列,因此它不像就像定义其他表的列一样简单。

我已经尝试使用提前设置数据库排序规则,ALTER DATABASE my_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci但这不会改变结果。utf8_general_ci从选择(从选择结果动态定义的列)创建表时,仍会使用创建表(以及表中的列)

Ric*_*mes 7

CREATE TABLE my_table (
    ... none, some, or all columns ...
) ... none, some, or all specifications ...  -- Here
    SELECT ...;
Run Code Online (Sandbox Code Playgroud)

如果失败了,那么

CREATE TABLE my_table ( all columns ) all specs;
INSERT INTO my_table
    SELECT ...;
Run Code Online (Sandbox Code Playgroud)

或者...

CREATE ... SELECT ...;
ALTER TABLE my_table ...;  -- any fixes needed
Run Code Online (Sandbox Code Playgroud)

另一种方法是确保之前DATABASEDEFAULT CHARACTER SET和/或desired 。DEFAULT COLLATIONCREATE TABLE ...

无论你做什么,都要遵循它

SHOW CREATE TABLE my_table;
Run Code Online (Sandbox Code Playgroud)

验证每列是否都有所需的CHARACTER SETCOLLATION如果该列中缺少,则查看表中的DEFAULTs

例子

CREATE TABLE `us` (
  `id` int(10) unsigned NOT NULL DEFAULT '0',
  `country` char(2) CHARACTER SET ascii NOT NULL COMMENT 'ISO 3166 Country Code',
  `ascii_city` varchar(100) CHARACTER SET ascii NOT NULL COMMENT 'Name of city or town in ASCII encoding',
  `city` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `state` char(2) CHARACTER SET ascii NOT NULL COMMENT 'For US, ISO-3166-2 code for the state/province name.',
  `population` int(10) unsigned NOT NULL DEFAULT '0',
  `lat` float NOT NULL,
  `lng` float NOT NULL,
  PRIMARY KEY (`id`),
  KEY `state` (`state`,`city`),
  KEY `state_2` (`state`,`population`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

请注意某些列上的显式CHARACTER SETand COLLATE,从而覆盖DEFAULT CHARSET表的 。

当没有排序规则时,CHARSET utf8默认为COLLATE utf8_general_ci.

实施例2

在此,我将从该表创建一个新表us2,但更改以下排序规则city

CREATE TABLE us2 (
  `city` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
)
    SELECT * from us;
Run Code Online (Sandbox Code Playgroud)

除了该一列的排序规则之外,所有内容都us2与 for 相同。us


gio*_*ano 7

以下内容在 MariaDB 版本 10 上对我有用:

CREATE TABLE my_table ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
SELECT *
FROM other_table
;
Run Code Online (Sandbox Code Playgroud)