MySQL(5.6.11)で4バイトのutf8mb4
を使用するために、my.ini
ファイルに次の変数を設定しました(my.cnf
が見つかりません)。このファイルは、Windows XPではApplication Data
(C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.6
)という名前の隠しフォルダにあります。インストールディレクトリでは使用できません。
[client]
port=3306
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
そして、次のコマンドを発行し、
SHOW VARIABLES
WHERE Variable_name
LIKE 'character\_set\_%'
OR Variable_name LIKE 'collation%';
次のリストが引き続き表示されます。
画像自体から、いくつかの変数がまだ3バイトのutf8
を使用していることは明らかです。
これを行う前に、データベース自体に対応する変更を加えるために、次のコマンドがすでに発行されていました。
ALTER DATABASE database_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
また、次のコマンドは、前述のデータベースのすべてのテーブルに対しても発行されました。
ALTER TABLE table_name
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
それにもかかわらず、いくつかの変数がまだ照合と同様に上記の文字セットに設定されていない理由は何ですか?何が欠けている?
上記のすべてのタスクが実行された後、システム(オペレーティングシステム)自体が再起動されました。
clientは通常、接続時にこれらの値を設定します。 my.iniの設定は、クライアントが接続エンコーディングを明示的に指定していない場合に適用されるデフォルトにすぎません。それらは信頼できないため、すべてのクライアントすべきは接続エンコーディングを指定します。いくつかの豪華なスクリーンショットがあるので、おそらく明示的にdoesいくつかの接続エンコーディングを設定するGUIユーティリティを使用して接続していると思います。
接続文字セットを設定するPHPの例:
new PDO('mysql:Host=localhost;charset=utf8mb4')
グローバル変数を表示すると、実際にはすべての設定が正しいことがわかります。
SHOW GLOBAL VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
これはこれに関連しているかもしれません バグ 私も過去に同じ問題に直面しました。 DB文字セットをutf8からutf8mb4に変更しました。 mysqlコマンドラインから直接クエリを実行しても問題ありませんでしたが、Workbenchで絵文字を挿入するときに問題が発生しました。実行して手動で設定してしまいました
SET NAMES 'utf8mb4'
workbenchでDBへの接続を開くたびに。
Sequel Proを代替として使用しても問題ありませんでした。
Rootとして接続していると思います。したがって、init-connect='SET NAMES utf8mb4'
は実行されません。
アプリケーションコードにルート(またはSUPER)を使用するのは賢明ではありません。管理上のアクションのためだけに。