この記事の内容は、Mysql の utf8_unicode_ci と utf8_general_ci の違いについてです。一定の参考値があるので、困っている友人は参考にしていただければ幸いです。
Mysql の utf8_general_ci と utf8_unicode_ci の違いは何ですか?プログラミング言語では、文字化けを防ぐために中国語の文字を処理するために通常 Unicode が使用されますが、MySQL ではなぜ utf8_unicode_ci ではなく utf8_general_ci を使用するのでしょうか?
これを長い間使用してきた後、utf_bin と utf_general_ci の違いさえ知らないことに気づきました。 。
ci は大文字と小文字を区別しません。つまり、「大文字と小文字を区別しない」ため、a と A は文字判定で同じものとして扱われます。
bin はバイナリで、a と A は別の方法で扱われます。
例:
SELECT * FROM table WHERE txt = 'a'
を実行すると、utf8_bin には txt = 'A' の行は見つかりませんが、utf8_general_ci では見つかります。
utf8_general_ci は大文字と小文字を区別しません。ユーザー名やメールアドレスを登録する際に使用します。
utf8_general_cs は大文字と小文字を区別します。これがユーザー名と電子メールに使用されると、悪影響が生じます。
utf8_bin: 文字列 各文字列はバイナリ データとともにコンパイルされ、保存されます。大文字と小文字が区別され、バイナリ コンテンツを保存できます
1. 公式ドキュメントの説明
以下は、utf8_unicode_ci および utf8_general_ci に関する Mysql 5.1 中国語マニュアルからの抜粋です:
現在、utf8_unicode_ci 照合ルールは Unicode 照合ルール アルゴリズムを部分的にのみサポートしています。一部の文字はまだサポートされていません。また、結合されたトークンは完全にはサポートされていません。これは主に、ウドムルト語、タタール語、バシキール語、マリ語など、ベトナムとロシアの一部の少数言語に影響します。
utf8_unicode_ci の最も重要な機能は、拡張、つまり、文字が他の文字の組み合わせと等しいとみなされる場合の拡張をサポートすることです。たとえば、「ß」はドイツ語やその他の言語では「ss」に相当します。
utf8_general_ci は従来の照合ルールであり、拡張機能をサポートしていません。文字ごとの比較のみが可能です。これは、utf8_general_ci 照合順序によって行われる比較は高速ですが、utf8_unicode_ci 照合順序を使用する比較よりも精度が低いことを意味します。
たとえば、2 つの照合規則 utf8_general_ci と utf8_unicode_ci を使用すると、次の比較は同等になります。
Ä = A
Ö = O
Ü = U
2 つの照合間の比較ルール 違いは、utf8_general_ci では次の方程式が成り立つことです:
ß = s
ただし、utf8_unicode_ci では次の方程式が成り立ちます:
ß = ss
1 つの言語のみutf8_unicode_ci を使用した並べ替えがうまく機能しない場合は、特定の言語に関連する utf8 文字セットの照合規則が実装されます。たとえば、ドイツ語とフランス語の場合、utf8_unicode_ci は問題なく機能するため、これら 2 つの言語に対して特別な utf8 照合規則を作成する必要はありません。
utf8_general_ci は、「ß」が「ss」ではなく「s」と等しいことを除いて、ドイツ語とフランス語でも機能します。アプリケーションがこれを受け入れることができる場合は、高速な utf8_general_ci を使用する必要があります。それ以外の場合は、より正確な utf8_unicode_ci を使用してください。
gb2312 エンコードを使用する場合は、データ テーブルのデフォルトの文字セットとして latin1 を使用することをお勧めします。これにより、中国語のコマンド ライン ツールにデータを直接挿入して、直接表示できるようになります。 gb2312 や gbk などの文字セットは使用しないでください。クエリの並べ替えやその他の問題が心配な場合は、
create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;
2 などのバイナリ属性制約を使用できます。中国語と英語の ##utf8_unicode_ci と utf8_general_ci 実際の違いはありません。
utf8_general_ci 校正速度は速いですが、精度は若干劣ります。 utf8_unicode_ci は精度は高いですが、校正速度が若干遅くなります。
アプリケーションがドイツ語、フランス語、またはロシア語の場合は、必ず utf8_unicode_ci を使用してください。一般的には utf8_general_ci を使用すれば十分であり、今のところ問題は見つかっていません。 。 。
1. 言語の場合、utf8_unicode_ci のソートがうまく行われていない場合にのみ、特定の言語に関連する utf8 文字セットの修正が行われます。行われるルールです。たとえば、ドイツ語とフランス語の場合、utf8_unicode_ci は問題なく機能するため、これら 2 つの言語に対して特別な utf8 照合規則を作成する必要はありません。
2. utf8_general_ci は、「?」が「ss」ではなく「s」に等しいことを除いて、ドイツ語とフランス語にも適用できます。アプリケーションがこれを受け入れることができる場合は、高速な utf8_general_ci を使用する必要があります。それ以外の場合は、より正確な utf8_unicode_ci を使用してください。
上記の段落を 1 つの文で要約します。utf8_unicode_ci の方が正確で、utf8_general_ci の方が高速です。通常の状況では、utf8_general_ci の精度で十分に使用できますが、多くのプログラムのソース コードを読んだところ、ほとんどのソース コードでも utf8_general_ci が使用されていることがわかりました。そのため、新しいデータベースを作成する場合は、通常 utf8_general_ci が使用されます。
my.cnfに次のパラメータを追加します[mysqld]
init_connect='SET NAMES utf8′
default-character-set=utf8
default-collation = utf8_general_ci
character_set_client | utf8 character_set_connection | utf8 character_set_database | utf8 character_set_results | utf8 character_set_server | utf8 character_set_system | utf8
collation_connection | utf8_general_ci collation_database | utf8_general_ci collation_server | utf8_general_ci
個人的な意見ですが、データベースを利用する場合は utf8 - general で十分精度が高く、utf8 - unicode と比較すると速度面で有利なので安心して使えます
附1:旧数据升级办法
以原来的字符集为latin1为例,升级成为utf8的字符集。原来的表: old_table (default charset=latin1),新表:new_table(default charset=utf8)。
第一步:导出旧数据
mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table > old.sql
第二步:转换编码(类似unix/linux环境下)
iconv -t utf-8 -f gb2312 -c old.sql > new.sql
或者可以去掉 -f 参数,让iconv自动判断原来的字符集
iconv -t utf-8 -c old.sql > new.sql
在这里,假定原来的数据默认是gb2312编码。
第三步:导入
修改old.sql,在插入/更新语句开始之前,增加一条sql语句: "SET NAMES utf8;",保存。
mysql -hlocalhost -uroot my_db < new.sql
大功告成!!
附2:支持查看utf8字符集的MySQL客户端有
1.) MySQL-Front,据说这个项目已经被MySQL AB勒令停止了,不知为何,如果国内还有不少破解版可以下载(不代表我推荐使用破解版 :-P)。
2.) Navicat,另一款非常不错的MySQL客户端,汉化版刚出来,还邀请我试用过,总的来说还是不错的,不过也需要付费。
3.) PhpMyAdmin,开源的php项目,非常好。
4.) Linux下的终端工具(Linux terminal),把终端的字符集设置为utf8,连接到MySQL之后,执行 SET NAMES UTF8; 也能读写utf8数据了。
本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的MySQL视频教程栏目!
以上がMySQL の utf8_unicode_ci と utf8_general_ci の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。