Сводная информация о наборе символов GreatSQL

17291819:

Сводная информация о наборе символов GreatSQL

Предисловие

В недавних работах по оптимизации SQL мы часто сталкиваемся с проблемой, заключающейся в том, что индекс невозможно использовать из-за несогласованных наборов символов или правил проверки. Изменение набора символов или правил проверки таблицы эквивалентно реконструкции таблицы. Когда объем данных в таблица большая, ее обработка требует много времени.Спасибо за ваши усилия.Надеюсь, что разработчики приложений заметят эту проблему в начале проектирования, так что партнеров, которые потом возьмут на себя эксплуатацию и обслуживание, будет меньше обремененный. GreatSQL имеет большое разнообразие наборов символов и правил проверки, что не только обеспечивает гибкость, но и вызывает путаницу в использовании. В этой статье дается краткое описание набора символов, чтобы дать читателям полное представление о наборе символов GreatSQL.

1. Знакомство с наборами символов

Компьютеры хранят двоичные данные. Десятичные числа могут быть преобразованы в двоичные. Чтобы преобразовать строку в двоичные данные, необходимы отношения сопоставления. Преобразование символов в двоичные числа называется кодированием, а преобразование двоичных чисел в символы называется декодированием. В этом и заключается концепция набор символов. , описывающий правила кодирования определенного диапазона символов. Различные наборы символов содержат разные диапазоны символов.

Некоторые важные наборы символов представлены ниже.

1. Набор символов ASCII

Всего включено 128 символов, включая пробелы, знаки препинания, цифры, прописные и строчные буквы, а также некоторые невидимые символы. Невидимые символы в основном относятся к управляющим символам (например, переводу строки, возврату каретки и т. д.) и коммуникационным символам (например, заголовку SOH, хвостовому EOT и т. д.). Набор символов ASCII содержит в общей сложности 128 символов, которые можно закодировать с помощью 1 байта.

2. Набор символов ISO8859-1.

Он содержит в общей сложности 256 символов, основанных на наборе символов ASCII и расширенных 128 символами, широко используемыми в Западной Европе (включая письма из Германии и Франции). Набор символов ISO8859-1 также можно закодировать с помощью 1 байта. Этот набор символов также имеет псевдоним Latin1.

3. Набор символов GB2312.

Включает китайские иероглифы, латинские буквы, греческие буквы, японские буквы хираганы и катаканы, а также русские буквы кириллицы. Он содержит 6763 китайских иероглифа и 682 других иероглифа. Этот набор символов также совместим с набором символов ASCII, поэтому, если символ находится в наборе символов ASCII, он использует 1-байтовую кодировку, в противном случае — 2-байтовую кодировку.

4. Набор символов GBK

GBK расширяет набор символов GB2312, а метод кодирования совместим с набором символов GB2312. То же, что и набор символов GB2312: если символ находится в наборе символов ASCII, используется однобайтовая кодировка, в противном случае используется двухбайтовая кодировка.

5. Набор символов UTF-8.

Он содержит символы, используемые сегодня почти во всех странах и регионах мира, и продолжает расширяться. Этот набор символов совместим с набором символов ASCII и использует кодировку переменной длины.Для кодирования символа требуется от 1 до 4 байтов. Обычно китайский иероглиф кодируется 3 байтами, а буква — одним байтом. UTF-8 — это схема кодировки Unicode в дополнение к схемам кодирования UTF-16 и UTF-32.

Мы видим, что наборы символов ISO8859-1, GB2312, GBK и UTF-8 включают набор символов ASCIIS, GBK включает набор символов GB2312, а символы, включенные в UTF-8, охватывают символы GBK, GB2312 и ISO8859-1, но правила кодирования у них разные.

Например, способ кодирования китайского иероглифа «Я»:

Кодировка в ГБК: 1100111011010010.

Кодировка UTF-8: 111001101000100010010001

2. Набор символов GreatSQL и правила сравнения

1. Проверьте наборы символов, поддерживаемые GreatSQL.

Используйте оператор show (набор символов|набор символов) [например, шаблон соответствия] для просмотра поддерживаемых наборов символов. Данные берутся из таблицы Information_schema.character_sets.

Среди них набор символов и кодировка являются синонимами.

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)

Выше приведены наборы символов GreatSQL 8.0 из 41. Параметры сортировки по умолчанию относятся к правилам сравнения набора символов по умолчанию, а Maxlen относится к максимальному количеству байтов, требуемых набором символов для представления символа.

utf8 в версии GreatSQL 5.7 относится к utf8mb3, который представляет собой «кастрированный» набор символов UTF-8, который использует только от 1 до 3 байтов для представления символов. utf8mb4 — это подлинный набор символов UTF-8, использующий для представления символов 1–4 байта. utf8mb4 хранит больше символов, чем utf8mb3, например выражения emoj и т. д. Mysql в значительной степени оптимизировал производительность набора символов utf8mb4 и является набором символов по умолчанию.

2. Просмотрите правила сравнения GreatSQL.

Вы можете просмотреть поддерживаемые правила сравнения с помощью оператора show сопоставления [например, шаблона сопоставления].Данные берутся из таблицы information_schema.collations.

Каждый набор символов имеет несколько правил сравнения. Проверьте правила сравнения 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)

Текущая версия запроса — GreatSQL8.0.32, и существует 89 типов правил сравнения utf8mb4. Правила именования сортировки также являются обычными: начинаются с имени набора символов, за которым следует суффикс _ai, _as, _ci, _cs, _bin. Значения этих суффиксов следующие:

суффикс Английское значение Китайское описание
_ай нечувствителен к акценту Не различайте акценты
_как чувствительный к акценту Различайте стресс
_ci без учета регистра нечувствительный к регистру
_cs с учетом регистра с учетом регистра
_bin двоичный Сравнить в двоичном режиме

Правило проверки по умолчанию для набора символов utf8mb4 — utf8mb4_0900_ai_ci.Этот 0900 представляет правило сортировки, основанное на алгоритме сопоставления Unicode (UCA) 9.0.0.

Каждое правило корректуры имеет атрибут Pad_attribute, значение которого равно PAD SPACE или NO PAD. Правила корректуры PAD SPACE игнорируют конечные пробельные символы, а правила корректуры NO PAD действуют наоборот.

Например: Из приведенного выше запроса мы видим, что Pad_attribute utf8mb4_0900_bin имеет значение NO PAD, что означает, что конечные пробелы не игнорируются. Атрибут Pad_attribute utf8mb4_bin — это PAD SPACE, что означает, что конечные пробелы будут игнорироваться.

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. Наборы символов и уровни использования правил сравнения.

Уровни использования набора символов GreatSQL и правил сравнения — это уровень сервера, уровень базы данных, уровень таблицы и уровень столбца соответственно.

(1) Уровень сервера (сервер):

Для представления предусмотрены две системные переменные. character_set_server иcollation_server. Измените эти две переменные с помощью параметров запуска при запуске серверной программы или с помощью оператора set во время работы программы. Например, настроено в файле конфигурации:

 [server] 
 character_set_server=utf8mb4  
 collation_server=utf8mb4_bin

(2) Уровень базы данных (база данных):

Для представления предусмотрены две системные переменные. character_set_database иcollation_database, эти две переменные нельзя изменить напрямую, их можно изменить только путем создания библиотеки или изменения операторов библиотеки. Операторы создания библиотеки, в которых не указан набор символов, будут использовать настройку уровня сервера.

Соответствующее заявление:

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;
уровень Применение
уровень базы данных
уровень стола create table имя_таблицы(информация о столбце)[название набора символов][имя правила сопоставления]; alter table table_name[имя набора символов][имя правила сопоставления];
уровень столбца создать таблицу table_name (имя столбца, тип строки [набор символов, имя набора символов] [имя правила сравнения по сортировке], другие столбцы...); изменить таблицу имя_таблицы изменить тип строки имени столбца [набор символов, имя набора символов] [имя правила сопоставления] ; Обратите внимание при изменении информации о столбце: Не указывайте набор символов при изменении столбца. Даже если он указан при создании, будет использоваться набор символов и правила сравнения таблицы. Если измененный набор символов столбца не может представлять данные, хранящиеся в столбце, будет сообщено об ошибке.

(3)Уровень стола:

Указывается при создании и изменении таблиц. Разные таблицы в одной базе данных могут использовать разные наборы символов. Если в операторе создания таблицы не указаны набор символов и правила сравнения, используются набор символов и правила сравнения базы данных, в которой расположена таблица.

Соответствующее заявление:

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;

Обратите внимание, что наборы символов и правила сравнения связаны друг с другом.Если при изменении указан только набор символов, правила сравнения также станут правилами сравнения по умолчанию для измененного набора символов. Если указано только правило сравнения, набор символов также изменится на набор символов, соответствующий правилу сравнения. В этом случае достаточно указать правила сравнения.

Изменение набора символов таблицы по умолчанию действует только для столбцов, добавленных позже. Правила проверки для существующих столбцов остаются неизменными.

(4) Уровень столбца:

Для столбцов, в которых хранятся строки, разные столбцы в одной таблице могут иметь разные наборы символов и правила сравнения. Вы можете указать набор символов столбца и правила сравнения при создании и изменении информации столбца. Если не указано иное при создании и изменении столбцов, используются набор символов таблицы и правила сравнения.

Соответствующее заявление:

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

Обратите внимание при изменении информации о столбце: Не указывайте набор символов при изменении столбца.Даже если набор символов указан при создании столбца, будут использоваться набор символов и правила сравнения таблицы. Если измененный набор символов столбца не может представлять данные, хранящиеся в столбце, будет сообщено об ошибке.

4. Набор символов, используемый при общении между клиентом и сервером.

Строка — это последовательность двоичных байтов в компьютере. Если для кодирования и декодирования используются разные наборы символов, конечный результат определенно будет тарабарщиной, которую вы не узнаете.

Если наборы символов, используемые клиентом и сервером, различаются, будет задействован процесс преобразования набора символов. С точки зрения пользователя запрос, отправленный клиентом, и ответ, возвращаемый сервером, представляют собой строки. С точки зрения машины запрос, отправленный клиентом, и ответ, возвращаемый сервером, по существу представляют собой последовательность байтов.В процессе «клиент отправляет запрос, а сервер возвращает ответ» он претерпел несколько преобразований набора символов.

Давайте возьмем систему Linux в качестве примера, чтобы проиллюстрировать этот процесс.

А. Клиент отправляет запрос.

Как правило, набор символов, используемый клиентом при кодировании строки запроса, соответствует набору символов, который в настоящее время используется операционной системой. Переменная среды LANG системы Linux определяет, какой набор символов в данный момент используется операционной системой.

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

en_US.UTF-8

Если при запуске клиентской программы указана опция default-character-set, клиент использует набор символов, указанный этой опцией.

Б. Сервер получает запрос

По сути, запрос, полученный сервером, представляет собой последовательность двоичных байтов. То, как сервер декодирует эту последовательность байтов или какой набор символов сервер использует для декодирования, зависит от системной переменнойcharacter_set_client, которая является уровнем сеанса. Сервер не знает, какой набор символов на самом деле используется для кодировки клиента, поэтому сервер декодирует полученный запрос с помощью набора символов, заданного системной переменной chacter_set_client. В обычных обстоятельствах мы должны стараться изо всех сил, чтобы гарантировать согласованность двух наборов символов, иначе возникнет ситуация «курица и утка».

в) Сервер обрабатывает запрос

Когда сервер фактически обрабатывает запрос, он преобразует запрошенную последовательность байтов в последовательность байтов, закодированную в наборе символов, соответствующем системной переменнойcharacter_set_connection.Существует также соответствующая системная переменнаяcollation_connection, указывающая, какое правило сравнения следует использовать для этих строк. . Так зачем нам нужно это преобразование?Я думаю, что этот дизайн полностью отражает его гибкость. Возьмем следующий пример:

Клиент делает запрос: select 'a'='A'; Должен ли он вернуть true или false?

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)

Как видно из приведенного выше примера, первоначальное правило сравнения collation_connection='utf8mb4_0900_ai_ci' не чувствительно к прописным и строчным буквам. 'a'='A' возвращает true. После изменения правила сравнения collation_connection='utf8mb4_0900_bin' сравните согласно в двоичный формат. 'a'='A' возвращает false.

Что, если вы передадите литерал для сравнения с сохраненным значением столбца таблицы?

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)

Из приведенного выше примера мы видим, что набор символов и правила сравнения столбца имеют более высокий приоритет, чем системная переменная collation_connection.Во время сравнения строка в запросе будет преобразована в набор символов столбца и сравнена в соответствии с правила сравнения столбца.

г. Сервер генерирует ответ.

Какую последовательность байтов кодировки набора символов сервер отправляет клиенту, зависит от значения системной переменнойcharacter_set_results. В качестве примера возьмем таблицу t0, построенную выше.

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)

Как видно из приведенного выше примера, когда для параметраcharacter_set_results установлено значение utf8mb4, китайский символ «I» может отображаться нормально. Когда он изменяется на набор символов ascii, китайский символ «?» Вместо этого набор символов ASCII не содержит китайских символов и не может представлять китайские символы. То есть ответ, сгенерированный сервером, будет преобразован в последовательность байтов набора символов, установленного символом_set_results, и отправлен клиенту.

е. Клиент получает ответ

Ответ, полученный клиентом, также представляет собой последовательность байтов, и эта последовательность байтов интерпретируется в соответствии с набором символов, используемым в данный момент операционной системой.Если указан параметр запуска default-character-set, используется настройка этого параметра. Декодировать полученную последовательность байтов и отображать удобочитаемые символы.

С помощью описанного выше процесса мы видим, что процесс связи между клиентом и сервером прошел через несколько преобразований набора символов. Мы используем таблицу для обобщения этого процесса преобразования.

Клиент отправляет запрос Строка кодируется в соответствии с набором символов, используемым в данный момент операционной системой, или набором символов, заданным параметром запуска клиентской программы default-character-set.
Сервер получает запрос Сервер считает, что запрос закодирован согласно набору символов, заданному переменнойcharacter_set_client, и поэтому декодирует его согласно набору символов, заданному этой переменной.
Сервер обрабатывает запрос Преобразуйте последовательность байтов запроса из набора символовcharacter_set_client в набор символовcharacter_set_connection и обработайте соответствующее сопоставление_соединение в качестве правила сравнения. При обработке данных в столбце базы данных для обработки используется набор символов и правила сравнения столбца, еслиcharacter_set_connection не соответствует ему, то он будет преобразован в набор символов столбца.
Сервер генерирует ответ Сервер использует кодировку набора символов, установленную в файле символов_set_results, для отправки последовательности байтов клиенту.
Клиент получает ответ Последовательность байтов ответа, полученная клиентом, затем интерпретируется в соответствии с набором символов, используемым в данный момент операционной системой, или набором символов, заданным параметром запуска клиентской программы default-character-set, и отображает символы, понятные взрослым.

Обратите внимание, что эти три системные переменныеcharacter_set_client,character_set_connection иcharacter_set_results являются системными переменными уровня сеанса. При подключении к серверу клиент отправляет на сервер информацию о наборе символов по умолчанию вместе с именем пользователя, паролем и другой информацией.После ее получения сервер инициализирует эти три системные переменные набором символов клиента по умолчанию. Эти переменные можно изменить с помощью оператора set, но в их модификации нет особой необходимости и необходимости. Следует отметить, что использование оператора set для изменения этих трех системных переменных не изменит набор символов, используемый клиентом при кодировании строки запроса, а также не изменит набор символов клиента по умолчанию.

Сводка по использованию

  1. В GreatSQL версии 8.0 для параметраcharacter_set_server по умолчанию установлено значение utf8mb4, а для параметраcollation_server — utf8mb4_0900_ai_ci. Это настройка по умолчанию на глобальном уровне. При создании базы данных без указания набора символов и правил проверки будет использоваться набор символов и правила проверки, заданные параметрамиcharacter_set_server иcollation_server. Обратите внимание: если набор символов указан без сортировки, метод сортировки будет использовать параметры сортировки по умолчанию для указанного набора символов вместо правила проверки, указанного в параметре collation_server.
  2. Если вы не укажете набор символов и правила проверки при создании таблицы, будут использоваться набор символов и правила проверки базы данных. Обратите внимание, что если вы укажете набор символов без указания сортировки, сортировка будет использовать сортировку по умолчанию для указанного символа. установить вместо базы.Правила проверки.
  3. При создании таблицы, если в столбце не указаны набор символов и правила проверки, будет использоваться набор символов и правила проверки, указанные в таблице. будет использоваться база данных, которой он принадлежит.
  4. Помните, что если вы укажете только набор символов, но не укажете правило проверки, правило проверки будет использовать параметры сортировки по умолчанию для указанного набора символов, и результаты могут не соответствовать ожиданиям. Поэтому при создании баз данных, таблиц данных и столбцов в таблицах лучше не просто указывать набор символов. Вы можете опустить набор символов и правила проверки или указать только правила проверки.
  5. Необходимо убедиться, что набор символов связанных полей в связанной таблице соответствует правилам проверки, чтобы можно было правильно использовать индекс.

Наслаждайтесь GreatSQL :)


О GreatSQL

База данных GreatSQL — это бесплатная база данных с открытым исходным кодом, которая может соответствовать сценариям приложений финансового уровня на обычном оборудовании. Она обладает такими функциями, как высокая доступность , высокая производительность , высокая совместимость и высокая безопасность . Она может быть идеальной заменой MySQL или Percona Server для MySQL.

Ссылки по теме

Сообщество GreatSQL

Гите

Гитхаб

Билибили

Группа технического обмена

WeChat: добавление GreatSQL社区助手друзей, идентификатор WeChat wanlidbcотправляет информацию для проверки.加群

Группа QQ: 533341697

Наслаждайтесь GreatSQL :)

О GreatSQL

GreatSQL — это внутренняя независимая база данных с открытым исходным кодом, подходящая для приложений финансового уровня. Она имеет множество основных функций, таких как высокая производительность, высокая надежность, простота использования и высокая безопасность. Ее можно использовать в качестве дополнительной замены MySQL или Percona Server. и используется в онлайн-производственной среде, совершенно бесплатно и совместимо с MySQL или Percona Server.

Ссылки по теме: Сообщество GreatSQL Gitee GitHub Bilibili

Сообщество GreatSQL:

изображение

Предложения и отзывы сообщества о наградах: https://greatsql.cn/thread-54-1-1.html .

Подробности о заявках, получивших награды в блоге сообщества: https://greatsql.cn/thread-100-1-1.html .

(Если у вас есть какие-либо вопросы по статье или у вас есть уникальные идеи, вы можете зайти на официальный сайт сообщества, чтобы задать их или поделиться ими~)

Группа технического обмена:

Группа WeChat и QQ:

Группа QQ: 533341697

Группа WeChat: добавьте помощника сообщества GreatSQL (идентификатор WeChat:) wanlidbcв друзья и подождите, пока помощник сообщества добавит вас в группу.

Тан Сяоу, основатель SenseTime, скончался в возрасте 55 лет. В 2023 году PHP находился в застое . Система Hongmeng вот-вот станет независимой, и многие университеты создали «классы Hongmeng». Версия Quark Browser для ПК начала внутреннее тестирование. ByteDance был «запрещен» OpenAI. Стартап-компания Чжихуэйцзюня была рефинансирована на сумму более 600 миллионов юаней, а предварительная оценка составила 3,5 миллиарда юаней. Помощники по написанию кода на основе искусственного интеллекта настолько популярны, что они даже не могут конкурировать в программировании. языковые рейтинги Mate 60 Pro модем 5G и радиочастотная технология далеко впереди No Star, No Fix MariaDB отделяется от SkySQL и становится независимой компанией
{{o.name}}
{{м.имя}}

рекомендация

отmy.oschina.net/GreatSQL/blog/10322636