Rumah >masalah biasa >Apakah yang dimaksudkan dengan menyusun dalam mysql?

Apakah yang dimaksudkan dengan menyusun dalam mysql?

百草
百草asal
2023-07-11 14:32:313342semak imbas

Kolat MySQL bermaksud set pengumpulan, yang boleh difahami sebagai peraturan pengisihan. Dalam MySQL, data aksara yang disimpan boleh mempunyai pengumpulan yang berbeza, bergantung pada set aksara dan peraturan penyusun yang digunakan. Set aksara menentukan jenis aksara yang boleh disimpan, dan peraturan himpunan menentukan cara aksara tersebut diisih.

Apakah yang dimaksudkan dengan menyusun dalam mysql?

Sistem pengendalian tutorial ini: sistem Windows 10, mysql versi 8.0, komputer Dell G3.

mysql COLLATE bermaksud set pengumpulan, yang boleh difahami sebagai peraturan pengisihan, dsb.

Dalam MySQL, data aksara yang disimpan boleh mempunyai himpunan yang berbeza, bergantung pada set aksara dan peraturan himpunan yang digunakan. Set aksara menentukan jenis aksara yang boleh disimpan, dan peraturan himpunan menentukan cara aksara ini diisih.

Biasanya, apabila mencipta pangkalan data atau jadual, anda boleh menetapkan kaedah pengisihan data aksara dengan menentukan set aksara yang berbeza dan menyusun peraturan. Jika tiada peraturan susun khusus ditentukan, MySQL akan menggunakan peraturan susun lalai. Set aksara biasa dan peraturan himpunan termasuk utf8mb4_general_ci (tidak peka huruf besar-kecil, tidak sensitif aksen), utf8mb4_unicode_ci (tidak peka huruf besar-kecil, sensitif aksen), dsb.

Pemilihan peraturan kolate ditentukan berdasarkan keperluan khusus. Peraturan susun yang berbeza sesuai untuk senario yang berbeza. Contohnya, semasa mencari dan mengisih data, beberapa peraturan menyusun melakukan perbandingan sensitif huruf besar-besaran, manakala yang lain tidak. Oleh itu, apabila mereka bentuk pangkalan data, peraturan penyusunan yang sesuai harus dipilih berdasarkan keperluan sebenar dan peraturan perniagaan.

Pelbagai kaedah pengisihan boleh dicapai dengan menggunakan peraturan kolat yang berbeza. Sebagai contoh, data aksara boleh diisih secara tidak sensitif huruf besar-besaran, bermakna "A" dan "a" akan dianggap sama. Sebaliknya, jika peraturan himpunan sensitif huruf besar-besaran digunakan, maka "A" dan "a" akan dianggap sebagai aksara yang berbeza.

Selain itu, peraturan susun juga boleh mempengaruhi operasi perbandingan rentetan. Di bawah peraturan susun yang berbeza, hasil perbandingan antara aksara mungkin berbeza. Sebagai contoh, di bawah beberapa peraturan susun, huruf "a" mungkin dianggap lebih besar daripada huruf "Z", manakala di bawah peraturan lain, sebaliknya adalah benar.

Adalah penting untuk ambil perhatian bahawa peraturan penyusunan bukan sahaja terpakai pada pengisihan dan perbandingan data aksara, tetapi juga pada hasil apabila fungsi rentetan dan pengendali digunakan dalam pertanyaan. Oleh itu, semasa menulis pertanyaan SQL, anda harus mempertimbangkan peraturan susun yang digunakan untuk memastikan anda mendapat hasil yang diharapkan. . kata kunci COLLATE . Apakah maksud utf8_unicode_ci yang sepadan dengan nilai ini? Jika anda menggunakan soalan ini untuk mengambil ujian DBA semasa temu duga, soalan itu sepatutnya boleh membingungkan kebanyakan orang.

Untuk apa COLLATE digunakan?

Pembangun yang menggunakan phpmyadmin mungkin kelihatan sangat biasa, kerana pengepala Cina telah memberikan jawapan:

Apa yang dipanggil utf8_unicode_ci sebenarnya adalah peraturan yang digunakan untuk menyusun. Untuk lajur jenis aksara dalam mysql, seperti lajur jenis VARCHAR, CHAR dan TEXT, jenis COLLATE diperlukan untuk memberitahu mysql cara mengisih dan membandingkan lajur. Ringkasnya, COLLATE akan menjejaskan susunan penyata ORDER BY, hasil yang ditapis oleh tanda yang lebih besar daripada atau kurang dalam keadaan WHERE, dan **DISTINCT**, **GROUP BY** dan **HAVING* * keputusan pertanyaan. Di samping itu, apabila MySQL membina indeks, jika lajur indeks adalah jenis aksara, ia juga akan menjejaskan penciptaan indeks, tetapi kita tidak dapat melihat kesan ini. Pendek kata, di mana sahaja perbandingan atau pengisihan jenis aksara terlibat, ia akan dikaitkan dengan COLLATE.

Apakah yang dimaksudkan dengan menyusun dalam mysql?

Perbezaan antara pelbagai COLLATE

COLLATE biasanya berkaitan dengan pengekodan data (CHARSET Secara umumnya, setiap CHARSET mempunyai berbilang COLLATE yang disokongnya, dan setiap CHARSET menentukan COLLATE sebagai nilai lalai. Sebagai contoh, COLLATE lalai untuk pengekodan Latin1 ialah latin1_swedish_ci, COLLATE lalai untuk pengekodan GBK ialah gbk_chinese_ci dan nilai lalai untuk pengekodan utf8mb4 ialah utf8mb4_general_ci.
Biar saya membuat penyimpangan dengan cara ini Terdapat dua pengekodan dalam mysql: utf8 dan utf8mb4 Dalam mysql, sila lupakan **utf8** dan sentiasa gunakan **utf8mb4**. Ini adalah isu lama MySQL UTF8 dalam MySQL hanya boleh menyokong pengekodan aksara dengan panjang maksimum 3 bait Untuk beberapa teks yang perlu menduduki 4 bait, UTF8 MySQL tidak menyokongnya.

Banyak COLLATE mempunyai perkataan _ci, iaitu singkatan daripada Case Insensitive, yang bermaksud bahawa "A" dan "a" dilayan sama rata apabila mengisih dan membandingkan. selection * dari table1 di mana field1="a" juga boleh memilih nilai field1 sebagai "A". Pada masa yang sama, untuk COLLATE dengan akhiran _cs, ia adalah Peka Huruf, iaitu, sensitif huruf besar.

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

Apakah yang dimaksudkan dengan menyusun dalam 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的查询中也应该尽量避免使用中文做查询条件。

Atas ialah kandungan terperinci Apakah yang dimaksudkan dengan menyusun dalam mysql?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn