MySQLでデータベースの文字セットを表示および変更する方法


基本概念

文字(文字)は、人間の言語で最小の記号を指します。たとえば、「A」、「B」など。

  • 一連の文字を指定して、各文字に数値を割り当て、その数値を使用して対応する文字を表します。この数値が文字エンコード(エンコード)です。たとえば、値0を文字「A」に割り当て、値1を文字「B」に割り当てる場合、0は文字「A」のコードです。
  • 一連の文字が与えられ、対応するコードが割り当てられると、これらすべての文字とコードペアのセットが文字セット(文字セット)になります。たとえば、指定された文字リストが{'A'、 'B'}の場合、{'A' => 0、 'B' => 1}は文字セットです。
  • 照合とは、同じ文字セット内の文字間の比較規則を指します。
  • 文字シーケンスを決定した後でのみ、文字セットの同等の文字、および文字間のサイズの関係を定義できます。
  • 各文字シーケンスは文字セットに一意に対応しますが、文字セットは複数の文字シーケンスに対応でき、そのうちの1つがデフォルトの文字シーケンス(デフォルトの照合)です。
  • MySQLの文字シーケンス名は、命名規則に従います。文字シーケンスに対応する文字セットの名前で始まり、_ci(大文字と小文字を区別しないことを示す)、_ cs(大文字と小文字を区別することを示す)、または_bin(エンコード値による比較を示す)で終わります。 )。例:文字順「utf8_general_ci」では、文字「a」と「A」は同等です。

MySQLの文字セット設定

システム変数:

MySQLデータサーバーとデータベースの文字セットを表示する

show variables where variable_name rlike 'character|collation';

ここに画像の説明を挿入します

MYSQLでサポートされている文字セットを表示する

show character set;

ここに画像の説明を挿入します

または

show charset;

ここに画像の説明を挿入します

  • character_set_server:デフォルトの内部操作文字セット
  • character_set_client:クライアントソースデータで使用される文字セット
  • character_set_connection:接続レイヤーの文字セット
  • character_set_results:クエリ結果の文字セット
  • character_set_database:現在選択されているデータベースのデフォルトの文字セット
  • character_set_system:システムメタデータ(フィールド名など)の文字セット
  • 文字の順序を説明するために、collat​​ion_で始まる対応する変数もあります。

MySQLでの文字セット変換プロセス

MySQL Serverは、リクエストを受信すると、リクエストデータをcharacter_set_clientからcharacter_set_connection
に変換します。内部操作を実行する前に、リクエストデータをcharacter_set_connectionから内部操作の文字セットに変換します。決定方法は次のとおりです。

  • 各データフィールドのCHARACTERSET設定値を使用します。
  • 上記の値が存在しない場合は、対応するデータテーブル(MySQL拡張機能、非SQL標準)のDEFAULT CHARACTERSET設定値を使用します。
  • 上記の値が存在しない場合は、対応するデータベースのDEFAULT CHARACTERSET設定値を使用してください。
  • 上記の値が存在しない場合は、character_set_server設定値が使用されます。
    演算結果を内部演算文字セットからcharacter_set_resultsに変換します。
    ここで、生成した文字化けの問題を分析します。a
    フィールドに文字セットがないため、テーブルのデータセットが使用されます
    。bテーブルで文字セットが指定されておらず
    、データベースの文字セット指定されています。デフォルト使用されますcデータベースが作成されています文字セットが指定されていない場合、character_set_serverを使用して値
    dを設定します。指定されたcharacter_set_serverの文字セット
    意図的に変更しなかったため、mysqlのデフォルトの文字セットはlatin1です。したがって、latin1文字セットを使用し、character_set_connection文字セットはUTF-8であり、中国語の文字化け文字を挿入することは避けられません。

一般的な問題分析

  • FAQ-1 utf8でエンコードされたデータをutf8のデフォルト文字セットでデータテーブルに挿入する前に接続文字セットが設定されておらず、クエリ時に接続文字セットがutf8に設定されている-MySQL
    サーバーのデフォルト設定に従って挿入、character_set_client、character_set_connection、およびcharacter_set_resultsはすべてlatin1です; -latin1
    を介したデータの挿入=> latin1 => utf8文字セット変換プロセス、6バイトへの各挿入文字のプロセスは元の3バイトから保存されます;
    -クエリの場合結果はutf8 => utf8の文字セット変換プロセスを経て、保存された6バイトはそのまま返され、文字化けした文字になります。下の図を参照してください。
  • 接続文字セットは、utf8でエンコードされたデータをデータテーブルに挿入する前にutf8に設定され、デフォルトの文字セットはlatin1です(発生したエラーはこの種類に属します)
    -挿入時の接続文字セット設定に従って、character_set_client、character_set_connectionおよびcharacter_set_resultsはすべてutf8です;
    -挿入されたデータはutf8 => utf8 => latin1の文字セット変換を受けます。元のデータに\ u0000〜 \ u00ffの範囲外のUnicode文字が含まれている場合、それらは「?」に変換されます。 latin1文字セット(0×3F)記号で表すことはできません。後で問い合わせるときに、接続文字セットの設定に関係なく、コンテンツを復元することはできません。変換プロセスは次のとおりです。

文字セットの問題を検出するためのいくつかの手段

  • 文字セットを表示します。
  • 照合を表示します。
  • '文字%'のような変数を表示します。
  • 'collat​​ion%'のような変数を表示します。
  • SQLERROR数HEX、LENGTH、CHAR_LENGTH
  • SQL関数CHARSET、COLLATION

MySQL文字セットを使用する際の推奨事項

  • データベース/テーブルを作成してデータベース操作を実行するときは、MySQLのデフォルト設定に依存するのではなく、使用する文字セットを明示的に示すようにしてください。そうしないと、MySQLのアップグレード時に大きな問題が発生する可能性があります。
  • データベースと接続文字セットの両方でlatin1を使用すると、文字化けの問題はほとんど解決できますが、SQL演算を文字単位で実行できないというデメリットがあります。一般的には、データベースと接続文字の両方を設定することをお勧めします。 utf8 sChoiceに設定します。
  • mysql CAPI(mysqlはC言語操作APIを提供します)を使用する場合、データベースハンドルを初期化した直後に、mysql_optionsを使用してMYSQL_SET_CHARSET_NAME属性をutf8に設定します。これにより、SETNAMESステートメントを明示的に使用して接続文字セットを指定する必要がなくなります。 mysql_pingを使用して再接続および切断します。接続文字セットも、長い接続中にutf8にリセットされます。
  • mysql PHP APIの場合、一般的なページレベルのPHPプログラムの実行時間は短くなります。データベースに接続した後、SET NAMESステートメントを使用して接続文字セットを1回明示的に設定できますが、長い接続を使用する場合は注意が必要です。接続を開いたままにするには、切断して再接続した後、SETNAMESステートメントを使用して接続文字セットを明示的にリセットします。

注意が必要なその他の事項

  • my.cnfのdefault_character_set設定は、mysqlコマンドがサーバーに接続するときの接続文字セットにのみ影響し、libmysqlclientライブラリを使用するアプリケーションには影響しません。
  • フィールドに対するSQL関数の操作は、通常、内部操作の文字セットで実行され、接続文字セットの設定の影響を受けません。
  • SQLステートメントの裸の文字列は、接続文字セットまたはイントロデューサ設定の影響を受けます。比較などの操作では、まったく異なる結果が生成される可能性があるため、注意が必要です。

文字セットを変更する

グローバル文字セットを変更する

 /*建立连接使用的编码*/
set character_set_connection=utf8;
/*数据库的编码*/
set character_set_database=utf8;
/*结果集的编码*/
set character_set_results=utf8;
/*数据库服务器的编码*/
set character_set_server=utf8;

set character_set_system=utf8;

set collation_connection=utf8;

set collation_database=utf8;

set collation_server=utf8;

ライブラリの文字セットを変更する

语法:alter database 库名 default character set 字符集;

テーブルの文字セットを変更します

语法:alter table 表名 convert to character set 字符集;

フィールドの文字セットを変更します

语法:alter table 表名 modify 字段名 字段属性 character set gbk;

おすすめ

転載: blog.csdn.net/lz6363/article/details/114904325
おすすめ