2016-09-12 7 views
1

libmysqlclientを使用して、データを(驚くほど)データベースに挿入するCプログラムを作成しています。そのコードはに挿入すると、それはある照合ですテーブルのキャラクタ・セット:私のCプログラムでlibmysqlclientを使用したcollat​​ion_connectionの設定C API

CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 

私は文字セットを変更するためにmysql_set_character_set()を使用。この関数は照合ではなく文字セットのみを変更するという問題があります。

char-set=utf8mb4, collation=utf8mb4_general_ci 

MySQL documentationによると:私は結果があるmysql_get_character_set_infoを使用して文字セットと照合を照会した場合

のSET NAMES文字は、クライアントがサーバにSQL文を送信するために使用する設定したものを示しています。したがって、SET NAMES 'cp1251'はサーバーに「このクライアントからの今後の着信メッセージは文字セットcp1251にあります」と伝えます。また、サーバーが結果をクライアントに返すために使用する文字セットも指定します。

だから私はmysql_optionsMYSQL_INIT_COMMANDを使用して、接続の照合順序を変更することを決めた:

SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; 

結果の関数呼び出しは、この(私はmysql_real_connect()前にこれを呼ばれる)のようになります。

if(mysql_options(conn, MYSQL_INIT_COMMAND, 
     "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';")) { 
    // log the errors and do proper actions 
} 

しかし、それはそうですこのコマンドは文字セットと照合順序を変更できないことに注意してください。私は照会すると、今の文字がmysql_get_character_set_info()を使用して設定するので、結果は次のとおりです。

char-set=latin1, collation=latin1_swedish_ci 

ここで興味深いのは、私は、ログを有効にしてMYSQL_INIT_COMMANDコマンドでプログラムを実行する場合、MySQL側で実行することです!しかし、mysql_get_character_set_info()はこれを表示していません!再びlibmysqlのマニュアルによると:

int型mysql_set_character_set(MYSQL * mysqlの、constのchar型* csname)

この関数は、現在の 接続のデフォルトの文字セットを設定するために使用されます。文字列csnameは、有効な文字セット名を指定します。 接続照合は、 文字セットのデフォルト照合になります。この関数は、SET NAMES文のように動作しますが、 もはmysql->のcharsetの値を設定し、ひいては(mysql_real_escape_stringので使用される文字 セットに影響します)

私は中キャラクタセットと照合を変更したいですmysql_real_escape_string()が影響を受ける方法。それを行う正しい方法は何ですか?

答えて

0

initコマンドはrootユーザによって実行されません。 (具体的には、SUPERユーザー)。アプリケーションに別のユーザーを作成することをお勧めします。

テーブルの列もCHARACTER SET utf8mb4と宣言する必要があることを忘れないでください。

+0

さて、rootや他のスーパーユーザは実行しませんが、mysql_get_character_set_info()関数の結果にどのような影響を与えますか? mysql_real_escape_string()が影響を受けるように文字セットと照合順序を設定するにはどうすればよいですか? – gst

+0

私はあなたが言ったことをしましたが、すべてが同じです! – gst

関連する問題