この記事では、主に mysql 文字セットと文字順序の概念と関係を紹介し、MYSQL でサポートされている文字セットを表示するさまざまな方法を共有します。具体的な内容についてはこちらの記事をご参照ください。お役に立てれば幸いです。
MySQL を使用するプロセスでは、文字セットと文字順序の概念、およびさまざまな設定がデータの保存と比較に与える影響を理解することが非常に重要です。多くの学生が日常業務で遭遇する「文字化け」の問題は、文字セットや文字シーケンスに対する理解が不十分であったり、設定が間違っていたりすることが原因である可能性が高くなります。
この記事では、以下の内容を浅いものから深いものまで紹介します:
文字セットと文字シーケンスの基本的な概念と接続
MySQLがサポートする文字セットと文字シーケンスの設定レベルと接続各設定レベル間
サーバー、データベース、テーブル、列レベルの文字セットと文字順序の表示と設定
文字セットと文字順序はいつ設定する必要があります
にお問い合わせください。 データ ストレージに関して、MySQL はさまざまな文字セットのサポートを提供します。データ比較操作では、異なる文字順序のサポートが提供されます。
MySQL は、サーバー レベル、データベース レベル、テーブル レベル、列レベルなどのさまざまなレベルの設定を提供しており、非常に正確な設定を提供できます。
キャラクターセットとキャラクターオーダーとは何ですか?簡単に言うと、
Character set (文字セット): 文字と文字エンコーディングを定義します。
文字の順序 (照合順序): 文字の比較規則を定義します。
例:
には、A、B、a、bの4つの文字があります。これらの4つの文字のコードは、A = 0、B = 1、a = 2、b = 3です。ここでの文字 + エンコーディングは文字セットを構成します。
2 つの文字の大きさを比較したい場合はどうすればよいでしょうか?たとえば、A、B、または a、b を比較する最も直感的な方法は、0
さらに、A と a については、エンコーディングは異なりますが、大文字と小文字は等しい、つまり A == a であるべきだと考えます。
上記では 2 つの比較ルールが定義されており、これらの比較ルールのセットが照合です。
両方が大文字と小文字である場合は、そのエンコード サイズを比較します。
2 つの文字に大文字と小文字の関係がある場合、それらは等しいです。
MySQL は複数の文字セットと文字シーケンスをサポートします。
文字セットは、少なくとも 1 つの文字シーケンス (通常は 1 対多) に対応します。
2 つの異なる文字セットが同じ文字シーケンスを持つことはできません。
各文字セットにはデフォルトの文字順序があります。
上記は比較的抽象的ですが、何が起こっているのかを理解するために次のいくつかのセクションを見てみましょう。
1. サポートされている文字セットを確認する
MYSQL がサポートしている文字セットは、次の方法で確認できます。
方法 1:
mysql> SHOW CHARACTER SET; +----------+-----------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+-----------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | ...省略
方法 2:
mysql> use information_schema; mysql> select * from CHARACTER_SETS; +--------------------+----------------------+-----------------------------+--------+ | CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | DESCRIPTION | MAXLEN | +--------------------+----------------------+-----------------------------+--------+ | big5 | big5_chinese_ci | Big5 Traditional Chinese | 2 | | dec8 | dec8_swedish_ci | DEC West European | 1 | ...省略
SHOW CHARACTER SET を使用して表示する場合、WHERE または LIKE 修飾条件を追加することもできます。
例 1: WHERE 修飾の使用。
mysql> SHOW CHARACTER SET WHERE Charset="utf8"; +---------+---------------+-------------------+--------+ | Charset | Description | Default collation | Maxlen | +---------+---------------+-------------------+--------+ | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | +---------+---------------+-------------------+--------+ 1 row in set (0.00 sec)
例 2: LIKE 修飾を使用します。
mysql> SHOW CHARACTER SET LIKE "utf8%"; +---------+---------------+--------------------+--------+ | Charset | Description | Default collation | Maxlen | +---------+---------------+--------------------+--------+ | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | | utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | +---------+---------------+--------------------+--------+ 2 rows in set (0.00 sec)
2. サポートされている文字の順序を確認する
同様に、MYSQL でサポートされている文字の順序は次の方法で確認できます。
方法 1: SHOW COLLATION で確認します。
ご覧のとおり、utf8 文字セットには 10 を超える文字シーケンスがあります。 Default の値が Yes であるかどうかによって、文字シーケンスがデフォルトであるかどうかを判断します。
mysql> SHOW COLLATION WHERE Charset = 'utf8'; +--------------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------------+---------+-----+---------+----------+---------+ | utf8_general_ci | utf8 | 33 | Yes | Yes | 1 | | utf8_bin | utf8 | 83 | | Yes | 1 | ...略
方法 2: information_schema.COLLATIONS をクエリします。
mysql> USE information_schema; mysql> SELECT * FROM COLLATIONS WHERE CHARACTER_SET_NAME="utf8"; +--------------------------+--------------------+-----+------------+-------------+---------+ | COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN | +--------------------------+--------------------+-----+------------+-------------+---------+ | utf8_general_ci | utf8 | 33 | Yes | Yes | 1 | | utf8_bin | utf8 | 83 | | Yes | 1 | | utf8_unicode_ci | utf8 | 192 | | Yes | 8 |
3. 文字順序の命名仕様
文字順序の命名には、以下に示すように、対応する文字セットが接頭辞として付けられます。たとえば、文字シーケンス utf8_general_ci は、文字セット utf8 の文字シーケンスであることを示します。
その他のルールについては、公式ドキュメントを参照してください。
MariaDB [information_schema]> SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM COLLATIONS WHERE CHARACTER_SET_NAME="utf8" limit 2; +--------------------+-----------------+ | CHARACTER_SET_NAME | COLLATION_NAME | +--------------------+-----------------+ | utf8 | utf8_general_ci | | utf8 | utf8_bin | +--------------------+-----------------+ 2 rows in set (0.00 sec)
目的: データベースを作成し、文字セットまたは文字順序を指定しない場合、サーバーの文字セットとサーバーの文字順序がデフォルトの文字セットおよびソートとして使用されます。データベースのルール。
指定方法: MySQL サービスの開始時に、コマンド ライン パラメーターを通じて指定できます。構成ファイル内の変数を通じて指定することもできます。
サーバーのデフォルトの文字セットと文字順序: MySQL のコンパイル時にコンパイル パラメーターを通じて指定されます。
character_set_server とcollation_server は、それぞれサーバー文字セットとサーバー文字シーケンスに対応します。
1. 2 つのシステム変数character_set_server とcollation_server にそれぞれ対応するサーバーの文字セットと文字シーケンス
を確認します。
mysql> SHOW VARIABLES LIKE "character_set_server"; mysql> SHOW VARIABLES LIKE "collation_server";
2. サービス起動時に指定
MySQL サービス起動時にサーバーの文字セットと文字シーケンスを指定できます。指定しない場合、デフォルトの文字シーケンスはそれぞれ latin1 と latin1_swedish_ci になります。このとき、サーバーの文字シーケンスは latin1 のデフォルトの文字シーケンスです。
mysqld --character-set-server=latin1 \ --collation-server=latin1_swedish_ci
3. 設定ファイルの指定
コマンドラインパラメータで指定する以外に、以下のように設定ファイルで指定することもできます。
mysqld --character-set-server=latin1
4. ランタイム変更
例: ランタイム変更(再起動すると無効になります。再起動後も変更しない場合は設定ファイルに書き込む必要があります)
mysql> SET character_set_server = utf8 ;
5、编译时指定默认字符集、字符序
character_set_server、collation_server的默认值,可以在MySQL编译时,通过编译选项指定:
cmake . -DDEFAULT_CHARSET=latin1 \ -DDEFAULT_COLLATION=latin1_german1_ci
用途:指定数据库级别的字符集、字符序。同一个MySQL服务下的数据库,可以分别指定不同的字符集/字符序。
1、设置数据的字符集/字符序
可以在创建、修改数据库的时候,通过CHARACTER SET、COLLATE指定数据库的字符集、排序规则。
创建数据库:
CREATE DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]
修改数据库:
ALTER DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]
例子:创建数据库test_schema,字符集设置为utf8,此时默认的排序规则为utf8_general_ci。
CREATE DATABASE `test_schema` DEFAULT CHARACTER SET utf8;
2、查看数据库的字符集/字符序
有3种方式可以查看数据库的字符集/字符序。
例子一:查看test_schema的字符集、排序规则。(需要切换默认数据库)
mysql> use test_schema; Database changed mysql> SELECT @@character_set_database, @@collation_database; +--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8 | utf8_general_ci | +--------------------------+----------------------+ 1 row in set (0.00 sec)
例子二:也可以通过下面命令查看test_schema的字符集、数据库(不需要切换默认数据库)
mysql> SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE schema_name="test_schema"; +-------------+----------------------------+------------------------+ | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | +-------------+----------------------------+------------------------+ | test_schema | utf8 | utf8_general_ci | +-------------+----------------------------+------------------------+ 1 row in set (0.00 sec)
例子三:也可以通过查看创建数据库的语句,来查看字符集。
mysql> SHOW CREATE DATABASE test_schema; +-------------+----------------------------------------------------------------------+ | Database | Create Database | +-------------+----------------------------------------------------------------------+ | test_schema | CREATE DATABASE `test_schema` /*!40100 DEFAULT CHARACTER SET utf8 */ | +-------------+----------------------------------------------------------------------+ 1 row in set (0.00 sec)
3、database字符集、字符序是怎么确定的
创建数据库时,指定了CHARACTER SET或COLLATE,则以对应的字符集、排序规则为准。
创建数据库时,如果没有指定字符集、排序规则,则以character_set_server、collation_server为准。
创建表、修改表的语法如下,可通过CHARACTER SET、COLLATE设置字符集、字符序。
CREATE TABLE tbl_name (column_list) [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]] ALTER TABLE tbl_name [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]
1、创建table并指定字符集/字符序
例子如下,指定字符集为utf8,字符序则采用默认的。
CREATE TABLE `test_schema`.`test_table` ( `id` INT NOT NULL COMMENT '', PRIMARY KEY (`id`) COMMENT '') DEFAULT CHARACTER SET = utf8;
2、查看table的字符集/字符序
同样,有3种方式可以查看table的字符集/字符序。
方式一:通过SHOW TABLE STATUS查看table状态,注意Collation为utf8_general_ci,对应的字符集为utf8。
MariaDB [blog]> SHOW TABLE STATUS FROM test_schema \G; *************************** 1. row *************************** Name: test_table Engine: InnoDB Version: 10 Row_format: Compact Rows: 0 Avg_row_length: 0 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 11534336 Auto_increment: NULL Create_time: 2018-01-09 16:10:42 Update_time: NULL Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)
方式二:查看information_schema.TABLES的信息。
mysql> USE test_schema; mysql> SELECT TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = "test_schema" AND TABLE_NAME = "test_table"; +-----------------+ | TABLE_COLLATION | +-----------------+ | utf8_general_ci | +-----------------+
方式三:通过SHOW CREATE TABLE确认。
mysql> SHOW CREATE TABLE test_table; +------------+----------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +------------+----------------------------------------------------------------------------------------------------------------+ | test_table | CREATE TABLE `test_table` ( `id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +------------+----------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
3、table字符集、字符序如何确定
假设CHARACTER SET、COLLATE的值分别是charset_name、collation_name。如果创建table时:
明确了charset_name、collation_name,则采用charset_name、collation_name。
只明确了charset_name,但collation_name未明确,则字符集采用charset_name,字符序采用charset_name对应的默认字符序。
只明确了collation_name,但charset_name未明确,则字符序采用collation_name,字符集采用collation_name关联的字符集。
charset_name、collation_name均未明确,则采用数据库的字符集、字符序设置。
类型为CHAR、VARCHAR、TEXT的列,可以指定字符集/字符序,语法如下:
col_name {CHAR | VARCHAR | TEXT} (col_length) [CHARACTER SET charset_name] [COLLATE collation_name]
1、新增column并指定字符集/排序规则
例子如下:(创建table类似)
mysql> ALTER TABLE test_table ADD COLUMN char_column VARCHAR(25) CHARACTER SET utf8;
2、查看column的字符集/字符序
例子如下:
mysql> SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA="test_schema" AND TABLE_NAME="test_table" AND COLUMN_NAME="char_column"; +--------------------+-----------------+ | CHARACTER_SET_NAME | COLLATION_NAME | +--------------------+-----------------+ | utf8 | utf8_general_ci | +--------------------+-----------------+ 1 row in set (0.00 sec)
3、column字符集/排序规则确定
假设CHARACTER SET、COLLATE的值分别是charset_name、collation_name:
如果charset_name、collation_name均明确,则字符集、字符序以charset_name、collation_name为准。
只明确了charset_name,collation_name未明确,则字符集为charset_name,字符序为charset_name的默认字符序。
只明确了collation_name,charset_name未明确,则字符序为collation_name,字符集为collation_name关联的字符集。
charset_name、collation_name均未明确,则以table的字符集、字符序为准。
一般来说,可以在三个地方进行配置:
创建数据库的时候进行配置。
mysql server启动的时候进行配置。
从源码编译mysql的时候,通过编译参数进行配置
1、方式一:创建数据库的时候进行配置
这种方式比较灵活,也比较保险,它不依赖于默认的字符集/字符序。当你创建数据库的时候指定字符集/字符序,后续创建table、column的时候,如果不特殊指定,会继承对应数据库的字符集/字符序。
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
2、方式二:mysql server启动的时候进行配置
可以添加以下配置,这样mysql server启动的时候,会对character-set-server、collation-server进行配置。
当你通过mysql client创建database/table/column,且没有显示声明字符集/字符序,那么就会用character-set-server/collation-server作为默认的字符集/字符序。
另外,client、server连接时的字符集/字符序,还是需要通过SET NAMES进行设置。
[mysqld] character-set-server=utf8 collation-server=utf8_general_ci
3、方式三:从源码编译mysql的时候,通过编译参数进行设置
编译的时候如果指定了-DDEFAULT_CHARSET和-DDEFAULT_COLLATION,那么:
创建database、table时,会将其作为默认的字符集/字符序。
client连接server时,会将其作为默认的字符集/字符序。(不用单独SET NAMES)
shell> cmake . -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci
本文较为详细地介绍了MySQL中字符集、字符序相关的内容,这部分内容主要针对的是数据的存储与比较。其实还有很重要的一部分内容还没涉及:针对连接的字符集、字符序设置。
由于连接的字符集、字符序设置不当导致的乱码问题也非常多,这部分内容展开来讲内容也不少,放在下一篇文章进行讲解。
相关推荐:
以上がMySQL の文字セット設定を 5 分で理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。