最近、会社の古いプロジェクトで絵文字表現をサポートする必要がありました。最初はデータベースのテーブル フィールドを変更するだけだと思っていましたが、予想外に一連の問題が発生しました。メモ用にまとめておきます。
character_set_server: デフォルトの内部動作文字セット
character_set_client: クライアントソースによって使用される文字セットdata
character_set_connection: 接続レイヤー文字set
character_set_results: クエリ結果の文字 set
character_set_database: 現在選択されているデータベースのデフォルトの文字セット
character_set_system: システムメタデータ (フィールド名など) 文字セット
02 MySQL での文字セット変換処理
MySQL Server コレクション Convertリクエスト時に character_set_client
から character_set_connection
にリクエスト データを変換します。 character_set_client
转换为character_set_connection
;
进行内部操作前将请求数据从 character_set_connection
转换为内部操作字符集,其确定方法如下:
使用表中字段的 CHARACTER SET 设定值;
若上述值不存在,则使用对应数据表的 DEFAULT CHARACTER SET 设定值(MySQL扩展,非SQL标准);
若上述值不存在,则使用对应数据库的 DEFAULT CHARACTER SET 设定值;
若上述值不存在,则使用 character_set_server
设定值。
将操作结果从内部操作字符集转换为 character_set_results
, 响应请求。
03 MySQL 启动配置文件 my.cnf
default-character-set: 设置 mysql 命令行连接的默认字符集
character-set-server: 设置系统内部操作字符集(即上文说到的character_set_server)
collation_server: 设置系统默认字符集排序
04 PHP连接 MySQL(以PDO连接方式为例)
常见的两种设置字符集的方式
mysql:host=localhost;dbname=db_demo;charset=utf8mb4
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
05 总结
数据表字段的字符集需要是utf8mb4
,这个是刚需
一般 character_set_client
、character_set_connection
、character_set_results
的字符集相同,且都为utf8mb4
(这三个参数默认都是utf8mb4
,如果不是,是实现不了 emoji 表情的,原因参照字符集转换过程)。
连接数据库的字符集也需要是utf8mb4
character_set_server
、character_set_database
character_set_connection
から内部操作に変換します。 set は次のように決定されます:
character_set_server
を使用して値を設定します。 🎜🎜🎜🎜🎜リクエストに応じて、内部演算文字セットから演算結果をcharacter_set_results
に変換します。 🎜🎜🎜🎜03 MySQL の起動設定ファイル 🎜 my.cnf🎜🎜🎜🎜default-character-set: mysql コマンドライン接続のデフォルトの文字セットを設定します🎜character-set-server:システム内部操作の文字セットを設定します (つまり、上記のcharacter_set_server)🎜collation_server: システムのデフォルトの文字セットのソートを設定します🎜🎜04 MySQLへのPHP接続(PDO接続方法を例にします)🎜🎜文字セットを設定する2つの一般的な方法🎜🎜 🎜 🎜mysql:host=localhost;dbname=db_demo;charset=utf8mb4🎜🎜🎜🎜PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"🎜🎜🎜🎜05 概要🎜🎜🎜🎜データ テーブルフィールドの文字セットする必要があるutf8mb4 です。これは必要なだけです🎜🎜🎜🎜通常、character_set_client
、character_set_connection
、および character_set_results
の文字セットは、 > は同じで、すべて utf8mb4
です (デフォルトでは、これら 3 つのパラメータはすべて utf8mb4
です。そうでないと絵文字表現が実現できません。理由については、を参照してください)文字セット変換プロセス)。 🎜🎜🎜🎜データベースに接続するための文字セット 🎜 も utf8mb4 である必要がありますcode>🎜🎜 🎜🎜<code>character_set_server
、character_set_database
、およびその他のデフォルトの文字セット タイプはそれほど重要ではありませんが、一貫性を保つことが最善です🎜🎜🎜🎜 確かにたくさんありますTP には落とし穴があるので、TP には近づかないでください🎜 🎜🎜以上がMySQL 文字セットの問題の詳細な説明 (図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。