Zusammenfassung über den GreatSQL-Zeichensatz

17291819:

Zusammenfassung über den GreatSQL-Zeichensatz

Vorwort

Bei neueren SQL-Optimierungsarbeiten stoßen wir häufig auf das Problem, dass der Index aufgrund inkonsistenter Zeichensätze oder Überprüfungsregeln nicht verwendet werden kann. Das Ändern des Zeichensatzes oder der Überprüfungsregeln der Tabelle entspricht einer Rekonstruktion der Tabelle. Wenn die Datenmenge in der Die Tabelle ist groß und die Verarbeitung ist zeitaufwändig. Vielen Dank für Ihre Mühe. Ich hoffe, dass Anwendungsentwickler dieses Problem zu Beginn des Entwurfs bemerken, sodass es weniger Partner gibt, die später den Betrieb und die Wartung übernehmen belastet. GreatSQL verfügt über eine große Vielfalt an Zeichensätzen und Verifizierungsregeln, was nicht nur Flexibilität bietet, sondern auch zu Verwirrung bei der Verwendung führt. In diesem Artikel wird der Zeichensatz zusammengefasst, um den Lesern ein umfassendes Verständnis des GreatSQL-Zeichensatzes zu vermitteln.

1. Einführung in Zeichensätze

Computer speichern Binärdaten. Dezimalzahlen können in Binärzahlen umgewandelt werden. Um eine Zeichenfolge in Binärdaten umzuwandeln, ist eine Zuordnungsbeziehung erforderlich. Das Konvertieren von Zeichen in Binärdaten wird als Kodierung bezeichnet, und das Konvertieren von Binärzahlen in Zeichen wird als Dekodierung bezeichnet. Dies ist eigentlich das Konzept von ein Zeichensatz, der die Codierungsregeln eines bestimmten Zeichenbereichs beschreibt. Verschiedene Zeichensätze enthalten unterschiedliche Zeichenbereiche.

Nachfolgend werden einige wichtige Zeichensätze vorgestellt.

1. ASCII-Zeichensatz

Insgesamt sind 128 Zeichen enthalten, darunter Leerzeichen, Satzzeichen, Zahlen, Groß- und Kleinbuchstaben sowie einige unsichtbare Zeichen. Unsichtbare Zeichen beziehen sich hauptsächlich auf Steuerzeichen (z. B. Zeilenvorschub, Wagenrücklauf usw.) und Kommunikationszeichen (z. B. Header-SOH, Tail-EOT usw.). Der ASCII-Zeichensatz umfasst insgesamt 128 Zeichen, die mit 1 Byte kodiert werden können.

2. ISO8859-1-Zeichensatz

Es enthält insgesamt 256 Zeichen, die auf dem ASCII-Zeichensatz basieren und um 128 in Westeuropa häufig verwendete Zeichen (einschließlich Buchstaben aus Deutschland und Frankreich) erweitert wurden. Der ISO8859-1-Zeichensatz kann auch mit 1 Byte kodiert werden. Dieser Zeichensatz hat auch einen Alias ​​Latin1.

3. GB2312-Zeichensatz

Enthält chinesische Schriftzeichen, lateinische Buchstaben, griechische Buchstaben, japanische Hiragana- und Katakana-Buchstaben sowie russische kyrillische Buchstaben. Es enthält 6763 chinesische Schriftzeichen und 682 andere Schriftzeichen. Dieser Zeichensatz ist auch mit dem ASCII-Zeichensatz kompatibel. Wenn sich das Zeichen also im ASCII-Zeichensatz befindet, wird die 1-Byte-Kodierung verwendet, andernfalls wird die 2-Byte-Kodierung verwendet.

4. GBK-Zeichensatz

GBK erweitert den GB2312-Zeichensatz und die Codierungsmethode ist mit dem GB2312-Zeichensatz kompatibel. Wie beim GB2312-Zeichensatz wird die Ein-Byte-Kodierung verwendet, wenn das Zeichen im ASCII-Zeichensatz enthalten ist, andernfalls wird die 2-Byte-Kodierung verwendet.

5. UTF-8-Zeichensatz

Es enthält Zeichen, die heute in fast allen Ländern und Regionen der Welt verwendet werden, und wird immer noch erweitert. Dieser Zeichensatz ist mit dem ASCII-Zeichensatz kompatibel und verwendet eine Codierung mit variabler Länge. Die Codierung eines Zeichens dauert 1 bis 4 Byte. Normalerweise wird ein chinesisches Zeichen durch 3 Bytes codiert, und ein Buchstabe wird durch ein Byte codiert. UTF-8 ist ein Codierungsschema von Unicode, zusätzlich zu den Codierungsschemata UTF-16 und UTF-32.

Wir können sehen, dass die Zeichensätze ISO8859-1, GB2312, GBK und UTF-8 alle den ASCIIS-Zeichensatz enthalten, GBK den GB2312-Zeichensatz enthält und die in UTF-8 enthaltenen Zeichen die Zeichen von GBK, GB2312 und abdecken ISO8859-1, aber ihre Kodierungsregeln sind unterschiedlich.

Beispielsweise die Kodierungsmethode des chinesischen Schriftzeichens „I“:

Codierung in GBK: 1100111011010010

UTF-8-Kodierung: 111001101000100010010001

2. GreatSQL-Zeichensatz und Vergleichsregeln

1. Überprüfen Sie die von GreatSQL unterstützten Zeichensätze

Verwenden Sie die Anweisung show (character set|charset) [like Matching Pattern], um die unterstützten Zeichensätze anzuzeigen. Die Daten stammen aus der Tabelle information_schema.character_sets.

Unter diesen sind Zeichensatz und Zeichensatz Synonyme.

greatsql> show charset;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| binary   | Binary pseudo charset           | binary              |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| utf8mb3  | UTF-8 Unicode                   | utf8mb3_general_ci  |      3 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_0900_ai_ci  |      4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)

Das Obige sind die 41 Zeichensätze von GreatSQL8.0. Die Standardsortierung bezieht sich auf die Standardvergleichsregeln des Zeichensatzes, und Maxlen bezieht sich auf die maximale Anzahl von Bytes, die der Zeichensatz zur Darstellung eines Zeichens benötigt.

Das utf8 in der GreatSQL 5.7-Version bezieht sich auf utf8mb3, einen „kastrierten“ UTF-8-Zeichensatz, der nur 1 bis 3 Bytes zur Darstellung von Zeichen verwendet. utf8mb4 ist der authentische UTF-8-Zeichensatz, der 1 bis 4 Bytes zur Darstellung von Zeichen verwendet. utf8mb4 speichert mehr Zeichen als utf8mb3, z. B. Emoj-Ausdrücke usw. MySQL hat die Leistung des Zeichensatzes utf8mb4 stark optimiert und ist der Standardzeichensatz.

2. Sehen Sie sich die GreatSQL-Vergleichsregeln an

Sie können die unterstützten Vergleichsregeln über die Anweisung show collation [like Matching Pattern] anzeigen. Die Daten stammen aus der Tabelle information_schema.collations

Für jeden Zeichensatz gibt es mehrere Vergleichsregeln. Überprüfen Sie die Vergleichsregeln von utf8mb4.

greatsql> show collation like 'utf8mb4%';
+----------------------------+---------+-----+---------+----------+---------+---------------+
| Collation                  | Charset | Id  | Default | Compiled | Sortlen | Pad_attribute |
+----------------------------+---------+-----+---------+----------+---------+---------------+
| utf8mb4_0900_ai_ci         | utf8mb4 | 255 | Yes     | Yes      |       0 | NO PAD        |
| utf8mb4_0900_as_ci         | utf8mb4 | 305 |         | Yes      |       0 | NO PAD        |
| utf8mb4_0900_as_cs         | utf8mb4 | 278 |         | Yes      |       0 | NO PAD        |
| utf8mb4_0900_bin           | utf8mb4 | 309 |         | Yes      |       1 | NO PAD        |
| utf8mb4_bg_0900_ai_ci      | utf8mb4 | 318 |         | Yes      |       0 | NO PAD        |
| utf8mb4_bg_0900_as_cs      | utf8mb4 | 319 |         | Yes      |       0 | NO PAD        |
| utf8mb4_bin                | utf8mb4 |  46 |         | Yes      |       1 | PAD SPACE     |
| utf8mb4_bs_0900_ai_ci      | utf8mb4 | 316 |         | Yes      |       0 | NO PAD        |
| utf8mb4_bs_0900_as_cs      | utf8mb4 | 317 |         | Yes      |       0 | NO PAD        |
| utf8mb4_croatian_ci        | utf8mb4 | 245 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_cs_0900_ai_ci      | utf8mb4 | 266 |         | Yes      |       0 | NO PAD        |
| utf8mb4_cs_0900_as_cs      | utf8mb4 | 289 |         | Yes      |       0 | NO PAD        |
| utf8mb4_czech_ci           | utf8mb4 | 234 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_danish_ci          | utf8mb4 | 235 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_da_0900_ai_ci      | utf8mb4 | 267 |         | Yes      |       0 | NO PAD        |
| utf8mb4_da_0900_as_cs      | utf8mb4 | 290 |         | Yes      |       0 | NO PAD        |
| utf8mb4_de_pb_0900_ai_ci   | utf8mb4 | 256 |         | Yes      |       0 | NO PAD        |
| utf8mb4_de_pb_0900_as_cs   | utf8mb4 | 279 |         | Yes      |       0 | NO PAD        |
| utf8mb4_eo_0900_ai_ci      | utf8mb4 | 273 |         | Yes      |       0 | NO PAD        |
| utf8mb4_eo_0900_as_cs      | utf8mb4 | 296 |         | Yes      |       0 | NO PAD        |
| utf8mb4_esperanto_ci       | utf8mb4 | 241 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_estonian_ci        | utf8mb4 | 230 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_es_0900_ai_ci      | utf8mb4 | 263 |         | Yes      |       0 | NO PAD        |
| utf8mb4_es_0900_as_cs      | utf8mb4 | 286 |         | Yes      |       0 | NO PAD        |
| utf8mb4_es_trad_0900_ai_ci | utf8mb4 | 270 |         | Yes      |       0 | NO PAD        |
| utf8mb4_es_trad_0900_as_cs | utf8mb4 | 293 |         | Yes      |       0 | NO PAD        |
| utf8mb4_et_0900_ai_ci      | utf8mb4 | 262 |         | Yes      |       0 | NO PAD        |
| utf8mb4_et_0900_as_cs      | utf8mb4 | 285 |         | Yes      |       0 | NO PAD        |
| utf8mb4_general_ci         | utf8mb4 |  45 |         | Yes      |       1 | PAD SPACE     |
| utf8mb4_german2_ci         | utf8mb4 | 244 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_gl_0900_ai_ci      | utf8mb4 | 320 |         | Yes      |       0 | NO PAD        |
| utf8mb4_gl_0900_as_cs      | utf8mb4 | 321 |         | Yes      |       0 | NO PAD        |
| utf8mb4_hr_0900_ai_ci      | utf8mb4 | 275 |         | Yes      |       0 | NO PAD        |
| utf8mb4_hr_0900_as_cs      | utf8mb4 | 298 |         | Yes      |       0 | NO PAD        |
| utf8mb4_hungarian_ci       | utf8mb4 | 242 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_hu_0900_ai_ci      | utf8mb4 | 274 |         | Yes      |       0 | NO PAD        |
| utf8mb4_hu_0900_as_cs      | utf8mb4 | 297 |         | Yes      |       0 | NO PAD        |
| utf8mb4_icelandic_ci       | utf8mb4 | 225 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_is_0900_ai_ci      | utf8mb4 | 257 |         | Yes      |       0 | NO PAD        |
| utf8mb4_is_0900_as_cs      | utf8mb4 | 280 |         | Yes      |       0 | NO PAD        |
| utf8mb4_ja_0900_as_cs      | utf8mb4 | 303 |         | Yes      |       0 | NO PAD        |
| utf8mb4_ja_0900_as_cs_ks   | utf8mb4 | 304 |         | Yes      |      24 | NO PAD        |
| utf8mb4_latvian_ci         | utf8mb4 | 226 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_la_0900_ai_ci      | utf8mb4 | 271 |         | Yes      |       0 | NO PAD        |
| utf8mb4_la_0900_as_cs      | utf8mb4 | 294 |         | Yes      |       0 | NO PAD        |
| utf8mb4_lithuanian_ci      | utf8mb4 | 236 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_lt_0900_ai_ci      | utf8mb4 | 268 |         | Yes      |       0 | NO PAD        |
| utf8mb4_lt_0900_as_cs      | utf8mb4 | 291 |         | Yes      |       0 | NO PAD        |
| utf8mb4_lv_0900_ai_ci      | utf8mb4 | 258 |         | Yes      |       0 | NO PAD        |
| utf8mb4_lv_0900_as_cs      | utf8mb4 | 281 |         | Yes      |       0 | NO PAD        |
| utf8mb4_mn_cyrl_0900_ai_ci | utf8mb4 | 322 |         | Yes      |       0 | NO PAD        |
| utf8mb4_mn_cyrl_0900_as_cs | utf8mb4 | 323 |         | Yes      |       0 | NO PAD        |
| utf8mb4_nb_0900_ai_ci      | utf8mb4 | 310 |         | Yes      |       0 | NO PAD        |
| utf8mb4_nb_0900_as_cs      | utf8mb4 | 311 |         | Yes      |       0 | NO PAD        |
| utf8mb4_nn_0900_ai_ci      | utf8mb4 | 312 |         | Yes      |       0 | NO PAD        |
| utf8mb4_nn_0900_as_cs      | utf8mb4 | 313 |         | Yes      |       0 | NO PAD        |
| utf8mb4_persian_ci         | utf8mb4 | 240 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_pl_0900_ai_ci      | utf8mb4 | 261 |         | Yes      |       0 | NO PAD        |
| utf8mb4_pl_0900_as_cs      | utf8mb4 | 284 |         | Yes      |       0 | NO PAD        |
| utf8mb4_polish_ci          | utf8mb4 | 229 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_romanian_ci        | utf8mb4 | 227 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_roman_ci           | utf8mb4 | 239 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_ro_0900_ai_ci      | utf8mb4 | 259 |         | Yes      |       0 | NO PAD        |
| utf8mb4_ro_0900_as_cs      | utf8mb4 | 282 |         | Yes      |       0 | NO PAD        |
| utf8mb4_ru_0900_ai_ci      | utf8mb4 | 306 |         | Yes      |       0 | NO PAD        |
| utf8mb4_ru_0900_as_cs      | utf8mb4 | 307 |         | Yes      |       0 | NO PAD        |
| utf8mb4_sinhala_ci         | utf8mb4 | 243 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_sk_0900_ai_ci      | utf8mb4 | 269 |         | Yes      |       0 | NO PAD        |
| utf8mb4_sk_0900_as_cs      | utf8mb4 | 292 |         | Yes      |       0 | NO PAD        |
| utf8mb4_slovak_ci          | utf8mb4 | 237 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_slovenian_ci       | utf8mb4 | 228 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_sl_0900_ai_ci      | utf8mb4 | 260 |         | Yes      |       0 | NO PAD        |
| utf8mb4_sl_0900_as_cs      | utf8mb4 | 283 |         | Yes      |       0 | NO PAD        |
| utf8mb4_spanish2_ci        | utf8mb4 | 238 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_spanish_ci         | utf8mb4 | 231 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_sr_latn_0900_ai_ci | utf8mb4 | 314 |         | Yes      |       0 | NO PAD        |
| utf8mb4_sr_latn_0900_as_cs | utf8mb4 | 315 |         | Yes      |       0 | NO PAD        |
| utf8mb4_sv_0900_ai_ci      | utf8mb4 | 264 |         | Yes      |       0 | NO PAD        |
| utf8mb4_sv_0900_as_cs      | utf8mb4 | 287 |         | Yes      |       0 | NO PAD        |
| utf8mb4_swedish_ci         | utf8mb4 | 232 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_tr_0900_ai_ci      | utf8mb4 | 265 |         | Yes      |       0 | NO PAD        |
| utf8mb4_tr_0900_as_cs      | utf8mb4 | 288 |         | Yes      |       0 | NO PAD        |
| utf8mb4_turkish_ci         | utf8mb4 | 233 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_unicode_520_ci     | utf8mb4 | 246 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_unicode_ci         | utf8mb4 | 224 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_vietnamese_ci      | utf8mb4 | 247 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_vi_0900_ai_ci      | utf8mb4 | 277 |         | Yes      |       0 | NO PAD        |
| utf8mb4_vi_0900_as_cs      | utf8mb4 | 300 |         | Yes      |       0 | NO PAD        |
| utf8mb4_zh_0900_as_cs      | utf8mb4 | 308 |         | Yes      |       0 | NO PAD        |
+----------------------------+---------+-----+---------+----------+---------+---------------+
89 rows in set (0.00 sec)

Die aktuelle Abfrageversion ist GreatSQL8.0.32 und es gibt 89 Arten von utf8mb4-Vergleichsregeln. Die Benennungsregeln von Collation sind ebenfalls regelmäßig und beginnen mit dem Namen des Zeichensatzes, gefolgt vom Suffix _ai, _as, _ci, _cs, _bin. Die Bedeutung dieser Suffixe ist wie folgt:

Suffix Englische Bedeutung Chinesische Beschreibung
_ai akzentunempfindlich Unterscheiden Sie nicht zwischen Akzenten
_als akzentempfindlich Stress unterscheiden
_ci Groß- und Kleinschreibung wird nicht beachtet Groß- und Kleinschreibung wird nicht beachtet
_cs Groß- und Kleinschreibung beachten Groß- und Kleinschreibung beachten
_Behälter binär Vergleichen Sie im Binärmodus

Die Standardüberprüfungsregel für den Zeichensatz utf8mb4 ist utf8mb4_0900_ai_ci. Diese 0900 stellt die Sortierregel dar, die auf dem Unicode Collation Algorithm (UCA) 9.0.0 basiert.

Jede Korrekturleseregel verfügt über ein Pad_attribute-Attribut, dessen Wert PAD SPACE oder NO PAD ist. Die Korrekturleseregeln von PAD SPACE ignorieren die nachfolgenden Leerzeichen und die Korrekturleseregeln von NO PAD bewirken das Gegenteil.

Beispiel: Aus der obigen Abfrage können wir ersehen, dass das Pad_attribute von utf8mb4_0900_bin NO PAD ist, was bedeutet, dass die nachfolgenden Leerzeichen nicht ignoriert werden. Das Pad_attribute von utf8mb4_bin ist PAD SPACE, was bedeutet, dass nachfolgende Leerzeichen ignoriert werden.

greatsql> create table t1(id int ,c1 varchar(20)) character set utf8mb4 collate utf8mb4_0900_bin;
Query OK, 0 rows affected (0.02 sec)

greatsql> insert into t1 values(1,'abc ');
Query OK, 1 row affected (0.00 sec)

greatsql> select * from t1 where c1='abc';
Empty set (0.00 sec)

greatsql> select * from t1 where c1='abc ';
+------+------+
| id   | c1   |
+------+------+
|    1 | abc  |
+------+------+
1 row in set (0.00 sec)
--c1列校验规则为utf8mb4_0900_bin,插入时尾部带一个空格,查询时需要严格匹配空格字符才能查到数据。
下面修改c1校验规则为utf8mb4_bin,查询条件中带不带空格都能查询到数据。
greatsql> alter table t1 modify c1 varchar(20) character set utf8mb4 collate utf8mb4_bin;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

greatsql> select * from t1 where c1='abc';
+------+------+
| id   | c1   |
+------+------+
|    1 | abc  |
+------+------+
1 row in set (0.00 sec)

greatsql> select * from t1 where c1='abc ';
+------+------+
| id   | c1   |
+------+------+
|    1 | abc  |
+------+------+
1 row in set (0.00 sec)


3. Nutzungsebenen von Zeichensätzen und Vergleichsregeln.

Die Verwendungsebenen für GreatSQL-Zeichensätze und Vergleichsregeln sind Serverebene, Datenbankebene, Tabellenebene bzw. Spaltenebene.

(1) Serverebene (Server):

Zur Darstellung stehen zwei Systemvariablen zur Verfügung. Character_set_server und collation_server. Ändern Sie diese beiden Variablen über Startoptionen beim Starten des Serverprogramms oder über die Set-Anweisung, während das Programm ausgeführt wird. Beispielsweise in der Konfigurationsdatei konfiguriert:

 [server] 
 character_set_server=utf8mb4  
 collation_server=utf8mb4_bin

(2) Datenbankebene (Datenbank):

Zur Darstellung stehen zwei Systemvariablen zur Verfügung. Diese beiden Variablen können nicht direkt geändert werden, sondern nur durch Erstellen einer Bibliothek oder Ändern von Bibliotheksanweisungen. Wenn Sie Bibliotheksanweisungen erstellen, die keinen Zeichensatz angeben, wird die Einstellung auf Serverebene verwendet.

Entsprechende Aussage:

create/alter database 数据库名 [character set 字符集名称][collate 比较规则名称] ;
例如:
create database test character set utf8mb4 collate utf8mb4_0900_bin;
alter database test character set utf8mb4 collate utf8mb4_0900_ai_ci;
Ebene Verwendung
Datenbankebene
Tischebene Tabelle erstellen Tabellenname (Spalteninformationen) [Name des Zeichensatz-Zeichensatzes] [Name der Vergleichsregel sortieren]; Tabelle ändern Tabellenname [Name des Zeichensatz-Zeichensatzes] [Name der Vergleichsregel sortieren];
Spaltenebene Tabelle erstellen Tabellenname (Spaltenname, Zeichenfolgentyp [Name des Zeichensatzzeichensatzes] [Name der Vergleichsregel sortieren], andere Spalten...); Tabelle ändern, Tabellenname, Spaltennamen ändern, Zeichenfolgentyp [Name des Zeichensatzzeichensatzes] [Name der Vergleichsregel sortieren] ; Hinweis beim Ändern von Spalteninformationen: Geben Sie beim Ändern einer Spalte keinen Zeichensatz an. Auch wenn dieser beim Erstellen angegeben wird, werden der Zeichensatz und die Vergleichsregeln der Tabelle verwendet. Wenn der geänderte Spaltenzeichensatz die in der Spalte gespeicherten Daten nicht darstellen kann, wird ein Fehler gemeldet.

(3)Tischebene:

Wird beim Erstellen und Ändern von Tabellen angegeben. Verschiedene Tabellen in derselben Datenbank können unterschiedliche Zeichensätze verwenden. Wenn der Zeichensatz und die Vergleichsregeln nicht in der Anweisung angegeben sind, die die Tabelle erstellt, werden der Zeichensatz und die Vergleichsregeln der Datenbank verwendet, in der sich die Tabelle befindet.

Entsprechende Aussage:

create table table_name(列信息)
[character set 字符集名称][collate 比较规则名称];
alter table table_name
[character set 字符集名称][collate 比较规则名称];

例如:
create table t1(id int,c1 varchar(30)) character set utf8mb4 collate utf8mb4_0900_bin;
alter table t1 character set utf8 collate utf8mb4_0900_ai_ci;

Beachten Sie hierbei, dass Zeichensätze und Vergleichsregeln miteinander zusammenhängen. Wenn beim Ändern nur der Zeichensatz angegeben wird, werden die Vergleichsregeln auch zu den Standardvergleichsregeln für den geänderten Zeichensatz. Wenn nur eine Vergleichsregel angegeben ist, ändert sich auch der Zeichensatz auf den Zeichensatz, der der Vergleichsregel entspricht. In diesem Fall reicht es aus, die Vergleichsregeln anzugeben.

Die Änderung des Standardzeichensatzes der Tabelle wirkt sich nur auf später hinzugefügte Spalten aus. Die Überprüfungsregeln für vorhandene Spalten bleiben unverändert.

(4) Spaltenebene:

Bei Spalten, die Zeichenfolgen speichern, können verschiedene Spalten in derselben Tabelle unterschiedliche Zeichensätze und Vergleichsregeln haben. Sie können den Zeichensatz und die Vergleichsregeln der Spalte angeben, wenn Sie Spalteninformationen erstellen und ändern. Wenn beim Erstellen und Ändern von Spalten keine Angabe gemacht wird, werden der Zeichensatz und die Vergleichsregeln der Tabelle verwendet.

Entsprechende Aussage:

create table table_name(列名 字符串类型 [character set 字符集名称] [collate 比较规则名称],其他列...);
alter table table_name modify 列名 字符串类型 [character set 字符集名称] [collate 比较规则名称];

Hinweis beim Ändern von Spalteninformationen: Geben Sie beim Ändern einer Spalte keinen Zeichensatz an. Auch wenn beim Erstellen einer Spalte ein Zeichensatz angegeben wird, werden der Zeichensatz und die Vergleichsregeln der Tabelle verwendet. Wenn der geänderte Spaltenzeichensatz die in der Spalte gespeicherten Daten nicht darstellen kann, wird ein Fehler gemeldet.

4. Der während der Kommunikation zwischen Client und Server verwendete Zeichensatz.

Ein String ist eine Folge binärer Bytes in einem Computer. Wenn unterschiedliche Zeichensätze zum Kodieren und Dekodieren verwendet werden, wird das Endergebnis mit Sicherheit Kauderwelsch sein, den Sie nicht erkennen.

Wenn die vom Client und vom Server verwendeten Zeichensätze unterschiedlich sind, ist ein Zeichensatzkonvertierungsprozess erforderlich. Aus Sicht des Benutzers sind die vom Client gesendete Anfrage und die vom Server zurückgegebene Antwort allesamt Zeichenfolgen. Aus Maschinensicht stellen die vom Client gesendete Anfrage und die vom Server zurückgegebene Antwort im Wesentlichen eine Bytesequenz dar. Während des Prozesses „Der Client sendet die Anfrage und der Server gibt die Antwort zurück“ wurden mehrere Zeichensatzkonvertierungen vorgenommen.

Nehmen wir das Linux-System als Beispiel, um diesen Prozess zu veranschaulichen.

a. Der Client sendet eine Anfrage.

Im Allgemeinen stimmt der vom Client beim Codieren der Anforderungszeichenfolge verwendete Zeichensatz mit dem derzeit vom Betriebssystem verwendeten Zeichensatz überein. Die Umgebungsvariable LANG des Linux-Systems bestimmt, welcher Zeichensatz aktuell vom Betriebssystem verwendet wird.

[root@greatdb-1 ~]# echo $LANG

en_US.UTF-8

Wenn beim Starten des Client-Programms die Option default-character-set angegeben wird, verwendet der Client den durch diese Option angegebenen Zeichensatz.

b. Der Server empfängt die Anfrage

Im Wesentlichen handelt es sich bei der vom Server empfangenen Anfrage um eine Folge binärer Bytes. Wie der Server diese Bytefolge dekodiert oder welchen Zeichensatz der Server zum Dekodieren verwendet, hängt von der Systemvariablen „character_set_client“ ab, die sich auf Sitzungsebene befindet. Der Server weiß nicht, welcher Zeichensatz tatsächlich für die Client-Kodierung verwendet wird, daher dekodiert der Server die empfangene Anfrage mit dem Zeichensatz, der durch die Systemvariable chacter_set_client festgelegt wird. Unter normalen Umständen sollten wir unser Bestes geben, um sicherzustellen, dass die beiden Zeichensätze konsistent sind, sonst kommt es zu einer Henne-und-Ente-Situation.

c. Der Server verarbeitet die Anfrage

Wenn der Server die Anfrage tatsächlich verarbeitet, konvertiert er die angeforderte Bytesequenz in eine Bytesequenz, die im Zeichensatz codiert ist, der der Systemvariablen „character_set_connection“ entspricht. Es gibt auch eine entsprechende Systemvariable „collation_connection“, um anzugeben, welche Vergleichsregel für diese Zeichenfolgen verwendet werden soll . Warum müssen wir also diese Konvertierung durchführen? Ich denke, dass dieses Design seine Flexibilität voll und ganz widerspiegelt. Nehmen Sie das folgende Beispiel:

Der Client stellt eine Anfrage: select 'a'='A'; Soll dies wahr oder falsch zurückgeben?

greatsql> show variables like '%colla%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_0900_ai_ci |
| collation_database            | utf8mb4_0900_ai_ci |
| collation_server              | utf8mb4_0900_ai_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.00 sec)

greatsql> select 'a'='A';
+---------+
| 'a'='A' |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

greatsql> set collation_connection=utf8mb4_0900_bin;
Query OK, 0 rows affected (0.00 sec)

greatsql> show variables like '%colla%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_0900_bin   |
| collation_database            | utf8mb4_0900_ai_ci |
| collation_server              | utf8mb4_0900_ai_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.00 sec)

greatsql> select 'a'='A';
+---------+
| 'a'='A' |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)

Wie aus dem obigen Beispiel ersichtlich ist, reagiert die anfängliche Vergleichsregel collation_connection='utf8mb4_0900_ai_ci' nicht auf Groß- und Kleinbuchstaben. 'a'='A' gibt true zurück. Nach dem Ändern der Vergleichsregel collation_connection='utf8mb4_0900_bin' wird entsprechend verglichen zu binär. 'a'='A' gibt false zurück.

Was passiert, wenn Sie ein Literal übergeben, um es mit dem gespeicherten Wert der Spalte in der Tabelle zu vergleichen?

greatsql> show variables like 'collation_connection';
+----------------------+------------------+
| Variable_name        | Value            |
+----------------------+------------------+
| collation_connection | utf8mb4_0900_bin |
+----------------------+------------------+
1 row in set (0.01 sec)

greatsql> create table t0(name varchar(20) character set utf8mb4 collate utf8mb4_0900_ai_ci);
Query OK, 0 rows affected (0.02 sec)

greatsql> insert into t0 values('a');
Query OK, 1 row affected (0.02 sec)

greatsql> insert into t0 values('A');
Query OK, 1 row affected (0.01 sec)

greatsql> select * from t0 where name='A';
+------+
| name |
+------+
| a    |
| A    |
+------+
2 rows in set (0.00 sec)

Aus dem obigen Beispiel können wir ersehen, dass der Zeichensatz und die Vergleichsregeln der Spalte eine höhere Priorität haben als die Systemvariable collation_connection. Während des Vergleichs wird die Zeichenfolge in der Anforderung in den Zeichensatz der Spalte konvertiert und entsprechend verglichen die Vergleichsregeln der Spalte.

d. Der Server generiert eine Antwort.

Welche Zeichensatzkodierungs-Bytesequenz der Server an den Client sendet, hängt vom Wert der Systemvariablen „character_set_results“ ab. Nehmen Sie als Beispiel die oben erstellte t0-Tabelle.

greatsql> insert into t0 values('我');
Query OK, 1 row affected (0.01 sec)

greatsql> select * from t0;
+------+
| name |
+------+
| a    |
| A    |
| 我   |
+------+
3 rows in set (0.00 sec)

greatsql> show variables like 'character_set_result';
Empty set (0.00 sec)

greatsql> show variables like 'character_set_results';
+-----------------------+---------+
| Variable_name         | Value   |
+-----------------------+---------+
| character_set_results | utf8mb4 |
+-----------------------+---------+
1 row in set (0.00 sec)

greatsql> set character_set_results=ascii;
Query OK, 0 rows affected (0.00 sec)

greatsql> select * from t0;
+------+
| name |
+------+
| a    |
| A    |
| ?    |
+------+
3 rows in set (0.00 sec)
greatsql> select * from t0 where name='我';
+------+
| name |
+------+
| ?    |
+------+
1 row in set (0.00 sec)

Wie aus dem obigen Beispiel ersichtlich ist, kann das chinesische Zeichen „I“ normal angezeigt werden, wenn „character_set_results“ auf utf8mb4 gesetzt ist. Wenn es in den ASCII-Zeichensatz geändert wird, wird das chinesische Zeichen „?“ angezeigt. Stattdessen enthält der ASCII-Zeichensatz keine chinesischen Zeichen und kann keine chinesischen Zeichen darstellen. Das heißt, die vom Server generierte Antwort wird in eine Bytefolge des durch Character_set_results festgelegten Zeichensatzes umgewandelt und an den Client gesendet.

e. Der Client erhält die Antwort

Die vom Client empfangene Antwort ist ebenfalls eine Bytefolge, und diese Bytefolge wird entsprechend dem aktuell vom Betriebssystem verwendeten Zeichensatz interpretiert. Wenn die Startoption default-character-set angegeben ist, wird die Einstellung dieser Option verwendet. Dekodieren Sie die empfangene Bytesequenz und zeigen Sie für Menschen lesbare Zeichen an.

Durch den oben beschriebenen Prozess können wir erkennen, dass der Kommunikationsprozess zwischen dem Client und dem Server mehrere Zeichensatzkonvertierungen durchlaufen hat. Wir verwenden eine Tabelle, um diesen Konvertierungsprozess zusammenzufassen.

Der Kunde sendet eine Anfrage Die Zeichenfolge wird entsprechend dem aktuell vom Betriebssystem verwendeten Zeichensatz oder dem durch die Startoption „default-character-set“ des Clientprogramms angegebenen Zeichensatz codiert
Server empfängt Anfrage Der Server geht davon aus, dass die Anforderung gemäß dem durch die Variable „character_set_client“ festgelegten Zeichensatz codiert ist, und dekodiert sie daher gemäß dem durch diese Variable festgelegten Zeichensatz.
Der Server verarbeitet die Anfrage Konvertieren Sie die Anforderungsbytesequenz vom Zeichensatz „character_set_client“ in den Zeichensatz „character_set_connection“ und verarbeiten Sie die passende collation_connection als Vergleichsregel. Bei der Verarbeitung von Daten in einer Datenbankspalte werden der Zeichensatz und die Vergleichsregeln der Spalte für die Verarbeitung verwendet. Wenn Character_set_connection damit nicht übereinstimmt, wird es in den Zeichensatz der Spalte konvertiert.
Der Server generiert eine Antwort Der Server verwendet die von „character_set_results“ festgelegte Zeichensatzkodierung, um die Bytesequenz an den Client zu senden.
Der Kunde erhält eine Antwort Die vom Client empfangene Antwortbytefolge wird dann entsprechend dem aktuell vom Betriebssystem verwendeten Zeichensatz oder dem durch die Client-Programmstartoption default-character-set angegebenen Zeichensatz interpretiert und zeigt Zeichen an, die für Erwachsene verständlich sind.

Beachten Sie, dass diese drei Systemvariablen „character_set_client“, „character_set_connection“ und „character_set_results“ allesamt Systemvariablen auf Sitzungsebene sind. Beim Herstellen einer Verbindung zum Server sendet der Client die Standardzeichensatzinformationen zusammen mit Benutzername, Kennwort und anderen Informationen an den Server. Nach dem Empfang initialisiert der Server diese drei Systemvariablen mit dem Standardzeichensatz des Clients. Diese Variablen können mit der Set-Anweisung geändert werden, es besteht jedoch kein besonderer Bedarf und keine Notwendigkeit, sie zu ändern. Es ist zu beachten, dass die Verwendung der Set-Anweisung zum Ändern dieser drei Systemvariablen weder den vom Client beim Codieren der Anforderungszeichenfolge verwendeten Zeichensatz noch den Standardzeichensatz des Clients ändert.

Nutzungszusammenfassung

  1. In GreatSQL Version 8.0 ist „character_set_server“ standardmäßig utf8mb4 und „collation_server“ standardmäßig utf8mb4_0900_ai_ci. Dies ist die Standardeinstellung auf globaler Ebene. Wenn Sie eine Datenbank erstellen, ohne den Zeichensatz und die Überprüfungsregeln anzugeben, werden der durch die Parameter „character_set_server“ und „collation_server“ angegebene Zeichensatz und die Überprüfungsregeln verwendet. Beachten Sie, dass, wenn ein Zeichensatz ohne Sortierung angegeben wird, die Sortierung die Standardsortierung des angegebenen Zeichensatzes anstelle der durch collation_server angegebenen Überprüfungsregel verwendet.
  2. Wenn Sie beim Erstellen einer Tabelle keinen Zeichensatz und keine Überprüfungsregeln angeben, werden der Zeichensatz und die Überprüfungsregeln der Datenbank verwendet. Beachten Sie, dass bei Angabe eines Zeichensatzes ohne Angabe von „collate“ für „collate“ die Standardsortierung des angegebenen Zeichens verwendet wird anstelle der Datenbank festgelegt. Verifizierungsregeln.
  3. Wenn beim Erstellen einer Tabelle der Zeichensatz und die Verifizierungsregeln in der Spalte nicht angegeben sind, werden die in der Tabelle angegebenen Zeichensätze und Verifizierungsregeln verwendet. Wenn in der Tabelle keine Angaben vorhanden sind, werden der Zeichensatz und die Verifizierungsregeln verwendet Es wird die Datenbank verwendet, zu der es gehört.
  4. Denken Sie daran, dass, wenn Sie nur einen Zeichensatz, aber keine Überprüfungsregel angeben, die Überprüfungsregel die Standardsortierung des angegebenen Zeichensatzes verwendet und die Ergebnisse möglicherweise nicht den Erwartungen entsprechen. Daher ist es beim Erstellen von Datenbanken, Datentabellen und Spalten in Tabellen am besten, nicht nur den Zeichensatz anzugeben. Sie können sowohl den Zeichensatz als auch die Verifizierungsregeln weglassen oder nur die Verifizierungsregeln angeben.
  5. Es muss sichergestellt werden, dass der Zeichensatz der zugehörigen Felder in der zugehörigen Tabelle mit den Überprüfungsregeln übereinstimmt, damit der Index gut verwendet werden kann.

Viel Spaß mit GreatSQL :)


Über GreatSQL

Die GreatSQL-Datenbank ist eine kostenlose Open-Source- Datenbank, die Anwendungsszenarien auf finanzieller Ebene auf normaler Hardware erfüllen kann. Sie verfügt über Funktionen wie hohe Verfügbarkeit , hohe Leistung , hohe Kompatibilität und hohe Sicherheit . Sie kann ein idealer Ersatz für MySQL oder Percona Server sein MySQL.

verwandte Links

GreatSQL-Community

Gitee

Github

Bilibili

Technische Austauschgruppe

WeChat: Freunde hinzufügen GreatSQL社区助手, WeChat-ID wanlidbcsendet Verifizierungsinformationen加群

QQ-Gruppe: 533341697

Viel Spaß mit GreatSQL :)

Über GreatSQL

GreatSQL ist eine inländische unabhängige Open-Source-Datenbank, die für Anwendungen auf Finanzebene geeignet ist. Sie verfügt über viele Kernfunktionen wie hohe Leistung, hohe Zuverlässigkeit, hohe Benutzerfreundlichkeit und hohe Sicherheit. Sie kann als optionaler Ersatz für MySQL oder Percona Server verwendet werden und wird in Online-Produktionsumgebungen verwendet. , völlig kostenlos und kompatibel mit MySQL oder Percona Server.

Verwandte Links: GreatSQL Community Gitee GitHub Bilibili

GreatSQL-Community:

Bild

Vorschläge und Feedback zu Community-Belohnungen: https://greatsql.cn/thread-54-1-1.html

Details zur preisgekrönten Einreichung des Community-Blogs: https://greatsql.cn/thread-100-1-1.html

(Wenn Sie Fragen zu dem Artikel haben oder einzigartige Erkenntnisse gewinnen möchten, können Sie diese auf der offiziellen Community-Website stellen oder teilen~)

Technische Austauschgruppe:

WeChat- und QQ-Gruppe:

QQ-Gruppe: 533341697

WeChat-Gruppe: Fügen Sie GreatSQL Community Assistant (WeChat-ID:) wanlidbcals Freund hinzu und warten Sie, bis der Community-Assistent Sie der Gruppe hinzufügt.

Tang Xiaoou, Gründer von SenseTime, verstarb im Alter von 55 Jahren. Im Jahr 2023 stagnierte PHP . Das Hongmeng-System steht kurz vor der Unabhängigkeit und viele Universitäten haben „Hongmeng-Kurse“ eingerichtet. Die PC-Version von Quark Browser hat mit internen Tests begonnen . ByteDance wurde von OpenAI „verboten“. Das Startup-Unternehmen von Zhihuijun wurde mit einem Betrag von über 600 Millionen Yuan und einer Pre-Money-Bewertung von 3,5 Milliarden Yuan refinanziert. KI-Code-Assistenten sind so beliebt, dass sie nicht einmal in der Programmierung mithalten können Sprachrankings . Das 5G-Modem und die Hochfrequenztechnologie des Mate 60 Pro liegen weit vorne. No Star, No Fix MariaDB spaltet SkySQL ab und gründet sich als unabhängiges Unternehmen
{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/GreatSQL/blog/10322636
Recomendado
Clasificación