ホームページ  >  記事  >  mysqlの照合とはどういう意味ですか?

mysqlの照合とはどういう意味ですか?

百草
百草オリジナル
2023-07-11 14:32:313266ブラウズ

Mysql の Collat​​e は照合セットを意味し、並べ替えルールとして理解できます。 MySQL では、使用される文字セットと照合ルールに応じて、格納された文字データに異なる照合順序が適用される場合があります。文字セットは保存できる文字の種類を決定し、照合規則はそれらの文字の並べ替え方法を決定します。

mysqlの照合とはどういう意味ですか?

このチュートリアルのオペレーティング システム: Windows 10 システム、mysql バージョン 8.0、Dell G3 コンピューター。

mysql COLLATE は校正セットを意味し、並べ替えルールなどとして理解できます。

MySQL では、使用される文字セットと照合規則に応じて、格納された文字データに異なる照合規則を適用できます。文字セットは保存できる文字の種類を決定し、照合規則はこれらの文字の並べ替え方法を決定します。

通常、データベースまたはテーブルを作成するときに、さまざまな文字セットと照合ルールを指定することで、文字データのソート方法を設定できます。特定の照合ルールが指定されていない場合、MySQL はデフォルトの照合ルールを使用します。一般的な文字セットと照合規則には、utf8mb4_general_ci (大文字と小文字を区別しない、アクセントを区別しない)、utf8mb4_unicode_ci (大文字と小文字を区別しない、アクセントを区別する) などが含まれます。

照合ルールの選択は、特定のニーズに基づいて決定されます。さまざまな照合ルールがさまざまなシナリオに適しています。たとえば、データを検索および並べ替える場合、大文字と小文字を区別した比較を行う照合ルールもあれば、そうでない照合ルールもあります。したがって、データベースを設計するときは、実際のニーズとビジネス ルールに基づいて適切な照合ルールを選択する必要があります。

さまざまな照合ルールを使用することで、さまざまな並べ替え方法を実現できます。たとえば、文字データは大文字と小文字を区別せずに並べ替えることができます。つまり、「A」と「a」は等しいと見なされます。対照的に、大文字と小文字を区別する照合ルールが使用された場合、「A」と「a」は異なる文字として扱われます。

さらに、照合ルールは文字列比較操作にも影響を与える可能性があります。照合ルールが異なると、文字間の比較結果が異なる場合があります。たとえば、一部の照合ルールでは文字「a」が文字「Z」よりも大きいと見なされますが、他のルールではその逆が当てはまります。

照合ルールは、文字データの並べ替えと比較だけでなく、文字列関数や演算子がクエリで使用された場合の結果にも適用されることに注意してください。したがって、SQL クエリを作成するときは、期待される結果を確実に得るために使用される照合ルールを考慮する必要があります。

mysql で show create table コマンドを実行すると、テーブルのテーブル作成ステートメントが表示されます。例は次のとおりです:

CREATE TABLE `table1` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1',
    `field2` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '字段2',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci;

ほとんどのフィールドは理解できますが、今日は COLLATE キーワードについて説明します。この値の後ろにある対応する utf8_unicode_ci は何を意味しますか? DBA 試験を受ける際の面接でこの質問を使用すると、ほとんどの人がつまづいてしまうはずです。

COLLATE は何に使用されますか?

#phpmyadmin を使用している開発者は、中国語のヘッダーですでに答えが得られているため、非常に馴染みのあるものに見えるかもしれません:

mysqlの照合とはどういう意味ですか?

##いわゆる utf8_unicode_ci 、は実際には並べ替えに使用されるルールです。 VARCHAR、CHAR、TEXT タイプのカラムなど、mysql の文字タイプのカラムの場合、カラムのソートと比較の方法を mysql に指示するために COLLATE タイプが必要です。つまり、COLLATE は、ORDER BY ステートメントの順序、WHERE 条件の大なり小なり記号によってフィルタリングされた結果、および **DISTINCT**、**GROUP BY**、**HAVING* に影響します。 * ステートメント、クエリ結果。また、MySQL がインデックスを構築する際、インデックスカラムが文字型の場合、インデックスの作成にも影響しますが、この影響は認識できません。つまり、文字タイプの比較または並べ替えが関係する場合は、必ず COLLATE に関連します。

さまざまな COLLATE

COLLATE の違いは、通常、データ エンコーディング (CHARSET) に関連しています。一般的に、各 CHARSET には複数の COLLATE がサポートされており、それぞれの COLLATE がサポートされています。 CHARSET はデフォルト値として COLLATE を指定します。たとえば、Latin1 エンコードのデフォルト COLLATE は latin1_swedish_ci、GBK エンコードのデフォルト COLLATE は gbk_chinese_ci、utf8mb4 エンコードのデフォルト値は utf8mb4_general_ci です。

余談ですが、mysql には utf8 と utf8mb4 という 2 つのエンコーディングがあります。mysql では **utf8** は忘れて、常に **utf8mb4** を使用してください。これは MySQL のレガシー問題です。MySQL の UTF8 は、最大長 3 バイトの文字エンコーディングのみをサポートします。4 バイトを占める必要がある一部のテキストについては、MySQL の UTF8 はサポートしません。utf8mb4 を使用する必要があります。

多くの COLLATE には、_ci という単語が含まれています。これは Case Insensitive の略語で、並べ替えと比較の際に「A」と「a」が同等に扱われることを意味します。 selection * from table1 where field1="a" では、field1 の値を「A」として選択することもできます。同時に、_cs サフィックスが付いた COLLATE では、Case Sensitive、つまり大文字と小文字が区別されます。

在mysql中使用show collation指令可以查看到mysql所支持的所有COLLATE。以utf8mb4为例,该编码所支持的所有COLLATE如下图所示。

mysqlの照合とはどういう意味ですか?

imgmysql中和utf8mb4相关的所有COLLATE

图中我们能看到很多国家的语言自己的排序规则。在国内比较常用的是utf8mb4_general_ci(默认)、utf8mb4_unicode_ci、utf8mb4_bin这三个。我们来探究一下这三个的区别:

首先utf8mb4_bin的比较方法其实就是直接将所有字符看作二进制串,然后从最高位往最低位比对。所以很显然它是区分大小写的。

而utf8mb4_unicode_ci和utf8mb4_general_ci对于中文和英文来说,其实是没有任何区别的。对于我们开发的国内使用的系统来说,随便选哪个都行。只是对于某些西方国家的字母来说,utf8mb4_unicode_ci会比utf8mb4_general_ci更符合他们的语言习惯一些,general是mysql一个比较老的标准了。例如,德语字母“ß”,在utf8mb4_unicode_ci中是等价于"ss"两个字母的(这是符合德国人习惯的做法),而在utf8mb4_general_ci中,它却和字母“s”等价。不过,这两种编码的那些微小的区别,对于正常的开发来说,很难感知到。本身我们也很少直接用文字字段去排序,退一步说,即使这个字母排错了一两个,真的能给系统带来灾难性后果么?从网上找的各种帖子讨论来说,更多人推荐使用utf8mb4_unicode_ci,但是对于使用了默认值的系统,也并没有非常排斥,并不认为有什么大问题。结论:推荐使用utf8mb4_unicode_ci,对于已经用了utf8mb4_general_ci的系统,也没有必要花时间改造。

另外需要注意的一点是,从mysql 8.0开始,mysql默认的CHARSET已经不再是Latin1了,改为了utf8mb4(参考链接),并且默认的COLLATE也改为了utf8mb4_0900_ai_ci。utf8mb4_0900_ai_ci大体上就是unicode的进一步细分,0900指代unicode比较算法的编号( Unicode Collation Algorithm version),ai表示accent insensitive(发音无关),例如e, è, é, ê 和 ë是一视同仁的。相关参考链接1,相关参考链接2

COLLATE设置级别及其优先级

设置COLLATE可以在示例级别、库级别、表级别、列级别、以及SQL指定。实例级别的COLLATE设置就是mysql配置文件或启动指令中的collation_connection系统变量。

库级别设置COLLATE的语句如下:

CREATE DATABASE DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
如果库级别没有设置CHARSET和COLLATE,则库级别默认的CHARSET和COLLATE使用实例级别的设置。在mysql8.0以下版本中,你如果什么都不修改,默认的CHARSET是Latin1,默认的COLLATE是latin1_swedish_ci。从mysql8.0开始,默认的CHARSET已经改为了utf8mb4,默认的COLLATE改为了utf8mb4_0900_ai_ci。

表级别的COLLATE设置,则是在CREATE TABLE的时候加上相关设置语句,例如:

CREATE TABLE (
 
……
 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

如果表级别没有设置CHARSET和COLLATE,则表级别会继承库级别的CHARSET与COLLATE。

列级别的设置,则在CREATE TABLE中声明列的时候指定,例如  

CREATE TABLE (
 
`field1` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
 
……
 
) ……

如果列级别没有设置CHARSET和COLATE,则列级别会继承表级别的CHARSET与COLLATE。

最后,你也可以在写SQL查询的时候显示声明COLLATE来覆盖任何库表列的COLLATE设置,不太常用,了解即可:

SELECT DISTINCT field1 COLLATE utf8mb4_general_ci FROM table1;
 
SELECT field1, field2 FROM table1 ORDER BY field1 COLLATE utf8mb4_unicode_ci;

如果全都显示设置了,那么优先级顺序是 SQL语句 > 列级别设置 > 表级别设置 > 库级别设置 > 实例级别设置。也就是说列上所指定的COLLATE可以覆盖表上指定的COLLATE,表上指定的COLLATE可以覆盖库级别的COLLATE。如果没有指定,则继承下一级的设置。即列上面没有指定COLLATE,则该列的COLLATE和表上设置的一样。

以上就是关于mysql的COLLATE相关知识。不过,在系统设计中,我们还是要尽量避免让系统严重依赖中文字段的排序结果,在mysql的查询中也应该尽量避免使用中文做查询条件。

以上がmysqlの照合とはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。