在从选择结果中创建具有动态创建和定义的列的表时,如何像在创建具有列定义的表时一样指定排序规则?
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从选择(从选择结果动态定义的列)创建表时,仍会使用创建表(以及表中的列)
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)
另一种方法是确保之前DATABASE有DEFAULT CHARACTER SET和/或desired 。DEFAULT COLLATIONCREATE TABLE ...
无论你做什么,都要遵循它
SHOW CREATE TABLE my_table;
Run Code Online (Sandbox Code Playgroud)
验证每列是否都有所需的CHARACTER SET和COLLATION。如果该列中缺少,则查看表中的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
以下内容在 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)
| 归档时间: |
|
| 查看次数: |
17132 次 |
| 最近记录: |