libmysqlclientを使用して、データを(驚くほど)データベースに挿入するCプログラムを作成しています。そのコードはに挿入すると、それはある照合ですテーブルのキャラクタ・セット:私のCプログラムでlibmysqlclientを使用したcollation_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_options
とMYSQL_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()
が影響を受ける方法。それを行う正しい方法は何ですか?
さて、rootや他のスーパーユーザは実行しませんが、mysql_get_character_set_info()関数の結果にどのような影響を与えますか? mysql_real_escape_string()が影響を受けるように文字セットと照合順序を設定するにはどうすればよいですか? – gst
私はあなたが言ったことをしましたが、すべてが同じです! – gst