2017-09-13 8 views
1

動的に作成され、選択結果から列を定義してテーブルを作成する場合、列定義を使用してテーブルを作成するときのように照合順序を指定するにはどうすればよいですか?mysqlでselectからテーブルを作成するときの照合順序を指定する方法を教えてください。

すなわち

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文を使用して値の設定、文字列解析、および機能の結果の様々な意味 - それはちょうど定義した別のテーブルからの1対1の列を選択していません他のテーブルの列を定義するのと同じくらい単純ではありません。

事前にALTER DATABASE my_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ciを使用してデータベースの照合順序を設定しようとしましたが、結果は変わりません。テーブルはまだ作成されている(および表の列)が選択(選択結果から動的に定義された列)

+0

[TABLE' CREATE ']のドキュメント(https://dev.mysql.com/doc/refman/5.7/en/create -table.html)は、このようなことを行うためのいくつかの方法を概説していますが、後者のケースではあなたの期待と一致するものはありません。 – tadman

+1

これは私がここで質問している理由です(?)私は上記の2番目のコードブロックを、私が働きたいことの提案として提供しましたが、正しくないことを認識しています。私は正しい解決策が何であるかを探しています。ドキュメントには、選択からテーブルを作成し、そのテーブルの照合オプションが存在するという事実がありますが、これらの2つを一緒に示す例は見つかりません。上の 'SELECT ....'は、 'case '式、他のテーブル、関数の結果のような様々なロジックを作成した結果の集まりです。 – Streamline

答えて

1
CREATE TABLE my_table (
    ... none, some, or all columns ... 
) ... none, some, or all specifications ... -- Here 
    SELECT ...; 

からテーブルを作成するときにそれが失敗した場合、その後、

CREATE TABLE my_table (all columns) all specs; 
INSERT INTO my_table 
    SELECT ...; 

かをutf8_general_ciを使用して...

CREATE ... SELECT ...; 
ALTER TABLE my_table ...; -- any fixes needed 

さらに別のアプローチは、DATABASEDEFAULT CHARACTER SETおよび/またはを持っていることを確認することですCREATE TABLE ...より前のが必要です。

何をするにしても、各列がCHARACTER SETCOLLATIONを希望していることを確認するために

SHOW CREATE TABLE my_table; 

でそれに従ってください。 にない場合は、表のDEFAULTsを参照してください。これにより、テーブルのDEFAULT CHARSETをオーバーライド

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 

お知らせいくつかの列に明示的CHARACTER SETCOLLATE、。

照合がない場合、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; 

についてus2すべてがusの場合と同じになりますその1つの列の照合を除きます。

+0

データベース*のデフォルト*文字セット/照合が望ましいかどうかを確認するときは、これは変数のチェックと同じですか?つまり、問題のデータベースを使用している間にmysqlクライアントのシステム変数 'collat​​ion_database'をチェックすると' utf8_unicode_ci'と表示されますが、私のポストの最初の例のようにテーブルを作成すると 'utf8_general_ci'として作成されます。 'ALTER DATABASE db_name CHARACTER SET charset COLLATE collat​​ion;以外のデータベースの*デフォルト*をチェック/設定する他の方法はありますか?データベースのオプションとdbのデフォルトオプションは異なっていますか? – Streamline

+0

私の最後のコメントに従うには、ALTER DATABASE my_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci'というalter databaseコマンドを使用するときに 'DEFAULT'という単語を追加しようとしましたが、それでも表示される結果は変わりません。私はまだ 'utf8_general_ci'を使ってselectから作成されたテーブルを取得します – Streamline

+0

データベースのデフォルトをチェックするには' SHOW CREATE DATABASE dbname; 'を使います。 –

0

以下はMariaDBバージョン10の上に私のために仕事をした:

CREATE TABLE my_table ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 
SELECT * 
FROM other_table 
; 
関連する問題