sql >> データベース >  >> RDS >> Mysql

列照合をテーブル/データベースのデフォルトに変換する

    テーブルまたは列がMySQLのデフォルト(私の場合はlatin1_sweedish_ci)と異なる場合、列との照合が出力されます。これを実証する次の実験を参照してください。

    デフォルトの文字セットを設定するには、この投稿

    まず、2つのテーブルを持つデータベースを作成しましょう。 1つのテーブルには、文字セットと照合が指定されています。

    mysql> create database SO;
    mysql> use SO;
    mysql> create table test1 (col1 text, col2 text);
    mysql> create table test2 (col1 text, col2 text) character set utf8 collate utf8_unicode_ci;
    

    次に、show create tableを確認します それがどのように見えるかを確認するには:

    mysql> show create table test1;
        +-------+-----------------+
        | Table | Create Table
        +-------+-----------------+
        | test1 | CREATE TABLE `test1` (
          `col1` text,
          `col2` text
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1
        +-------+-----------------+
        1 row in set (0.00 sec)
    
    mysql> show create table test2;
        +-------+-----------------+
        | Table | Create Table
        +-------+-----------------+
        | test2 | CREATE TABLE `test2` (
          `col1` text COLLATE utf8_unicode_ci,
          `col2` text COLLATE utf8_unicode_ci
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
        +-------+-----------------+
        1 row in set (0.00 sec)
    

    test2 すでに、デフォルトを使用するのではなく、列が具体的に指定されているように見えます。 MySQLのデフォルトとは異なる場合は、テーブルのデフォルトとは異なる場合ではなく、リストに表示されると思います。それでは、information_schemaデータベースでそれらがどのように表示されるかを見てみましょう。

    mysql> select table_schema, table_name, table_collation from information_schema.tables where table_schema = 'SO';
        +--------------+------------+-------------------+
        | table_schema | table_name | table_collation   |
        +--------------+------------+-------------------+
        | SO           | test1      | latin1_swedish_ci |
        | SO           | test2      | utf8_unicode_ci   |
        +--------------+------------+-------------------+
        2 rows in set (0.00 sec)
    
    mysql> select table_schema, table_name, column_name, character_set_name, collation_name from information_schema.columns where table_schema = 'SO';
        +--------------+------------+-------------+--------------------+-------------------+
        | table_schema | table_name | column_name | character_set_name | collation_name    |
        +--------------+------------+-------------+--------------------+-------------------+
        | SO           | test1      | col1        | latin1             | latin1_swedish_ci |
        | SO           | test1      | col2        | latin1             | latin1_swedish_ci |
        | SO           | test2      | col1        | utf8               | utf8_unicode_ci   |
        | SO           | test2      | col2        | utf8               | utf8_unicode_ci   |
        +--------------+------------+-------------+--------------------+-------------------+
        4 rows in set (0.00 sec)
    

    指定したかどうかに関係なく、列には特定の文字セットと照合があるように見えます。 test1を優先文字セットと照合に更新して、何が起こるかを確認しましょう。

    mysql> ALTER TABLE test1 CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci;
        Query OK, 0 rows affected (0.05 sec)
        Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> show create table test1;
        +-------+-----------------+
        | Table | Create Table
        +-------+-----------------+
        | test1 | CREATE TABLE `test1` (
          `col1` mediumtext COLLATE utf8_unicode_ci,
          `col2` mediumtext COLLATE utf8_unicode_ci
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
        +-------+-----------------+
        1 row in set (0.00 sec)
    
    mysql> show create table test2;
        +-------+-----------------+
        | Table | Create Table
        +-------+-----------------+
        | test2 | CREATE TABLE `test2` (
          `col1` text COLLATE utf8_unicode_ci,
          `col2` text COLLATE utf8_unicode_ci
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
        +-------+-----------------+
        1 row in set (0.00 sec)
    

    今、彼らは両方ともshow create tableに照合を入れています 声明。 information_schemaをもう一度確認しましょう。

    mysql> select table_schema, table_name, table_collation from information_schema.tables where table_schema = 'SO';
        +--------------+------------+-----------------+
        | table_schema | table_name | table_collation |
        +--------------+------------+-----------------+
        | SO           | test1      | utf8_unicode_ci |
        | SO           | test2      | utf8_unicode_ci |
        +--------------+------------+-----------------+
        2 rows in set (0.00 sec)
    
    mysql> select table_schema, table_name, column_name, character_set_name, collation_name from information_schema.columns where table_schema = 'SO';
        +--------------+------------+-------------+--------------------+-----------------+
        | table_schema | table_name | column_name | character_set_name | collation_name  |
        +--------------+------------+-------------+--------------------+-----------------+
        | SO           | test1      | col1        | utf8               | utf8_unicode_ci |
        | SO           | test1      | col2        | utf8               | utf8_unicode_ci |
        | SO           | test2      | col1        | utf8               | utf8_unicode_ci |
        | SO           | test2      | col2        | utf8               | utf8_unicode_ci |
        +--------------+------------+-------------+--------------------+-----------------+
        4 rows in set (0.00 sec)
    

    ほぼ同じように見えます。しかし、両方のテーブルに列を追加するとどうなりますか?

    mysql> alter table test1 add column col3 text;
        Query OK, 0 rows affected (0.05 sec)
        Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> alter table test2 add column col3 text;
        Query OK, 0 rows affected (0.06 sec)
        Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> show create table test1;
        +-------+-----------------+
        | Table | Create Table
        +-------+-----------------+
        | test1 | CREATE TABLE `test1` (
          `col1` mediumtext COLLATE utf8_unicode_ci,
          `col2` mediumtext COLLATE utf8_unicode_ci,
          `col3` text COLLATE utf8_unicode_ci
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
        +-------+-----------------+
        1 row in set (0.00 sec)
    
    mysql> show create table test2;
        +-------+-----------------+
        | Table | Create Table
        +-------+-----------------+
        | test2 | CREATE TABLE `test2` (
          `col1` text COLLATE utf8_unicode_ci,
          `col2` text COLLATE utf8_unicode_ci,
          `col3` text COLLATE utf8_unicode_ci
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
        +-------+-----------------+
        1 row in set (0.00 sec)
    

    どちらの場合も、彼らはテーブルから照合を拾いました。したがって、後で追加された列がうまく機能しなくなることを心配する必要はありません。 information_schemaをもう一度確認しましょう...

    mysql> select table_schema, table_name, table_collation from information_schema.tables where table_schema = 'SO';
        +--------------+------------+-----------------+
        | table_schema | table_name | table_collation |
        +--------------+------------+-----------------+
        | SO           | test1      | utf8_unicode_ci |
        | SO           | test2      | utf8_unicode_ci |
        +--------------+------------+-----------------+
        2 rows in set (0.00 sec)
    
    mysql> select table_schema, table_name, column_name, character_set_name, collation_name from information_schema.columns where table_schema = 'SO';
        +--------------+------------+-------------+--------------------+-----------------+
        | table_schema | table_name | column_name | character_set_name | collation_name  |
        +--------------+------------+-------------+--------------------+-----------------+
        | SO           | test1      | col1        | utf8               | utf8_unicode_ci |
        | SO           | test1      | col2        | utf8               | utf8_unicode_ci |
        | SO           | test1      | col3        | utf8               | utf8_unicode_ci |
        | SO           | test2      | col1        | utf8               | utf8_unicode_ci |
        | SO           | test2      | col2        | utf8               | utf8_unicode_ci |
        | SO           | test2      | col3        | utf8               | utf8_unicode_ci |
        +--------------+------------+-------------+--------------------+-----------------+
        6 rows in set (0.00 sec)
    

    うん。すべて同じように機能しているように見えます。しかし、テーブルのデフォルトではなく、MySQLのデフォルトとは異なる場合にのみ表示されるという仮説はどうでしょうか。 test1を設定しましょう 以前の状態に戻します。

    mysql> ALTER TABLE test1 CONVERT TO CHARACTER SET latin1  COLLATE latin1_swedish_ci;
        Query OK, 0 rows affected (0.02 sec)
        Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> show create table test1;
        +-------+-----------------+
        | Table | Create Table
        +-------+-----------------+
        | test1 | CREATE TABLE `test1` (
          `col1` mediumtext,
          `col2` mediumtext,
          `col3` text
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1
        +-------+-----------------+
        1 row in set (0.00 sec)
    

    私たちが始めたときと同じように見えるようです。ここで、これがデータベースのデフォルトではなく、MySQLのデフォルトであることを示すために、データベースのデフォルトを設定しましょう。

    mysql> Alter database SO default character set utf8 collate utf8_unicode_ci;
        Query OK, 1 row affected (0.00 sec)
    
    mysql> show create table test1;
        +-------+-----------------+
        | Table | Create Table
        +-------+-----------------+
        | test1 | CREATE TABLE `test1` (
          `col1` mediumtext,
          `col2` mediumtext,
          `col3` text
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1
        +-------+-----------------+
        1 row in set (0.00 sec)
    
    mysql> show create table test2;
        +-------+-----------------+
        | Table | Create Table
        +-------+-----------------+
        | test2 | CREATE TABLE `test2` (
          `col1` text COLLATE utf8_unicode_ci,
          `col2` text COLLATE utf8_unicode_ci,
          `col3` text COLLATE utf8_unicode_ci
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
        +-------+-----------------+
        1 row in set (0.00 sec)
    

    ご覧のとおり、test1は最初に開始したときと同じように見え、show create table データベースのデフォルトの影響を受けません。



    1. ActiveRecordを使用したCodeIgniterのクエリ内のDATE_FORMATが機能しない

    2. SQLiteUNIQUE制約

    3. 無効な共通ユーザーまたはロール名

    4. Html2pdfを使用してPDFを作成しましたPDFを保存および取得する方法がわかりません