MySQLの文字セットが間違っています.

2950 ワード

文字セットを使うときは、3つの部分があります.
1.サーバで使用する文字セットは、テーブル定義時にdefault charsetで指定した文字セット2と接続して使用する文字セットです.一般的にset namesで3.クライアントが使用する文字セットを指定し、記録時に記録した文字セットを挿入します.
漢字がデータベースにどう保存されているかを気にしないと、1,2の一致を保証し、書き込みと読み込みの3つが同じです.使う時に文字化けが発生しません.データベースに保存されている内容が実際に指定された文字セットと違っていても.これはなぜデフォルトではlatin 1のコードを使うのですか?このとき、1と2が違ったら、MySQLは自動的にトランスコードされ、1の符号化範囲に漢字が含まれていないため、文字化けが発生する可能性があります.
データベースの内容と指定された文字セットが一致することを望むなら、1でgbkまたはutf 8に設定して、漢字の符号化範囲を保証します.そして2,3の文字セットは常に一致していますが、書き込みと読み出しで使用する文字セットは異なります.例えば、表定義にgbkを使う
CREATE TABLE `aa` (
`a` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk
レコードを挿入するときはutf 8を使用します.MySQLは自動的にutf 8の文字をgbkの文字に変換してデータベースに挿入します.挿入レコードがutf 8符号化されるためには、termの符号化をutf 8に設定する必要があります.puttyを使うと、change settings/Translationで変更されます.
mysql> set names utf8;
mysql> insert into aa values (' ');
そして、読み出し時には、まだutf 8を使用するか、またはgbkを使用する.
mysql> set names gbk;
mysql> select * from aa;
+------+
| a |
+------+
| |
+------+
1 rows in set (0.00 sec)
MySQLはgbkでコンテンツを出力します.この場合、termのコードをgbkに変更して正常に表示する必要があります.puttyでは、表示フォントを中国語フォントに変更し、Use font encodingとして符号化し、gbkの符号化を表示します.
挿入が2、3で使用する文字セットが一致しないと、正常に読み込むときに文字化けが発生します.例えば、現在のtermのコードはutf 8です.

mysql >set names gbk;
Query OK, 0 rows affected (0.00 sec)

mysql>insert into aa values (' ');
Query OK, 1 row affected (0.00 sec)

mysql>set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql>select * from aa;
+-----------+
| a |
+-----------+
| |
| ぉ |
+-----------+
2 rows in set (0.01 sec)
このときaaの2番目のレコードがデータベースに保存されているのは「明日」のutf 8符号化ですので、set names utf 8を使用すると、MySQLは読み取り時にgbkからutf 8への変換を一回して、文字化けが発生します.set names gbkの場合、MySQLは符号化変換されず、termの符号化を保存しておくと、第二の記録が正常に表示されますが、第一条はまた文字化けになります.
mysql >select * from aa;
+--------+
| a |
+--------+
| ▒▒▒ |
| |
+--------+
2 rows in set (0.00 sec)
私たちは下の文を使ってコードを修正できます.

mysql >set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql >update aa set a = convert(convert(a using binary) using utf8) where a <> ' ';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql >select * from aa;
+--------+
| a |
+--------+
| |
| |
+--------+
2 rows in set (0.00 sec)
同じように、元に使用されていたコードがずっとlatin 1であった場合、その後、utf 8に変換したい場合は、次のステップに従うことができる.
create table x (a varchar(10)) character set latin1;
set names latin1;
insert into x values (' ');
set names utf8;
alter table x modify a varchar(10) character set utf8;
update x set a = convert(convert(convert(a using latin1) using binary) using utf8);