InnoDBとMySQLのトランザクションを学習し始めたとき(3.23から4.1にアップグレードする必要がありました)、PHPとMySQLの間で誤ったデータ交換の問題が発生しました。これは、PHPスクリプトによって生成されたリクエストのキリル文字の代わりに、セルに挿入されたという事実に現れましたDBテーブルの疑問符。 「喫煙」ドキュメンテーション、フォーラムの閲覧、記事の研究の過程で、問題の理解が得られ、解決策が見つかりました。
問題の根本的な原因は、バージョン4.1より前では、サーバー全体にのみエンコードを設定できることでした(
--default-charset
パラメーターを定義することにより)。開発者は、DBMS階層のさまざまなレベルでエンコードを決定する機能を追加しました(サーバー全体、データベース、テーブル、列)。
いくつかの用語
文字セットは、エンコードと呼ばれる文字のセットです。 異なる文字セットには、異なる文字セットが含まれます。 異なる文字セットには、ほぼ同じ文字セットを含むことができますが、順序は異なります(たとえば、koi8ruとcp1251を参照)。 MySQLは、データを正しくソートおよびインデックス付けするために、テーブル内のデータにどのCHARACTER SETが使用されるかを知る必要があります。
収集 -データベース内のデータを整理および比較する方法。
同じ文字セットに対して、通常、いくつかのコレクションがあります。 例:cp1251_general_ci-比較では大文字と小文字が区別されません。cp1251_bin-大文字と小文字は区別されます。
エンコードの問題を回避するには、DBMS階層のさまざまなレベルにどのように設定できるかを把握する必要があります。
エンコードを設定する方法
1)コンパイル中のサーバー全体について、パラメーター
--with-charset
および
--with-collation
定義します。
./configure --with-charset = cp1251 --with-collation = cp1251_general_ci
2)mysqldの起動時のサーバー全体に対して、パラメーター
--character-set-server
および
--collation-server
定義することにより:
mysqld --character-set-server = cp1251 --collation-server = cp1251_bin
3)データベースを作成する場合:
CREATE DATABASE dbname DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin;
4)テーブルを作成する場合:
CREATE TABLE tblname(col INT)DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin;
5)列の定義:
CREATE TABLE tblname(<br> column1 varchar(255)、<br> column2 varchar(255)CHARACTER SET cp1251 COLLATE cp1251_general_ci <br>)DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin;
データ構造がどのエンコーディングにアタッチされているかを確認するには、
SHOW CREATE
ステートメントを使用できます。
mysql> SHOW CREATE TABLE tree_nodes;
| tree_nodes | CREATE TABLE `tree_nodes`(<br> ... <br>)エンジン= InnoDB <b>デフォルトCHARSET = cp1251 COLLATE = cp1251_bin </ b> |
クライアントプログラムを使用する
サーバーに接続するとき、mysqlクライアントはいくつかの変数を設定できます。
-
character_set_client
クライアントからのデータのエンコードが行われることを示します。 -
character_set_connection
リクエストを実行する前に、クライアントから受信したデータをどのエンコードに変換するかを示します。 -
collation_connection
クエリ内の文字列を比較する方法を示します。 -
character_set_results
サーバーに、クエリ結果を特定のエンコードに変換してからクライアントに発行する必要がないことをサーバーに示します。
クライアントがサーバーで正しく動作するには、SETステートメントを使用して、少なくともcharacter_set_client、character_set_connection、character_set_resultsを設定します。
mysql_query( "SET character_set_client = 'cp1251'"); <br> mysql_query( "SET character_set_connection = 'cp1251'"); <br> mysql_query( "SET character_set_results = 'cp1251'");
クエリとデータベース内のデータが同じエンコードであり、結果がエンコードされていない場合、character_set_client、character_set_connection、character_set_resultsを設定する代わりに、次のことを行うだけで十分です。
mysql_query( "SET NAMES 'cp1251'");
デフォルトで設定されたこれらの変数の値を確認するには、
SHOW VARIABLES
演算子を使用できます。
'character_set%'のような変数を表示します。