Character set database как изменить

Gahcep.github.com :


January 5, 2013


Posted by:

gaHcep


Category:

MySQL, Unicode

Сегодня речь пойдет о MySQL и о настройке UTF8 кодировки по-умолчанию.
Тема заезжена, но как я убедился за прошедшую неделю, мало кто в состоянии нормально пояснить какие параметры и куда надо прописать для полноценной работы с UTF8 в MySQL. К сожалению, ситуация на тематических блогах оставляет желать лучшего. Основной тип ответа — приведение соедржимого конфигурационного файла с комментарием типа “попробуй, у меня это работает”.

Основная цель данного поста — выяснить, какие параметры и с какими значениями следует прописать в конфигурационный файл my.cnf (my.ini) для дальнейшей беспроблемной работы с Юникодом.

Рабочее окружение

UTF8 на данный момент у меня успешно работает в Мастер-Слейв конфигурации:

  • MySQL версии 5.1.66
  • Два сервера CentOS версии 6.3
  • Репликация между серверами Master-Slave на базе SSL

Любой внешний клиент в состоянии корректно работать с UTF8 базой (проверено на EMS Manager for MySQL c Windows 8 x64).

Все опции и настройки я привожу для версии сервера 5.1.x, однако с минимальными (а то и вовсе без оных) изменениями все это будет работать и на версиях 5.5.x и 5.6.x.

Параметры кодировок MySQL

Довольно часто приходится видеть в ответах на вопросы о настройке UTF8 следующее:

[mysqld]
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake 

Предполагается, что после вставки всего этого добра (тут кстати есть противоречащие друг другу опции) в конфигурационный файл my.cnf (my.ini) магический Юникод начнет работать.

Но давайте забудем о списке и попытаемся разбираться со всеми опциями сами и начнем с самого начала. То есть с документации. Потому как все это прекрасно описано в документации MySQL на официальном сайте. Я лишь постараюсь последовательно рассказать о параметрах сервера и прояснить неясные моменты.

Главный раздел по описанию кодировок (character sets) и их представлений (collations — используется например при сортировке) в контексте сервера, базы, таблиц — это секция 10.1.3. Specifying Character Sets and Collations.

Символьная кодировка может быть задана для:

  1. сервера,
  2. базы данных,
  3. таблицы и
  4. колонок в таблице.

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

Все параметры могут быть переданы серверу тремя разными способами:

  1. через командную строку mysqld
  2. через конфигурационный файл my.cnf (my.ini)
  3. через опции компиляции.

Второй и третий варианты рассматриваться не будут. Тут уместно будет просто прочитать официальные доки — в каждом разделе приведены примеры конфигурации с использованием всех трех способов. Я же буду использовать первый вариант.

Кодировка (character set) и представление (collation) сервера

Секция 10.1.3.1. Server Character Set and Collation

Кодировка (characher set) — набор используемых символов.
Представление (collation) — набор правил для сравнения символов в наборе.

Тут есть несколько фундаментальных вещей которые надо понимать.

Основные параметры используемые в контексте сервера — это character_set_server и collation_server. Оба параметра влияют на определение кодировки и отображения сервера MySQL.

Можно задать оба параметра либо только один из них. При этом важно знать как задача того или иного влияет на определение отсутствующего:

  • Не заданы — используются значения по умолчанию (дефолтные),

  • Заданы оба — используются указанные кодировка и ее представление,

  • Задана только кодировка — ее представление выставляется по умолчанию для данного типа кодировки. Что это значит? Для каждого типа кодировки есть ее дефолтное представление, например, дефолтная кодировка сервера — latin1, а дефолтное отображение для нее — latin1_swedish_ci.
    Посмотреть соответствие кодировки и ее дефолтного представления можно используя команду:

    SHOW COLLATION LIKE ‘your_character_set_name’;

    Пример:

    mysql> SHOW COLLATION LIKE ‘latin1%’;

     +-------------------+---------+----+---------+----------+---------+
     | Collation         | Charset | Id | Default | Compiled | Sortlen |
     +-------------------+---------+----+---------+----------+---------+
     | latin1_german1_ci | latin1  |  5 |         | Yes      |       1 |
     | latin1_swedish_ci | latin1  |  8 | Yes     | Yes      |       1 |
     | latin1_danish_ci  | latin1  | 15 |         | Yes      |       1 |
     | latin1_german2_ci | latin1  | 31 |         | Yes      |       2 |
     | latin1_bin        | latin1  | 47 |         | Yes      |       1 |
     | latin1_general_ci | latin1  | 48 |         | Yes      |       1 |
     | latin1_general_cs | latin1  | 49 |         | Yes      |       1 |
     | latin1_spanish_ci | latin1  | 94 |         | Yes      |       1 |
     +-------------------+---------+----+---------+----------+---------+
    

Поле Default дает ответ о представлении выбранной кодировки.

В нашем случае, при настройке дефолтной кодировки в UTF8, параметры должны быть определены, так как могут быть использованы при определении кодировки или представления базы данных:

Наши команды:
my.cnf (my.ini)

[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci

Дефолтное представление для utf8 — utf8_general_ci, так что если бы мы его использовали вместо utf8_unicode_ci, то параметр collation_server можно было бы вообще опустить.

Кодировка (character set) и представление (collation) базы данных

Секция 10.1.3.2. Database Character Set and Collation
Секция 10.1.4. Connection Character Sets and Collations

Тут есть два варианта определения кодировки и представления:

  • явно — при выполнении запроса на создание базы данных:

    CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;

  • неявно через переменные character_set_database и collation_database.
    Однако, эти переменные нельзя задать явно ни в командной строке ни в конфигурационном файле. Как они инициализируются — чуть ниже.

Вообще при работе с базой данных огромную роль помимо серверных настроек играют настройки клиент-серверного соединения (connection). На этом этапе вступают в игру следующие специфичные для соединения параметры:

  • character_set_client — кодировка в которой посылается запрос от клиента
  • character_set_connection — кодировка используемая для конвертации пришедшего запроса (statement’а)
  • character_set_results — кодировку, в которую сервер должен перевести результат перед его отправкой клиенту

Есть еще представление кодировки соединения (colation_connection). Для чего нужен этот параметр думаю пояснять не надо.

Озадачиваться проблемой инициализации всех этих переменных не стоит (хотя в нашем случае присвоить им значения необходимо).
Есть способ проще: существует два типа запросов (statements) которые задают настройки соединения клиента с сервером группой:

Запрос SET NAMES ‘charset_name’ [COLLATE ‘collation_name’]

Параметр определяет в какой кодировке теперь будут приходить сообщения для сервера от клиента. Прелесть в том, что запрос SET NAMES x эквивалентен следующей группе:

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

Для определении представления кодировки соединения (colation_connection) отличного от дефолтного, следует дополнить запрос:

SET NAMES x COLLATE y

А так как у нас utf8 и ее дефолтное представление utf8_general_ci, то нам нужно выпонить полный запрос:

SET NAMES utf8 COLLATE utf8_unicode_ci

Таким образом, используя только этот запрос, можно добиться корректной UTF8 инициализации соединения.

Однако, тут есть один нюанс:

SET NAMES x, как понятно из определения, определяет настройку клиента при коннекте к серверу. Но что делать, если клиент — сам mysql.exe и нам хочется установить collation_connection по-умолчанию, не выполняя каждый раз SET NAMES x при коннекте?
Для этих целей, существует еще один параметр — default_character_set.
Он эквивалентен запросу SET NAMES utf8. В случае его использования задать collation_connection отличный от дефолтного уже не получится, поэтому придется заюзать еще одну команду init_connect (так как напрямую collation_connection нельзя прописать в конфигурационном файле):

init_connect=‘SET collation_connection = utf8_unicode_ci’

Но и тут есть еще одно но: init_connect команда не выполняется для SUPER пользователей — пользователей, обладающих привилегией SUPER. root входит в этот перечень, поэтому при коннекте root’ом команду SET collation_connection = utf8_unicode_ci все же придется выполнить вручную.

Запрос SET CHARACTER SET charset_name

Запрос групповой и он также эквивалентен следующей группе:

SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;

Согласно документации, разница между двумя запросами в том, что параметры character_set_connection и collation_connection будут установлены на @@character_set_database и @@collation_database соответственно (выше я про них упоминал).

За более детальной информацией отсылаю по двум источникам — собственно к официальной документации и прекрасно оформленному ответу на stackoverflow.com.
Для нашей задачи вполне хватает первого параметра вместе с дополнительной командой.

Подытожим: различные сценарии и что юзается на каждом из них — относительно к настройкам соединения:

  • Если к базе коннектится mysql.exe клиент с пользователем с привилегией SUPER:
    • срабатывает опция в конфигурационном файле default_character_set = utf8
    • надо выполнить вручную команду init_connect='SET collation_connection = utf8_unicode_ci'
  • Если к базе коннектится mysql.exe клиент с пользователем без привилегии SUPER:
    • срабатывает опция в конфигурационном файле default_character_set = utf8
    • срабатывает команда в конфигурационном файле init_connect='SET collation_connection = utf8_unicode_ci'
  • Если к базе коннектится внешний клиент:
    • надо выполнить вручную команду SET NAMES utf8 COLLATE utf8_unicode_ci

Наши команды:
my.cnf (my.ini)

[client]
default_character_set = utf8

[mysqld]
init_connect=‘SET collation_connection = utf8_unicode_ci’

Кодировка (character set) и представление (collation) таблиц

Секция 10.1.3.3. Table Character Set and Collation

Тут все довольно просто. Задать кодировку и ее представление можно через команды:

CREATE TABLE t1 ( … )
CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Тут главное иметь в виду, что если эти настройки не заданы, то берутся настройки базы данных (см. пред. раздел). Нам эти настройки не интересны.

Кодировка (character set) и представление (collation) колонок в таблице

Секция 10.1.3.4. Column Character Set and Collation

Тут по аналогии с пред. секцией. Если параметры кодировок не указаны, берутся те, что указывались для таблицы.

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

skip-character-set-client-handshake

Помимо освещенных параметров, есть еще один довольно часто фигурирующий в разного рода источниках — skip-character-set-client-handshake. Установка этого параметра позволит проигнорировать информацию клиента о кодировке. Я данный параметр не использовал.

Верификация настроек

Итак, вот финальный snapshot наших изменений в файле my.cnf (my.ini):

[mysqld]
init_connect=‘SET collation_connection = utf8_unicode_ci’
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

После применения всех опций и рестарта сервера mysql для проверки настроек можно воспользоваться командами SHOW VARIABLES LIKE 'char%' и SHOW VARIABLES LIKE 'collation%';

Состояние среды до изменений:

mysql> SHOW VARIABLES LIKE'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

Состояние среды после изменений (в случае, если вы приконнектились не SUPER пользователем):

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

Для примера, вот отличие при соединении через mysql.exe пользователем с и без привилегии SUPER:

с привилегией:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | **utf8_general_ci** |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

с привилегией и выполненной вручную командой ‘SET collation_connection = utf8_unicode_ci’:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

без привилегии:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

Поздравляю, теперь ваши база, таблицы и все в таблицах по-умолчанию в кодировке UTF8.


Ссылки

  1. Официальное руководство MySQL версии 5.1
  2. Отличие utf8_unicode_ci от utf8_general_ci
  3. “MySQL Character Set Support” на informit.com позволит вам больше узнать о том что есть characher set и collation.

« Previous Blog Post | Back to top | Next Blog Post »


comments powered by Disqus

This question already has a lot of answers, but Mathias Bynens mentioned that ‘utf8mb4’ should be used instead of ‘utf8’ in order to have better UTF-8 support (‘utf8’ does not support 4 byte characters, fields are truncated on insert). I consider this to be an important difference. So here is yet another answer on how to set the default character set and collation. One that’ll allow you to insert a pile of poo (💩).

This works on MySQL 5.5.35.

Note, that some of the settings may be optional. As I’m not entirely sure that I haven’t forgotten anything, I’ll make this answer a community wiki.

Old Settings

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

Config

# 💩 𝌆
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

New Settings

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

character_set_system is always utf8.

This won’t affect existing tables, it’s just the default setting (used for new tables).
The following ALTER code can be used to convert an existing table (without the dump-restore workaround):

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Edit:

On a MySQL 5.0 server: character_set_client, character_set_connection, character_set_results, collation_connection remain at latin1. Issuing SET NAMES utf8 (utf8mb4 not available in that version) sets those to utf8 as well.


Caveat:
If you had a utf8 table with an index column of type VARCHAR(255), it can’t be converted in some cases, because the maximum key length is exceeded (Specified key was too long; max key length is 767 bytes.). If possible, reduce the column size from 255 to 191 (because 191 * 4 = 764 < 767 < 192 * 4 = 768). After that, the table can be converted.

Contents

  1. Server Level
  2. Database Level
  3. Table Level
  4. Column Level
  5. Filenames
  6. Literals
    1. Examples
    2. N
  7. Stored Programs and Views
    1. Illegal Collation Mix
  8. Example: Changing the Default Character Set To UTF-8
  9. See Also

In MariaDB, the default character set is latin1, and the default collation is latin1_swedish_ci (however this may differ in some distros, see for example Differences in MariaDB in Debian). Both character sets and collations can be specified from the server right down to the column level, as well as for client-server connections. When changing a character set and not specifying a collation, the default collation for the new character set is always used.

Character sets and collations always cascade down, so a column without a specified collation will look for the table default, the table for the database, and the database for the server. It’s therefore possible to have extremely fine-grained control over all the character sets and collations used in your data.

Default collations for each character set can be viewed with the SHOW COLLATION statement, for example, to find the default collation for the latin2 character set:

SHOW COLLATION LIKE 'latin2%';
+---------------------+---------+----+---------+----------+---------+
| Collation           | Charset | Id | Default | Compiled | Sortlen |
+---------------------+---------+----+---------+----------+---------+
| latin2_czech_cs     | latin2  |  2 |         | Yes      |       4 |
| latin2_general_ci   | latin2  |  9 | Yes     | Yes      |       1 |
| latin2_hungarian_ci | latin2  | 21 |         | Yes      |       1 |
| latin2_croatian_ci  | latin2  | 27 |         | Yes      |       1 |
| latin2_bin          | latin2  | 77 |         | Yes      |       1 |
+---------------------+---------+----+---------+----------+---------+

Server Level

The character_set_server system variable can be used to change the default server character set. It can be set both on startup or dynamically, with the SET command:

SET character_set_server = 'latin2';

Similarly, the collation_server variable is used for setting the default server collation.

SET collation_server = 'latin2_czech_cs';

Database Level

The CREATE DATABASE and ALTER DATABASE statements have optional character set and collation clauses. If these are left out, the server defaults are used.

CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
ALTER DATABASE czech_slovak_names COLLATE = 'keybcs2_general_ci';

To determine the default character set used by a database, use:

SHOW CREATE DATABASE czech_slovak_names;
+--------------------+--------------------------------------------------------------------------------+
| Database           | Create Database                                                                |
+--------------------+--------------------------------------------------------------------------------+
| czech_slovak_names | CREATE DATABASE `czech_slovak_names` /*!40100 DEFAULT CHARACTER SET keybcs2 */ |
+--------------------+--------------------------------------------------------------------------------+

or alternatively, for the character set and collation:

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;
+--------------+--------------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+--------------------+----------------------------+------------------------+----------+
| def          | czech_slovak_names | keybcs2                    | keybcs2_general_ci     | NULL     |
| def          | information_schema | utf8                       | utf8_general_ci        | NULL     |
| def          | mysql              | latin1                     | latin1_swedish_ci      | NULL     |
| def          | performance_schema | utf8                       | utf8_general_ci        | NULL     |
| def          | test               | latin1                     | latin1_swedish_ci      | NULL     |
+--------------+--------------------+----------------------------+------------------------+----------+

It is also possible to specify only the collation, and, since each collation only applies to one character set, the associated character set will automatically be specified.

CREATE DATABASE danish_names COLLATE 'utf8_danish_ci';

SHOW CREATE DATABASE danish_names;
+--------------+----------------------------------------------------------------------------------------------+
| Database     | Create Database                                                                              |
+--------------+----------------------------------------------------------------------------------------------+
| danish_names | CREATE DATABASE `danish_names` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_danish_ci */ |
+--------------+----------------------------------------------------------------------------------------------+

Although there are character_set_database and collation_database system variables which can be set dynamically, these are used for determining the character set and collation for the default database, and should only be set by the server.

Table Level

The CREATE TABLE and ALTER TABLE statements support optional character set and collation clauses, a MariaDB and MySQL extension to standard SQL.

CREATE TABLE english_names (id INT, name VARCHAR(40)) 
  CHARACTER SET 'utf8' 
  COLLATE 'utf8_icelandic_ci';

If neither character set nor collation is provided, the database default will be used. If only the character set is provided, the default collation for that character set will be used . If only the collation is provided, the associated character set will be used. See Supported Character Sets and Collations.

ALTER TABLE table_name
 CONVERT TO CHARACTER SET charset_name [COLLATE collation_name];

If no collation is provided, the collation will be set to the default collation for that character set. See Supported Character Sets and Collations.

For VARCHAR or TEXT columns, CONVERT TO CHARACTER SET changes the data type if needed to ensure the new column is long enough to store as many characters as the original column.

For example, an ascii TEXT column requires a single byte per character, so the column can hold up to 65,535 characters. If the column is converted to utf8, 3 bytes can be required for each character, so the column will be converted to MEDIUMTEXT to be able to hold the same number of characters.

CONVERT TO CHARACTER SET binary will convert CHAR, VARCHAR and TEXT columns to BINARY, VARBINARY and BLOB respectively, and from that point will no longer have a character set, or be affected by future CONVERT TO CHARACTER SET statements.

To avoid data type changes resulting from CONVERT TO CHARACTER SET, use MODIFY on the individual columns instead. For example:

ALTER TABLE table_name MODIFY ascii_text_column TEXT CHARACTER SET utf8;
ALTER TABLE table_name MODIFY ascii_varchar_column VARCHAR(M) CHARACTER SET utf8;

Column Level

Character sets and collations can also be specified for columns that are character types CHAR, TEXT or VARCHAR. The CREATE TABLE and ALTER TABLE statements support optional character set and collation clauses for this purpose — unlike those at the table level, the column level definitions are standard SQL.

CREATE TABLE european_names (
  croatian_names VARCHAR(40) COLLATE 'cp1250_croatian_ci',
  greek_names VARCHAR(40) CHARACTER SET 'greek');

If neither collation nor character set is provided, the table default is used. If only the character set is specified, that character set’s default collation is used, while if only the collation is specified, the associated character set is used.

When using ALTER TABLE to change a column’s character set, you need to ensure the character sets are compatible with your data. MariaDB will map the data as best it can, but it’s possible to lose data if care is not taken.

The SHOW CREATE TABLE statement or INFORMATION SCHEMA database can be used to determine column character sets and collations.

SHOW CREATE TABLE european_namesG
*************************** 1. row ***************************
       Table: european_names
Create Table: CREATE TABLE `european_names` (
  `croatian_names` varchar(40) CHARACTER SET cp1250 COLLATE cp1250_croatian_ci DEFAULT NULL,
  `greek_names` varchar(40) CHARACTER SET greek DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE 'european%'G
*************************** 1. row ***************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: danish_names
              TABLE_NAME: european_names
             COLUMN_NAME: croatian_names
        ORDINAL_POSITION: 1
          COLUMN_DEFAULT: NULL
             IS_NULLABLE: YES
               DATA_TYPE: varchar
CHARACTER_MAXIMUM_LENGTH: 40
  CHARACTER_OCTET_LENGTH: 40
       NUMERIC_PRECISION: NULL
           NUMERIC_SCALE: NULL
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: cp1250
          COLLATION_NAME: cp1250_croatian_ci
             COLUMN_TYPE: varchar(40)
              COLUMN_KEY: 
                   EXTRA: 
              PRIVILEGES: select,insert,update,references
          COLUMN_COMMENT: 
*************************** 2. row ***************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: danish_names
              TABLE_NAME: european_names
             COLUMN_NAME: greek_names
        ORDINAL_POSITION: 2
          COLUMN_DEFAULT: NULL
             IS_NULLABLE: YES
               DATA_TYPE: varchar
CHARACTER_MAXIMUM_LENGTH: 40
  CHARACTER_OCTET_LENGTH: 40
       NUMERIC_PRECISION: NULL
           NUMERIC_SCALE: NULL
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: greek
          COLLATION_NAME: greek_general_ci
             COLUMN_TYPE: varchar(40)
              COLUMN_KEY: 
                   EXTRA: 
              PRIVILEGES: select,insert,update,references
          COLUMN_COMMENT: 

Filenames

Since MariaDB 5.1, the character_set_filesystem system variable has controlled interpretation of file names that are given as literal strings. This affects the following statements and functions:

  • SELECT INTO DUMPFILE
  • SELECT INTO OUTFILE
  • LOAD DATA INFILE
  • LOAD XML
  • LOAD_FILE()

Literals

By default, the character set and collation used for literals is determined by the character_set_connection and collation_connection system variables. However, they can also be specified explicitly:

[_charset_name]'string' [COLLATE collation_name]

The character set of string literals that do not have a character set introducer is determined by the character_set_connection system variable.

This query:

  SELECT CHARSET('a'), @@character_set_connection;

always returns the same character set name in both columns.

character_set_client and character_set_connection are normally (e.g. during handshake, or after a SET NAMES query) are set to equal values. However, it’s possible to set to different values.

Examples

Examples when setting @@character_set_client and @@character_set_connection
to different values can be useful:

Example 1:

Suppose, we have a utf8 database with this table:

CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET utf8 COLLATE utf8_general_ci;
INSERT INTO t1 VALUES ('oe'),('ö');

Now we connect to it using «mysql.exe», which uses the DOS character set
(cp850 on a West European machine), and want to fetch all records that
are equal to ‘ö’ according to the German phonebook rules.

It’s possible with the following:

SET @@character_set_client=cp850, @@character_set_connection=utf8;
SELECT a FROM t1 WHERE a='ö' COLLATE utf8_german2_ci;

This will return:

+------+
| a    |
+------+
| oe   |
| ö    |
+------+

It works as follows:

  1. The client sends the query using cp850.
  2. The server, when parsing the query, creates a utf8 string literal by converting ‘ö’ from @@character_set_client (cp850) to @@character_set_connection (utf8)
  3. The server applies the collation «utf8_german2_ci» to this string literal.
  4. The server uses utf8_german2_ci for comparison.

Note, if we rewrite the script like this:

SET NAMES cp850;
SELECT a FROM t1 WHERE a='ö' COLLATE utf8_german2_ci;

we’ll get an error:

ERROR 1253 (42000): COLLATION 'utf8_german2_ci' is not valid for CHARACTER SET 'cp850'

because:

  • on step #2, the literal is not converted to utf8 any more and is created using cp850.
  • on step #3, the server fails to apply utf8_german2_ci to an cp850 string literal.

Example 2:

Suppose we have a utf8 database and use «mysql.exe» from a West European machine again.

We can do this:

SET @@character_set_client=cp850, @@character_set_connection=utf8;
CREATE TABLE t2 AS SELECT 'ö';

It will create a table with a column of the type VARCHAR(1) CHARACTER SET utf8.

Note, if we rewrite the query like this:

SET NAMES cp850;
CREATE TABLE t2 AS SELECT 'ö';

It will create a table with a column of the type VARCHAR(1) CHARACTER SET cp850, which is probably not a good idea.

N

Also, N or n can be used as prefix to convert a literal into the National Character set (which in MariaDB is always utf8).

For example:

SELECT _latin2 'Müller';
+-----------+
| MĂźller   |
+-----------+
| MĂźller   |
+-----------+
SELECT CHARSET(N'a string');
+----------------------+
| CHARSET(N'a string') |
+----------------------+
| utf8                 |
+----------------------+
SELECT 'Mueller' = 'Müller' COLLATE 'latin1_german2_ci';
+---------------------------------------------------+
| 'Mueller' = 'Müller' COLLATE 'latin1_german2_ci'  |
+---------------------------------------------------+
|                                                 1 |
+---------------------------------------------------+

Stored Programs and Views

The literals which occur in stored programs and views, by default, use the character set and collation which was specified by the character_set_connection and collation_connection system variables when the stored program was created. These values can be seen using the SHOW CREATE statements. To change the character sets used for literals in an existing stored program, it is necessary to drop and recreate the stored program.

For stored routines parameters and return values, a character set and a collation can be specified via the CHARACTER SET and COLLATE clauses. Before 5.5, specifying a collation was not supported.

The following example shows that the character set and collation are determined at the time of creation:

SET @@local.character_set_connection='latin1';

DELIMITER ||
CREATE PROCEDURE `test`.`x`()
BEGIN
	SELECT CHARSET('x');
END;
||
Query OK, 0 rows affected (0.00 sec)

DELIMITER ;
SET @@local.character_set_connection='utf8';

CALL `test`.`x`();
+--------------+
| CHARSET('x') |
+--------------+
| latin1       |
+--------------+

The following example shows how to specify a function parameters character set and collation:

CREATE FUNCTION `test`.`y`(`str` TEXT CHARACTER SET utf8 COLLATE utf8_bin)
	RETURNS TEXT CHARACTER SET latin1 COLLATE latin1_bin
BEGIN
	SET @param_coll = COLLATION(`str`);
	RETURN `str`;
END;

-- return value's collation:
SELECT COLLATION(`test`.`y`('Hello, planet!'));
+-----------------------------------------+
| COLLATION(`test`.`y`('Hello, planet!')) |
+-----------------------------------------+
| latin1_bin                              |
+-----------------------------------------+

-- parameter's collation:
SELECT @param_coll;
+-------------+
| @param_coll |
+-------------+
| utf8_bin    |
+-------------+

Illegal Collation Mix

MariaDB 10.1.28 — 10.1.29

In MariaDB 10.1.28, you may encounter Error 1267 when performing comparison operations in views on tables that use binary constants. For instance,

CREATE TABLE test.t1 (
   a TEXT CHARACTER SET gbk 
) ENGINE=InnoDB 
CHARSET=latin1
COLLATE=latin1_general_cs;

INSERT INTO t1 VALUES ('user_a');

CREATE VIEW v1 AS
SELECT a <> 0xEE5D FROM t1;

SELECT * FROM v1;
Error 1267 (HY000): Illegal mix of collations (gbk_chinese_ci, IMPLICIT)
and (latin_swedish_ci, COERCIBLE) for operation

When the view query is written to file, MariaDB converts the binary character into a string literal, which causes it to be misinterpreted when you execute the SELECT statement. If you encounter this issue, set the character set in the view to force it to the value you want.

MariaDB throws this error due to a bug that was fixed in MariaDB 10.1.29. Later releases do not throw errors in this situation.

Example: Changing the Default Character Set To UTF-8

To change the default character set from latin1 to UTF-8, the following settings should be specified in the my.cnf configuration file.

[mysql]
...
default-character-set=utf8mb4
...
[mysqld]
...
collation-server = utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4
...

Note that the default-character-set option is a client option, not a server option.

See Also

  • String literals
  • CAST()
  • CONVERT()

Переходим с utf8 на utf8mb4 в MySQL.

utf8 или utf8mb4

Если ваша версия СУБД MySQL 5.5.3 и выше, то вам необходимо использовать кодировку utf8mb4, вместо utf8. Об этом упоминается здесь и здесь.

Следовательно, больше нет необходимости использовать ни utf8_general_ci, ни utf8_unicode_ci.

utf8mb4_general_ci или utf8mb4_unicode_ci

В настоящее время для баз данных и таблиц MySQL рекомендуется использовать кодировку utf8mb4_unicode_ci.

Настройка кодировки utf8mb4 для СУБД MySQL

Исходя из вышеизложенного нам необходимо произвести настройку основных параметров кодировки СУБД MySQL.

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

В конфигурационном файле MySQL (my.ini(windows)/my.cnf(Linux)) необходимо изменить кодировку на utf8mb4:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
init_connect ='SET collation_connection = utf8mb4_unicode_ci'
init_connect ='SET NAMES utf8mb4'
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

Проверяем корректность работы применимых настроек:

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

Результат:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set, 1 warning (0.00 sec)

Кодировка и сравнение для базы данных, таблиц и столбцов в MySQL

Запросы для измениния кодировки и сравнения для базы данных, таблиц и столбцов на utf8mb4.

Для базы данных:

ALTER DATABASE [db_name] CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Для таблицы:

ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Для столбцов:

ALTER TABLE [table_name] CHANGE [column_name] [column_name] VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Восстановление и оптимизация всех таблиц

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

REPAIR TABLE [table_name];
OPTIMIZE TABLE [table_name];

Или с использованием команды mysqlcheck:

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases

Пример миграции для Yii2

В этом примере мы изменим кодировку для столбца content в таблице post:

/**
* @return void
* @throws yiidbException
*/
public function safeUp()
{
 $sql = "ALTER TABLE `post` CHANGE `content` `content` MEDIUMTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
 Yii::$app->db->createCommand($sql)->execute();
}

/**
* @return void
* @throws yiidbException
*/
public function safeDown()
{
 $sql = "ALTER TABLE `post` CHANGE `content` `content` MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci";
 Yii::$app->db->createCommand($sql)->execute();
}

����� 10. ��������� ������� ��������

MySQL �������� ��������� ������ ��������, ������� ���� ����������� ���
��������� ������, ������������ ��� ������� �������� � ��������� ���������
�������� ���� �����������. �� ������ ���������� ������ �������� �� ������
�������, ���� ������, ������� � �������. MySQL ������������ �������������
������� �������� ��� ����� �������� MyISAM,
MEMORY, NDBClusterInnoDB.

��� ����� ��������� ��������� ����

  • ��� �������� �������� �������� � �������������?

  • �������� �� ��������� ������� � �������� �������� ���
    ���������� ������ ��������.

  • ��������� ��� ����������� ������� �������� � �����������.

  • ������� � �������� � ���������.

  • ��������� ��������� Unicode.

  • ������ �������� � �����������, ������� ��������, � ������������.

�������� ������ �������� ������������ �� �������� ������, �� ����� � ��
����� ����� ����������� ������������ � �������� MySQL. ���� �� ������, �����
��������� ������������ ��������� � ��������, ������������ ����� ��������,
�������� �� �������� �� ���������, �� ������ ������ �������, ������� ������.
��������, ����� ������������ utf8 Unicode, ������� ���
���������� ����� ���������� � ��������:

SET NAMES 'utf8';

10.1. ������ �������� � ����������� ������

����� �������� ������������ ����� ��������� �������� � �� �����.
����������� ������ ����� ������ ��� ��������� �������� � ������ ��������.
������� ������� �������� ����� � ������� �������.

������������, ��� �� ����� ������� � �������� ���������: A,
B, a, b. �� ���� ������� �������
�����: A = 0, B = 1, a = 2,
b = 3. ������ A ����� ����� 0, �������
the �������� ������
A, ���������� �� ���� ������� �������� � �� ����������� ��� ���
� ���� ����� ��������.

������������, ��� �� ����� ���������� ��� ��������� ��������,
AB. ����� ������� ������ ������� ��� ������� �
���, ����� ����������� �����������: 0 = A � 1 = B.
��������� 0 ������ ��� 1, �� �������, ��� A ������ ���
B. ��� �� ������ ��� �������? ��������� ����������� � ������
������ ��������. ����������� ������ ����� ������ (������ ���� ������� � ����
������). ����� ������� �� ���� ��������� ����������� ��������
�������� �����������.

�� ���, ���� �� ����� �������, ��� ������ ������� � ��������� �����
������������? �� ����� �� �� ������� ���� ��� �������: (1) ������������
������� ������� �������� ab ��� ����������
AB, (2) ����� ���������� �����������. ��
�������� ��� ������������ ��� ����� ��������. ��� ������� ����� ������,
��� �������� �����������.

� �������� ����� ����������� ������� �������� ����� ����� ��������: ��
������ AB, � ����� ��������, ������ �����
��������� ��� ��������� ������� ������ � �������� ��������, ������ � �������
������������ ��������� � ������� ����������. ����� � �������� �����
����������� ����������� ����� ����� ������, �� ������ ��� ����, �����
�������� ������� ��������, �� ����� � ��� ����, ����� �������� ��������������
�����. � ����� ��� ��������������� �����������
(���� ������ � �������� �����).

MySQL ����� ������ ��� ���� ��� ���:

  • ������� ������, ������������ ��� ������� ��������.

  • ���������� ������, ������������ ��� �����������.

  • ��������� ������ � ���������� �������� �������� ��� ������������� �
    ��� �� ����� ���� ������ ��� ���� ��� �� ����� �������.

  • ��������� ������������ ������ �������� � ����������� � ����� ������.

� ���� ���������� MySQL ����� �� ����������� ������ ������ ����������
������ ������. ������, ����� ������������ ��� ��������, �� ������ �����,
����� ������ �������� � ����������� �������� ����������, ��� ��������
�������� �� ���������, � ��� ��� ������������ �� ���������
��������� ���������� � �������.

10.2. ������ �������� � ����������� � MySQL

������ MySQL ����� ������������ ����� ������� ��������. ����� ������� �
������ ��������� ������ ��������, ����������� ���������� SHOW CHARACTER
SET
. ���� �������� ����� ������ ���� �������:

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
|     big5 | Big5 Traditional Chinese    | big5_chinese_ci     | 2      |
|     dec8 | DEC West European           | dec8_swedish_ci     | 1      |
|    cp850 | DOS West European           | cp850_general_ci    | 1      |
|      hp8 | HP West European            | hp8_english_ci      | 1      |
|    koi8r | KOI8-R Relcom Russian       | koi8r_general_ci    | 1      |
|   latin1 | cp1252 West European        | latin1_swedish_ci   | 1      |
|   latin2 | ISO 8859-2 Central European | latin2_general_ci   | 1      |
|     swe7 | 7bit Swedish                | swe7_swedish_ci     | 1      |
|    ascii | US ASCII                    | ascii_general_ci    | 1      |
|     ujis | EUC-JP Japanese             | ujis_japanese_ci    | 3      |
|     sjis | Shift-JIS Japanese          | sjis_japanese_ci    | 2      |
|   hebrew | ISO 8859-8 Hebrew           | hebrew_general_ci   | 1      |
|   tis620 | TIS620 Thai                 | tis620_thai_ci      | 1      |
|    euckr | EUC-KR Korean               | euckr_korean_ci     | 2      |
|    koi8u | KOI8-U Ukrainian            | koi8u_general_ci    | 1      |
|   gb2312 | GB2312 Simplified Chinese   | gb2312_chinese_ci   | 2      |
|    greek | ISO 8859-7 Greek            | greek_general_ci    | 1      |
|   cp1250 | Windows Central European    | cp1250_general_ci   | 1      |
|      gbk | GBK Simplified Chinese      | gbk_chinese_ci      | 2      |
|   latin5 | ISO 8859-9 Turkish          | latin5_turkish_ci   | 1      |
...

����� �������� ����� �������� ������ ����� �� ������� ���� ����
�����������, �� ����� ����� � ��������� �����������. ����� ������� � ������
����������� ��� ������ ��������, ����������� ���������� SHOW
COLLATION
. ��������, ����� ������� ����������� ��� ������ ��������
latin1, ����������� ��� ����������, ����� ����� �� �����
�����������, ������� ���������� � latin1:

mysql> SHOW COLLATION LIKE 'latin1%';
+--------------------+---------+----+---------+----------+---------+
| Collation          | Charset | Id | Default | Compiled | Sortlen |
+--------------------+---------+----+---------+----------+---------+
| latin1_german1_ci  | latin1  |  5 |         |          | 0       |
| latin1_swedish_ci  | latin1  |  8 | Yes     | Yes      | 1       |
| latin1_danish_ci   | latin1  | 15 |         |          | 0       |
| latin1_german2_ci  | latin1  | 31 |         | Yes      | 2       |
| latin1_bin         | latin1  | 47 |         | Yes      | 1       |
| latin1_general_ci  | latin1  | 48 |         |          | 0       |
| latin1_general_cs  | latin1  | 49 |         |          | 0       |
| latin1_spanish_ci  | latin1  | 94 |         |          | 0       |
+--------------------+---------+----+---------+----------+---------+

����������� � latin1 ����� ��������� ��������:

�����������
��������
latin1_german1_ci German DIN-1
latin1_swedish_ci Swedish/Finnish
latin1_danish_ci Danish/Norwegian
latin1_german2_ci German DIN-2
latin1_bin Binary according to
latin1 encoding
latin1_general_ci Multilingual (Western European)
latin1_general_cs Multilingual (ISO Western
European), case sensitive
latin1_spanish_ci Modern Spanish

����������� ����� ��� ����� ��������������:

  • ��� ��������� ������ �������� �� ����� ����� ��
    �� ����� �����������.

  • ������ ����� �������� ����� ���� �����������, ������� ��������
    �������� �� ��������� ������������. ��������, �������� �� ���������
    ����������� ��� latin1: latin1_swedish_ci. �����
    SHOW CHARACTER SET ���������, ������� ����������� ��������
    ��������� �� ��������� ��� ������� ������������� ������ ��������.

  • ������� ���������� ��� ���� �����������: ��� ���������� � ����� ������
    ��������, � ������� ��� �������, ��� ������ �������� ��� �����, � ���
    ������������� �� _ci (case insensitive), _cs (case
    sensitive) ��� �� _bin (binary).

10.3.
����������� ������� �������� � �����������

������� ��������� �� ��������� ��� ������� �������� � ����������� �
������� �������: ������, ���� ������, ������� � �������. ��������� ��������
����� ���������� �������, �� ���� �������� �����������, ��� ����� �������
�������� �� ��������� ����� � ������������ � ��������� �����������.

CHARACTER SET ������������ � ������������, ������� ����������
����� ��������. CHARSET ����� �������������� ��� �������
��� CHARACTER SET.

10.3.1. ����� �������� � �����������
�� ������� �������

������ MySQL ����� ����� �������� � ����������� �������. ��� ����� ����
����������� ��� ������� � �������� �� ����� ����������.

�������������, ����� �������� � ����������� ������� �� ����������, �������
�� �����������, ����� ���������� mysqld
. �� ������ ������������
--character-set-server ��� ������ ��������.
������ � ����, �� ������ ���������
--collation-server ��� �����������. ���� �� ��
����������� ����� ��������, ���������, ��� ������
--character-set-server=latin1. ���� ��
����������� ������ ����� �������� (��������, latin1), �� ��
������� �����������, ���������, ��� ������
--character-set-server=latin1
--collation-server=latin1_swedish_ci, ������ ���
latin1_swedish_ci �������� �� ��������� ����������� ���
latin1. �������������, ��������� ��� ������� ��� ����� ���
�� ����� ������:

shell> mysqld
shell> mysqld --character-set-server=latin1
shell> mysqld --character-set-server=latin1 
                 --collation-server=latin1_swedish_ci

���� ������ ������� ��������� ���������: ��������������. ���� �� ������
�������� �������� �� ��������� ����� �������� ������� � ����������� ���
������������ �� �������� �������, �����������:
--with-charset
--with-collation � �������� ���������� ���
configure. ��������:

shell> ./configure --with-charset=latin1

���:

shell> ./configure --with-charset=latin1 
                      --with-collation=latin1_german1_ci

mysqld � ������
configure ���������, ���
���������� ����������� � ������� �������� ���������. ���� ��� �� ���, ������
�� ���������� �������� ���������� ��������� �� ������ � �����������.

������� ����� �������� � ����������� ������� ����� ���� ���������� ��
�������� ���������� ������� character_set_server
collation_server. ��� ���������� ����� ���� ��������
�� ����� ����������.

10.3.2.
����� �������� � ����������� ���� ������

������ ���� ������ ����� ����� �������� � ����������� ���� ������.
���������� CREATE DATABASEALTER DATABASE
����� �������������� ����������� ��� ����������� ������ ��������
���� ������ � �����������:

CREATE DATABASE db_name
       [[DEFAULT] CHARACTER SET charset_name]
       [[DEFAULT] COLLATE collation_name]

ALTER DATABASE db_name
      [[DEFAULT] CHARACTER SET charset_name]
      [[DEFAULT] COLLATE collation_name]

�������� ����� SCHEMA
����� �������������� ������ DATABASE.

��� ��������� ���� ������ ��������� � ��������� �����
db.opt, ������� ����� ���� ������ �
�������� ��� ������.

����������� CHARACTER SETCOLLATE ������
��������� ������� ���� ������ � ���������� �������� �������� � �������������
�� ��� �� ����� ������� MySQL.

������:

CREATE DATABASE db_name CHARACTER SET latin1
       COLLATE latin1_swedish_ci;

MySQL �������� ����� �������� � ����������� ����
������ ��������� ��������:

  • ���� CHARACTER SET
    X
    COLLATE Y
    ���� ����������, �� ������������ ����� ��������
    X � ����������� Y.

  • ���� CHARACTER SET X ������ ���
    COLLATE, �� ����������� ����� �������� X
    �������� �� ��������� ����������� ��� ����.

  • ���� COLLATE Y ��� ��������� ���
    CHARACTER SET, �� ������������ ����� ��������, ��������� �
    Y, � ����������� Y.

  • �����, ����������� ����� �������� � ����������� �������.

����� �������� ���� ������ � ����������� ������������ ��� �������� ��
���������, ���� ����� �������� ������� � ����������� �� ��������� �
���������� CREATE TABLE. ��� �� ����� ������� ������ ����.

����� �������� � ����������� ��� �������� �� ��������� ���� ������ �����
���� ���������� �� �������� ���������� �������
character_set_databasecollation_database.
������ ������������� ��� ���������� ������ ���, ����� �������� �� ���������
���� ������ ����������. ���� �� ������� ������� �������� �� ��������� ����
������, ���������� ����� �� �� ����� ��������, ��� � ���������������
���������� ������� ������ �������:
character_set_servercollation_server.

10.3.3. ����� �������� � ����������� �������

������ ������� ����� ����� �������� ������� � �����������. ����������
CREATE TABLEALTER TABLE ����� ��������������
����������� ��� ����������� ������ �������� ������� � �����������:

CREATE TABLE tbl_name
             (column_list)
       [[DEFAULT] CHARACTER SET charset_name]
       [COLLATE collation_name]]
ALTER TABLE tbl_name
      [[DEFAULT] CHARACTER SET charset_name]
      [COLLATE collation_name]

������:

CREATE TABLE t1 ( ... ) CHARACTER SET latin1 COLLATE latin1_danish_ci;

MySQL �������� ����� �������� ������� � ����������� ��������� ��������:

  • ���� CHARACTER SET X
    COLLATE Y ���� ����������, ��
    ����������� ����� �������� X � �����������
    Y.

  • ���� CHARACTER SET X ��� ���������
    ��� COLLATE, �� ������������ ����� ��������
    X � �������� �� ��������� �����������.

  • ���� COLLATE Y ��� ��������� ���
    CHARACTER SET, �� ������������ ����� ��������, ��������� �
    Y � ����������� Y.

  • �����, ������������ ����� �������� � ����������� �� ���� ������.

����� �������� ������� � ����������� ������������ ��� �������� ��
���������, ���� ����� �������� ������� � ����������� �� ��������� �
�������������� ������������ �������. ����� �������� � ����������� �������
������������ ����� ���������� MySQL, �� ������� ������
������ � ��������� SQL.

10.3.4. ����� �������� � ����������� �������

������ ���������� ������� (�� ����, �������
���� CHAR, VARCHAR ��� TEXT) �����
����� �������� � ����������� �������. ��������� ����������� ������� �����
�������������� ����������� ��� ����������� ������
�������� � ����������� �������:

col_name {CHAR | VARCHAR | TEXT}
(col_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]

������:

CREATE TABLE Table1
       (column1 VARCHAR(5) CHARACTER SET latin1
       COLLATE latin1_german1_ci);

MySQL �������� ����� �������� ������� � ����������� ��������� ��������:

  • ���� ���� ����������
    CHARACTER SET XCOLLATE
    Y
    , �� ������������ ����� ��������
    X � ����������� Y.

  • ��� ��� ��������� CHARACTER SET X
    ��� COLLATE, �� ������������ ����� ��������
    X � �������� �� ��������� �����������.

  • ���� COLLATE Y ��� ��������� ���
    CHARACTER SET, �� ����������� ����� ��������, ��������� �
    Y, � ����������� Y.

  • �����, ������������ ����� �������� � ����������� �������.

����������� CHARACTER SET
COLLATE ���������� ��� SQL.

10.3.5. ����� �������� � �����������
���������� ��������� ���������

������ ���������� ��������� ������� ����� ����� �������� � �����������.

���������� ��������� ������� ����� ����� �������������� �����
�������� � ����������� COLLATE:

[_charset_name]'string'
[COLLATE collation_name]

������:

SELECT 'string';
SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_ci;

��� ������� ���������� SELECT 'string',
������ ����� ����� �������� � �����������, ������������ ����������� �������
character_set_connectioncollation_connection.

��������� _charset_name ���������
������� introducer. ��� ��������
��������������� �����������, ��� ������ ���������������� ������������� ������
�������� X. ��������� ���� ����� �������� � �������,
������� ����� �����������, ��� introducer �� �������� ������� ��������������,
��� ������ ������, ������� �� �������� �������� ������. Introducer �����
�������� ����� ����������� ����������������� ��������� � ��������
����������������� ����������� �������
(x'literal'
0xnnnn)>.

������:

SELECT _latin1 x'AABBCC';
SELECT _latin1 0xAABBCC;

MySQL ���������� ����� �������� �������� � ����������� ��������� ��������:

  • ���� ���� ���������� _X
    COLLATE Y, �� ������������ ����� ��������
    X � ����������� Y.

  • ���� ��������� _X, �� �� ���������
    COLLATE, �� ������������ ����� �������� X
    � �������� �� ��������� �����������.

  • �����, ������������ ����� �������� � �����������, ��������
    ����������� ������� character_set_connection
    collation_connection.

������:

  • ������ � ������� �������� latin1
    ������������ latin1_german1_ci:

    SELECT _latin1'M��ller' COLLATE latin1_german1_ci;
    
  • ������ � ������� �������� latin1 � �������� �� ���������
    ������������ (�� ����, latin1_swedish_ci):

    SELECT _latin1'M��ller';
    
  • ������ � ������� �������� � ������������ �� ��������� �����������:

    SELECT 'M��ller';
    

����� �������� � ����������� COLLATE ���������
�������� ��������� SQL

introducer ��������� ����� �������� ��� ��������� ������, �� �� ��������
����, ��� �������������� ���������� ��������� ��������� Escape ������ ������.
Escape ������ ���������������� �������������� ������������ �������� ������
��������, ��������� � character_set_connection.

��������� ������� ����������, ��� ���������� ��������� Escape, ���������
character_set_connection ���� � ����������� introducer. �������
���������� SET NAMES (������� ��������
character_set_connection) � ���������� ����������� � ����������
������, ������������ HEX(), ����� ���� �����
������ ��������� ����������.

������ 1:

mysql> SET NAMES latin1;
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT HEX('��n'), HEX(_sjis'��n');
+-------------+------------------+
| HEX('��n') | HEX(_sjis'��n') |
+-------------+------------------+
|        E00A | E00A             |
+-------------+------------------+
1 row in set (0.00 sec)

����� �� (����������������� �������� E0)
�������������� n, ����������� ������������������� ��� �����
������. ����������� ������������������ ����������������, ��������� ��������
character_set_connection latin1, ����� ����������
������� newline (����� ������, ����������������� �������� 0A).
��� ��������� ���� ��� ������ ������. �� ���� introducer _sjis
�� ������������ �� ��������� ��������������� ����������� Escape.

������ 2:

mysql> SET NAMES sjis;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT HEX('��n'), HEX(_latin1'��n');
+-------------+--------------------+
| HEX('��n') | HEX(_latin1'��n') |
+-------------+--------------------+
|      E05C6E |             E05C6E |
+-------------+--------------------+
1 row in set (0.04 sec)

����� character_set_connection ����� sjis,
����� �������� � ������� ������������������ �� ��������������
(����������������� �������� 05
5C), ���������� ������������� ������. �������������, ������ ���
����� ������ ���������������� ��� ��������� ������ sjis, �
�� �������������� ��� ������ ESC. ��������� n
(����������������� �������� 6E) �� ���������������� ��� �����
����������� ������������������. ����� �������, introducer
_latin1 �� ������������ �� ��������� Escape.

10.3.6. ������������ ����� ��������

�������� SQL ���������� NCHAR ��� NATIONAL CHAR
��� ������ �������, ��� ������� CHAR ������ ������������
��������� ���������������� ����� ��������. MySQL 5.1 ����������
utf8 ��� ���� ���������������� ����� ��������. ��������, ���
���������� ���� ������ ������������:

CHAR(10) CHARACTER SET utf8
NATIONAL CHARACTER(10)
NCHAR(10)

��� ���� ���������������:

VARCHAR(10) CHARACTER SET utf8
NATIONAL VARCHAR(10)
NCHAR VARCHAR(10)
NATIONAL CHARACTER VARYING(10)
NATIONAL CHAR VARYING(10)

�� ������ ������������ N'literal',
����� ������� ������ � ������������ ������ ��������.
��� ��� ���������� ������������:

SELECT N'some text';
SELECT _utf8'some text';

10.3.7.
������� ���������� ������ �������� � �����������

��������� ������� ����������, ��� MySQL ���������� �������� �� ���������
����� �������� � �����������.

������ 1: ����������� ������� � �������

CREATE TABLE t1 (c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci)
       DEFAULT CHARACTER SET latin2
       COLLATE latin2_bin;

����� �� ����� ������� � ������� �������� latin1
������������ latin1_german1_ci. ����������� ����, ��� ��� ���
������. �������� ��������, ��� �� ������� ������� �������� � �����������
������� latin1 � ������� latin2.

������ 2: ����������� ������� � �������

CREATE TABLE t1 (c1 CHAR(10) CHARACTER SET latin1)
       DEFAULT CHARACTER SET latin1
       COLLATE latin1_danish_ci;

�� ��� ��� �� ����� ������� � ������� �������� latin1
�������� �� ��������� ������������. ���� ��� ����� �� ����������
������������, �������� �� ��������� ����������� �� ����������� �� ������
�������. ������ �����, ��������� �������� �� ��������� ����������� ���
latin1 ����������� latin1_swedish_ci, �������
c1 ����� ����������� latin1_swedish_ci (��
latin1_danish_ci).

������ 3: ����������� ������� � �������

CREATE TABLE t1 (c1 CHAR(10))
       DEFAULT CHARACTER SET latin1
       COLLATE latin1_danish_ci;

�� ����� ������� � ��������� �� ��������� ������� �������� � ������������.
� ���� �������� MySQL ��������� ������� �������, ����� ���������� �����
�������� ������� � �����������. �������������, ����� �������� ��� �������
c1 latin1 � �����������
latin1_danish_ci.

������ 4: ����������� ���� ������, ������� �
�������

CREATE DATABASE d1 DEFAULT CHARACTER SET latin2
       COLLATE latin2_czech_ci; USE d1;
CREATE TABLE t1 (c1 CHAR(10));

�� ������� ������� ��� ����, ����� ���������� ����� �������� �
�����������. �� ����� �� ���������� ����� �������� � ����������� � ������
�������. � ���� �������� MySQL ��������� ������� ���� ������, �����
���������� ��������� ��������� �������, ������� � ����� ������� ������
����������� ��������� �������. �������������, ����� �������� ��� �������
c1 latin2 � �����������
latin2_czech_ci.

10.3.8. ������������� � ������� ����

��� ������������� � MaxDB ��� ��� ���������� �� �� �����:

CREATE TABLE t1 (f1 CHAR(N) UNICODE);
CREATE TABLE t1 (f1 CHAR(N)
       CHARACTER SET ucs2);

10.4. ������ �������� � �����������
�����������

��������� ���������� ������� ��� ������� �������� � ����������� ��������
�������������� ������������ � ��������. ��������� �� ��� ���� ��������� �
����� ������ ��������:

  • ����� �������� � ����������� ������� ����� ����
    ���������� �� �������� ���������� ������� character_set_server
    collation_server.

  • ����� �������� � ����������� �������� �� ��������� ���� ������ �����
    ���� ���������� �� �������� ���������� �������
    character_set_database
    collation_database.

�������������� ����� �������� � ����������� ���������� ������� ����������
� ������� ��������� ��� �����������. ������ ������������ ����� ��������� �
������������ ���������� ������� ������ �������� � �����������.

����� �� ������������ � ��������, ������ �������� ���������� SQL. ������
�������� ������, ���� ������� �����������, ������� ������������. ��� ����� �
���������� �������� ������������ ������ �������� � ��������� ����������� ���
����������� ������������, ������� �� ������� ����� �������� �
�������� ���������� �������:

  • � ����� ������ �������� ��������
    ���������� �� ������������?

    ������ ����� ���������� ������� character_set_client, �����
    ����������� � ������� ��������, � ������� ���������� ������� �������������.

  • � ����� ����� �������� ������ ������ �������������
    ���������� ����� ���������?

    ��� ����� ������ ���������� ���������� �������
    character_set_connectioncollation_connection.
    ��� ��������������� ����������, ��������� �������������, ��
    character_set_clientcharacter_set_connection (��
    �� ��������� ��������, ������� ����� introducer ���� _latin1 ���
    _utf8). collation_connection ����� ��� ���������
    ����������� �����. ��� ��������� ����� �� ���������� �������
    collation_connection �� ����� ��������, ������ ��� ������� �����
    �� ����������� �����������, ������� ����� ����� ������� �����������.

  • � ������ ����� �������� ������ ������ ������������� ������ �����
    ���������� ������� ����������� ��� ��������� �� ������� ������� ������������?

    ���������� ������� character_set_results ��������� �����
    ��������, � ������� ������ ���������� ���������� ������� ������������. ���
    �������� ������ ���������� ���� �������� �������, � ���������� ����������
    ���� ����� �������.

�� ������ ������������ ��������� ��������� ��� ���� ���������� ���
�������� �� �������� �� ��������� (����� �� ������ ���������� ���������
����� ����� �������).

������� ��� ����������, ������� ������������ ��
������ �������� �����������:

SET NAMES 'charset_name'
SET CHARACTER SET charset_name

SET NAMES ��������� ��, ����� ����� �������� ���������
������������, ����� ������� ���������� SQL �� ������. ����� �������,
SET NAMES 'cp1251' ��������, ��� ������� �������� ��������� ��
����� ������������ ��������� � ������ �������� cp1251.
��� ����� ���������� ����� ��������, ������� ������ ������ ������������ ���
������� ����������� ������� ������������. ��������, ��� ��������� ��, �����
����� �������� ������������ ��� �������� �������, ���� ��
����������� ���������� SELECT.

���������� SET NAMES 'x' ������������
���� ���� �����������:

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

��������� character_set_connectionx
����� ������������� collation_connection � ��������� ��
��������� ����������� ��� x. ����� ����������
������������� ����������� ��� ������� ��������, �����������
�������������� ����������� COLLATE:

SET NAMES 'charset_name'
    COLLATE 'collation_name'

SET CHARACTER SET ������� SET NAMES, ��
������������� character_set_connection
collation_connectioncharacter_set_database
collation_database. ���������� SET CHARACTER
SET x
������������ ���� ���� �����������:

SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;

��������� collation_connection ����� �������������
character_set_connection � ������ ��������, ���������� �
������������ (���������� ����������
SET character_set_connection = @@character_set_database).

����� ������������ �����������, �� �������� ������� ��� ������ ��������,
������� ��������� ������������. ������ ���������� ���, ����� ����������
���������� ������� character_set_client,
character_set_resultscharacter_set_connection.
� ���������������� ������ ��������� �������� SET NAMES,
������������ ��� ������ ��������.

� �������� mysql ���
������������� ��������� SET NAMES ������ ��� ��� �������, ����
�� ������ ������������ ����� ��������, �������� �� �������� �� ���������. ��
������ �������� ����� --default-character-set
� ����������� ������ mysql
��� � ����� ����� �����. ��������, ��������� ���� �����, �������������
��������� ���� ���������� ������� �������� � koi8r ������ ���,
����� �� ��������� mysql:

[mysql]
default-character-set=koi8r

���� �� ����������� ������
mysql � ���������� ����������
(��� ������-�� �� �������������), ��������������� ������������ �������
charset, � �� SET NAMES. ��������:

mysql> charset utf8
Charset changed

������� charset ������ ���������� SET NAMES, �
����� �������� �������� �� ��������� ����� ��������, ������� ������������,
���� mysql �������� �����������
����� ����, ��� ����������� ����������.

������: ������������, ��� column1 ��������� ���
CHAR(5) CHARACTER SET latin2. ���� �� �� ��������
SET NAMES ��� SET CHARACTER SET, �� ���
then for SELECT column1 FROM t ������ �������� ������� ���
�������� column1, ������������ ����� ��������, �������
������������ ���������, ����� ����������. � ������ �������, ���� �� ��������
SET NAMES 'latin1' ��� SET CHARACTER SET latin1
����� ������� ���������� SELECT, ������ ��������������� ��������
latin2latin1 ������ ����� �������� �����������
�������. �������������� ����� ���� � ��������, ���� ������� �������, �������
�� ������������ � ����� ������� ��������.

���� �� �� ������, ����� ������ �������� ����� �������������� �������
�����������, ���������� character_set_results
NULL:

SET character_set_results = NULL;

�������� ��������: � ���������
����� UCS-2 �� ����� �������������� ��� ����� �������� ������������, ���
��������, ��� SET NAMES 'ucs2' �� ��������.

����� ������ �������� ���������� ������� ������ �������� � �����������,
������� ���������� � ������ �����������, ����������� ��� ����������:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

10.5. �������� �����������

��������� ������� �������� ��������� ������� ����������� ������ ��������.

10.5.1. ������������� COLLATE
� SQL-�����������

� ������������ COLLATE �� ������ �������� ����� �������� ��
��������� ����������� ��� ���������. COLLATE �����
�������������� � ��������� ������ ���������� SQL. ������� ��������� �������:

  • ORDER BY:

    SELECT k FROM t1 ORDER BY k COLLATE latin1_german2_ci;
    
  • AS:

    SELECT k COLLATE latin1_german2_ci AS k1 FROM t1 ORDER BY k1;
    
  • GROUP BY:

    SELECT k FROM t1 GROUP BY k COLLATE latin1_german2_ci;
    
  • � ����������� ���������:

    SELECT MAX(k COLLATE latin1_german2_ci) FROM t1;
    
  • DISTINCT:

    SELECT DISTINCT k COLLATE latin1_german2_ci FROM t1;
    
  • WHERE:

    SELECT * FROM t1 WHERE _latin1 'M��ller' COLLATE latin1_german2_ci = k;
    SELECT * FROM t1 WHERE k LIKE _latin1 'M��ller' COLLATE latin1_german2_ci;
    
  • HAVING:

    SELECT k FROM t1 GROUP BY k
             HAVING k = _latin1 'M��ller' COLLATE latin1_german2_ci;
    

10.5.2. ����������� �����������
COLLATE

����������� COLLATE ����� ������� ����������� (����, ���
||), ��� ��������� ��� ��������� ������������:

x || y COLLATE z
x || (y COLLATE z)

10.5.3. �������� BINARY

�������� BINARY �������� ������ ����� ���� � �������� ������.
��� ������� ������ �������� ��������� ���� ����������� ���� � ����, � ��
������ � ������. BINARY ����� ���������� ��������
������� ���� �������������.

mysql> SELECT 'a' = 'A';
    -> 1
mysql> SELECT BINARY 'a' = 'A';
    -> 0
mysql> SELECT 'a' = 'a ';
    -> 1
mysql> SELECT BINARY 'a' = 'a ';
    -> 0

BINARY str ���������� ���
CAST(str AS BINARY).

������� BINARY �� ���������� ������������ ������� �����
��������� ������. ����������� �������, ������������� � ���������
BINARY, ��������� �������� ����������� ������ �������� �������.
������ ����� �������� ����� �������� �����������. ��������, ��������
����������� ��� ������ �������� latin1: latin1_bin,
��� ���, ���� ����� �������� �� ��������� ������� latin1, ���
��� ������� ���������� ������������:

CHAR(10) BINARY
CHAR(10) CHARACTER SET latin1 COLLATE latin1_bin

������ BINARY ��� �������� ������� ���������� �� ������� ��
MySQL 4.1. ������ BINARY ������� �������, ������� �������������
��� �������� ������, �� ���� ������ ������, ������� �� ����� �������� ������
�������� ��� �����������, ��� ���������� �� �� �������� ���������� ������,
������� ����� �������� �����������. ��� ����� ����� ����� ��������� ��������
�� �������� ��������� ���������� ������, �� ��� �� �������� �����, �������
�������� ������, � ��������� ������ �������� ��������� ������������� �������.

������������� CHARACTER SET binary �� �����������
������� CHAR, VARCHAR ��� TEXT
���������� ������� �������������� ��� �������� ��� ������. ��������,
��������� ���� ����������� ������������:

CHAR(10) CHARACTER SET binary
BINARY(10)
VARCHAR(10) CHARACTER SET binary
VARBINARY(10)
TEXT CHARACTER SET binary
BLOB

10.5.4. ��������� �����������
������, ��� ����������� ����������� ������

� ����������� ����������, ��������, ����� ����������� MySQL ����������,
����� ������ �������� ���������. ��������, � ��������� �������, ������ ����
����� ����, ��� ������������ ����� ����������� ������� x:

SELECT x FROM T ORDER BY x;
SELECT x FROM T WHERE x = x;
SELECT DISTINCT x FROM T;

������, ����� ���������� ������������ ��������, �����
������� ���������������. ��������:

SELECT x FROM T WHERE x = 'Y';

��� ������ ������������ ����������� �� �������
x ��� �� �������� ������ 'Y'?

�������� SQL ������ ����� �������, �������� �������
coercibility. � �������� ��� ��������: ���
x'Y' ����� �����������, ������� �����������
����� ���������? ��� ����� ���� ������ ������, �� ��������� �������
��������� ����������� ��������:

  • ����� ����������� COLLATE �����
    0 (�� ����� coercible ������).

  • ������������ ���� ����� � ����������
    ������������� ����� coercibility 1.

  • ����������� �������, ������������ ������������ ��������� ��� ���������
    ���������� ����� coercibility 2.

  • ��������� ������� (������, ������������
    ��������� ���� USER() ���
    VERSION()) ����� coercibility 3.

  • ����������� �������� ����� coercibility 4.

  • NULL ��� ���������, ������� �������� ��
    NULL, ����� coercibility 5.

�������������� �������� coercibility ������� ��� MySQL 5.1.

��� ������� ������ ��������������� ��������� ��������:

  • ���������� ����������� � �����
    ������ �������� coercibility.

  • ���� ��� ������� ����� ��� �� ����� coercibility, �� ��� ������, ����
    ����������� �� �� �� �����.

������:

column1 = 'A' ���������� ����������� column1
column1 = 'A' COLLATE x ���������� ����������� 'A' COLLATE x
column1 COLLATE x = 'A' COLLATE y ������

������� COERCIBILITY() ����� ��������������, ����� ����������
coercibility ���������� ���������:

mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
    -> 0
mysql> SELECT COERCIBILITY(VERSION());
    -> 3
mysql> SELECT COERCIBILITY('A');
    -> 4

10.5.5. ����������� ������ ����
��� ����������� ������ ��������

������ ����� �������� ����� ���� ��� ������� ���������� �����������, ��
������ ����������� ������� � ����� � ������ ����� ������� ��������.
�������������, ��������� ���������� �������� ��������� �� ������, ������ ���
����������� latin2_bin �� ��������� � ������� ��������
latin1:

mysql> SELECT _latin1 'x' COLLATE latin2_bin;
ERROR 1253 (42000): COLLATION 'latin2_bin' is not valid
for CHARACTER SET 'latin1'

10.5.6. ������ ������� �����������

������������, ��� ������� X � ������� T �����
��� �������� ������� latin1:

Muffler
M��ller
MX Systems
MySQL

������������ �����, ��� �������� ������� ��������,
��������� ��������� ����������:

SELECT X FROM T ORDER BY X COLLATE collation_name;

��������� ������� ���������� ����������� � ���������� ������� ��������,
���� �� ���������� ORDER BY � ���������� �������������:

latin1_swedish_ci latin1_german1_ci latin1_german2_ci
Muffler Muffler M��ller
MX Systems M��ller Muffler
M��ller MX Systems MX Systems
MySQL MySQL MySQL

������, ������� �������� ��������� ������� ���������� � ���� �������: U
� ����� ������� ������, ������� � �������� �������� ���
U-umlaut.

  • ������ ������� ���������� ���������
    SELECT, ������������� ������� ����������� Swedish/Finnish,
    ������� �������, ��� U-umlaut ����������� ����� Y.

  • ������ ������� ���������� ��������� SELECT, �������������
    ������� German DIN-1, ������� �������, ��� U-umlaut ����������� � U.

  • ������ ������� ���������� ��������� SELECT, �������������
    ������� German DIN-2 rule, ������� �������, ��� U-umlaut ����������� � UE.

10.6. ��������, �� �������
������������ ��������� ������ ��������

���� ������ ��������� ��������, ������� ����� �� ��������
���������� � ������ ��������.

10.6.1. ������ ����������

MySQL ����� ����� ���������� � �������, ������� ���������� ������. ����
������ �������� �� ������: ����� ����� �������� � ����������� � ����� ������?

��� ������� �������, ������� ����� ������ ����� � ���������� ���������
��������� ��� �����, ����� �������� � ����������� ������ ����� ��, ���
������� � �������� ��������. ��������,
UPPER(X) ���������� ������, ��� ����������
������ � ����������� �������� ������ ��, ��� X. ���
��������� � INSTR(), LCASE(),
LOWER(), LTRIM(), MID(),
REPEAT(), REPLACE(), REVERSE(),
RIGHT(), RPAD(), RTRIM(),
SOUNDEX(), SUBSTRING(), TRIM(),
UCASE()UPPER().

�������� ��������: ������� REPLACE(), � ������� �� ����
������ �������, ������ ���������� ����������� ���������� ����� � ���������
�������������� � �������� ���������.

���� ��������� ���� ��� �������������� ��������� �������� ��������
�������, ��� �� ����� �������� ������ �������� ��� �����������. ��� �����
���� ���������, ��������� ������� CHARSET()
COLLATION(), ������� ������ binary, ����� �������,
��� �� �������� �������� ������:

mysql> SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a');
+---------------------+-----------------------+
| CHARSET(BINARY 'a') | COLLATION(BINARY 'a') |
+---------------------+-----------------------+
|              binary |                binary |
+---------------------+-----------------------+

��� ��������, ������� ���������� �������������� ����� � ����������
��������� ��������� �����, ������� ���������� ������ ��������� SQL ����
����������� ����������� ����������:

  • ���� ���� ����� COLLATE
    X
    , ������������
    X.

  • ���� ���� ������ COLLATE X
    COLLATE Y, ������ ������.

  • �����, ���� ��� ����������� X, �������������
    X.

  • �����, ��������� �� ����� �������� ����������� ������.

��������, � CASE ... WHEN a THEN b WHEN b THEN c COLLATE
X END
����������� � ���������� �����������
X. �� �� ����� ��� UNION,
||, CONCAT(), ELT(),
GREATEST(), IF()LEAST().

��� ��������, ������� ����������������� � ���������� ������, �����
�������� � ����������� ����� ���������� �������� ���������� �����������
������� character_set_connection
collation_connection. ��� ����������� ������ ���
CAST(), CONV(), FORMAT(),
HEX()SPACE().

���� �� �� ������� ������������ ������ �������� ��� �����������
����������, ������������� ��������� ��������, �� ������ ������������ �������
CHARSET() ��� COLLATE(), ����� ��������:

mysql> SELECT USER(), CHARSET(USER()), COLLATION(USER());
+----------------+-----------------+-------------------+
| USER()         | CHARSET(USER()) | COLLATION(USER()) |
+----------------+-----------------+-------------------+
| test@localhost | utf8            | utf8_general_ci   |
+----------------+-----------------+-------------------+

10.6.2. CONVERT()
CAST()

CONVERT() ������������ ������ ������������� ������ �����
���������� �������� ��������. ���������:

CONVERT(expr USING transcoding_name)

� MySQL ����� ������������� ����� ��, ��� ���������������
����� ������� ��������.

�������:

SELECT CONVERT(_latin1'M��ller' USING utf8);
INSERT INTO utf8table (utf8column)
SELECT CONVERT(latin1field USING utf8) FROM latin1table;

CONVERT(... USING ...) ��������� �������� ��������� SQL.

�� ������ ����� ������������ CAST(), ����� �������������
������ � ���� ����� ��������. ���������:

CAST(character_string AS
     character_data_type
     CHARACTER SET charset_name)

������:

SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);

���� �� ����������� CAST() ��� ����, ����� ����������
CHARACTER SET, ����������� � ���������� ����� �������� �
����������� ���������� ����������� �������
character_set_connectioncollation_connection.
���� �� ����������� CAST()CHARACTER SET X,
����������� � ���������� ����� �������� � ����������� X
�������� �� ��������� ����������� ��� X.

�� �� ������ ������������ ����������� COLLATE ������
CAST(), �� �� ������ ������������ ��� �������. �� ����
CAST(... COLLATE ...) ���������, �� CAST(...)
COLLATE ...
���������.

������:

SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

10.6.3. ���������� SHOW
INFORMATION_SCHEMA

��������� ���������� SHOW ������������ ��������������
���������� � ������ ��������. ��� �������� SHOW CHARACTER SET,
SHOW COLLATION, SHOW CREATE DATABASE,
SHOW CREATE TABLESHOW COLUMNS. ��� ����������
������� ����� ������.

INFORMATION_SCHEMA ����� ��������� ������, ������� ��������
����������, �������� ������������ ������������ SHOW. ��������,
������� CHARACTER_SETSCOLLATIONS ��������
����������, ������������ SHOW CHARACTER SET
SHOW COLLATION.

������� SHOW CHARACTER SET ���������� ��� ��������� ������
��������. ��������� �������������� ����������� LIKE, �������
���������, ������� ������ ������ �������� ���������������. ��������:

mysql> SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
| Charset | Description                 | Default collation | Maxlen |
+---------+-----------------------------+-------------------+--------+
| 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      |
+---------+-----------------------------+-------------------+--------+

����� SHOW COLLATION �������� ��� ��������� ������ ��������.
��������� �������������� ����������� LIKE, ������� ���������,
������� ������ ����������� ���������������. ��������:

mysql> SHOW COLLATION LIKE 'latin1%';
+-------------------+---------+----+---------+----------+---------+
| Collation         | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1  |  5 |         |          | 0       |
| latin1_swedish_ci | latin1  |  8 | Yes     | Yes      | 0       |
| latin1_danish_ci  | latin1  | 15 |         |          | 0       |
| latin1_german2_ci | latin1  | 31 |         | Yes      | 2       |
| latin1_bin        | latin1  | 47 |         | Yes      | 0       |
| latin1_general_ci | latin1  | 48 |         |          | 0       |
| latin1_general_cs | latin1  | 49 |         |          | 0       |
| latin1_spanish_ci | latin1  | 94 |         |          | 0       |
+-------------------+---------+----+---------+----------+---------+

SHOW CREATE DATABASE ���������� ����������
CREATE DATABASE, ������� ������� ��� ���� ������:

mysql> SHOW CREATE DATABASE test;
+----------+-----------------------------------------+
| Database | Create Database                         |
+----------+-----------------------------------------+
| test     | CREATE DATABASE `test` /*!40100 DEFAULT |
|          | CHARACTER SET latin1 */                 |
+----------+-----------------------------------------+

���� ������� ����������� COLLATE �� ������������, �������� ��
��������� ����������� ��� ������ �������� �����������.

SHOW CREATE TABLE �������, �� ���������� ����������
CREATE TABLE, ����� ������� ������ �������. ����������� �������
��������� ����� ������������ ������ ��������, � ��������� ������� ��������
���������� ������ ��������.

���������� SHOW COLUMNS ���������� ����������� ��������
������� ����� ���������� ��� SHOW FULL COLUMNS. ������� � ������
������ CHAR, VARCHAR ��� TEXT �����
�����������. �������� � ������ ��-���������� ���� �� ����� ��������
����������� (���������� NULL ���
�������� Collation). ��������:

mysql> SHOW FULL COLUMNS FROM personG
*************************** 1. row ***************************
Field: id
Type: smallint(5) unsigned
Collation: NULL
Null: NO
Key: PRI
Default: NULL
Extra: auto_increment
Privileges: select, insert, update, references
Comment:
*************************** 2. row ***************************
Field: name
Type: char(60)
Collation: latin1_swedish_ci
Null: NO
Key:
Default:
Extra:
Privileges: select, insert, update, references
Comment:

����� �������� �� ������������, �� ��������������� ������ �����������.

10.7. ��������� Unicode

MySQL 5.1 ������������ ��� ������ �������� ��� ���������� ������ Unicode:

  • ucs2, ����� �������� UCS-2 Unicode.

  • utf8, ����� �������� UTF-8 Unicode.

� UCS-2 (�������� ������������� Unicode) ������ ������ ��������������
����������� Unicode-����� �� ������� ������ �������. ��������: LATIN
CAPITAL LETTER A
����� ��� 0x0041, � ��� ��������� ���
������������ ������������������ 0x00 0x41. CYRILLIC
SMALL LETTER YERU
(Unicode 0x044B) ��������� ���
������������ ������������������ 0x04 0x4B. ��� ���������
�������� Unicode � �� �����, ����������, ���������� � Unicode Home Page
(http://www.unicode.org).

� ��������� ����� UCS-2 �� ����� �������������� ��� ����� ��������
������������, ��� ��������, ��� SET NAMES 'ucs2' �� ��������.

UTF-8 (���������������� ������������� Unicode) ������������ �����
�������������� ������ ��������� Unicode ������. ��� ��������� �������� RFC
3629. ���� ������������ UTF-8 ������� � ���, ��� ��������� ������� Unicode,
��������� ������������������ ������ ��������� ����:

  • �������� ��������� �������, ����� � ����������
    ���������� ���� ����.

  • ����������� ����������� � ��������������� �������� ����������� �
    ������������ ������������������: ����������� ��������� ������� (� �������,
    ����������, ������, ������� � ������ �������������� �����), ���������,
    ���������, ���������, ���������, ��������, ��������� � ������.

  • ���������, ��������� � �������� ���������
    ���������� ������������ ������������������.

RFC 3629 ��������� ������������������ �����������, ������� ����� �� ������
�� ������� ������. � ��������� ����� MySQL-��������� ��� UTF-8 �� ��������
������������������ � �������� �������. ������ �������� ��� ����������� UTF-8
����� RFC 2279 � ��������� UTF-8-������������������, ������� ����� �� ������
�� ����� ������. RFC 3629 ��������� RFC 2279 ����������, �� ���� �������
������������������ � ����� � ������ ������� ������ �� ������������.

�����: ����� ��������� ������ �
UTF-8, ����������� VARCHAR ������ CHAR. ����� MySQL
������ ������������� �� ��� ����� ��� ������� ������� � �������
CHAR CHARACTER SET utf8, ������ ��� ��� ������������ ���������
�����. ��������, MySQL ������ ������������� 30 ������ ��� �������
CHAR(10) CHARACTER SET utf8.

10.8. UTF-8 ��� ����������

���������� ������������ ����� ����� ������,
������� ��������� ���� ������ � ����������������� ������, ����������
����������� ���� ������. ����� �������, ����� ��������, ���� ������,
�������������, ������ � ����������� �����-����������� SHOW ���
��� � �������� ������ �����������. ��� ����� ������� ��� ���������� ������ �
INFORMATION_SCHEMA, ������ ��� �� ������� �� �����������
�������� ���������� ������������ �������� ���� ������.

������������� ���������� ������ ������������� ��� �����������:

  • ��� ���������� ������ ���� � ��� �� ����� ������
    ��������. �����, �� ������� SHOW, �� ����������
    SELECT ��� ������ � INFORMATION_SCHEMA �� ��������
    �� ���������, ������ ��� ��������� ������ � ��� �� ����� ������� �����������
    ���� �������� ����� � ��������� ������� ��������.

  • ���������� ������ �������� ��� ������� �� ��� �����. �����
    ������������ �� �������� �������� ������� � �������, ������������
    �� ����������� �����.

����� ������������� ����� �����������, MySQL ��������� ���������� �
������ �������� Unicode, � ������ � UTF-8. ��� �� �������� ������� �����,
���� �� ������� �� ����������� �� ��������� ��� ������� � ��������������
������. �� ���� �� ��� �������, �� ������ �����, ���
���������� ��������� � UTF-8.

���������� ���������� ��������, ��� ������������ �������� �������
USER(), CURRENT_USER(),
SESSION_USER(), SYSTEM_USER(),
DATABASE()VERSION() ����� �� ���������
����� �������� UTF-8.

������ ������������� ���������� ������� character_set_system
� ����� ������ �������� ����������:

mysql> SHOW VARIABLES LIKE 'character_set_system';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| character_set_system | utf8  |
+----------------------+-------+

�������� ����������, ������������ Unicode, �� ��������, ��� ������
���������� ��������� �������� � ����������� ������� DESCRIBE
������ �������� character_set_system �� ���������. ����� ��
����������� SELECT column1 FROM t, ��� column1
��������������� ���������� � ������ ��������, ������������ ���������
���������� ������� character_set_results, ������� ����� ��������
�� ��������� latin1. ���� �� ������, ����� ������ �������
���������� ���������� � ���� ������ ��������, ����������� ����������
SET NAMES, ����� ��������� �������������� ������ ��������.
SET NAMES ������������� character_set_results
������ ��������� ���������� �������. � �������� ������������ ���������
������������ ����� ��������� �������������� ����� ��������� ���������� �
�������. ��� ����� ���������� ��� ������������, �� ��� ����� �� ������
�������� ��� ���� ���������.

���� character_set_results ���������� � NULL,
������� �������������� �� ����������� � ���������� ������������, ���������
�������������� ����� �������� (�����, ������������
character_set_system).

��������� �� �������, ������������ ��������, ������������� � �����
�������� ������������ �������������, ��� � ������ � �����������.

���� �� ����������� (��������) ������� USER() ��� ���������
��� ���������� ������ ��������� ����������, ������ �� �����������. MySQL
��������� �������������� �������������� ��� ���.

SELECT * FROM Table1 WHERE USER() = latin1_column;

��� �������� ������, ��� ���������� latin1_column
������������� ������������� � UTF-8 ����� ����������.

INSERT INTO Table1 (latin1_column) SELECT USER();

��� �������� ������, ��� ���������� USER() �������������
������������� � latin1 ����� �����������. ��������������
�������������� ��������� ��� �� �� ���������, �� ������ �������� ��������� �
����� ������� ������.

���� �������������� �������������� �� � SQL ���������, ��������
SQL-��������� �������, ��� ������ ����� �������� (� �������� ��������������
��������) ������������ Unicode. ������� ����������� ��� Unicode �����
����������� ��� ��������� � ��-Unicode ��������.

10.9.
�������������� ������ �������� �������

����� ��������������� �������� ��� �� �������� ��������� �������, �����
������������ ������������� ����� ��������, ��������� ALTER
TABLE
. ��� ��������� �������������� ���� �� ���������
������� ������ �����������:

  • ���� ������� ����� �������� ��� ������
    (BINARY, VARBINARY, BLOB), ���
    ��������, ������� �� ��������, ������ ���� ������������, ��������� ���������
    ����� ��������. ���� �� ����������� �������� �������, ����� ���������
    ���������� � ���������� ������� ��������, MySQL �� ����� �������� �������
    ������, ������� ����� �������� ��������� � �� �����
    ��������������� ������ ���������.

  • ���� ������� ����� �� �������� ��� ������ (CHAR,
    VARCHAR, TEXT), ���������� ������ ���� ������������
    � ������ �������� �������, � �� � ��������� ������ ������ ��������. ����
    ���������� ������������ � ���� ������ ��������, �� ������ ���������������
    �������, ����� ������� ������������ �������� ��� ������, � ����� � ��
    ��������� ������� � ����������� ������� ��������.

������������, ��� ������� t ����� �������� �������
col1, ������������ ��� BINARY(50). ��� �������,
��� ���������� � ������� ������������, ��������� ��������� ����� ��������, ��
������ ��������������� ��� � �� �������� �������, ������� ����� ������ �����
��������. ��������, ���� col1 �������� �������� �������
������������� ������ � ��������� ������ �������� (greek), ��
������ ��������������� ��� ��������� �������:

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET greek;

������������, ��� ������� t ����� �� �������� �������
col1, ������������ ��� CHAR(50) CHARACTER SET latin1
, �� �� ������ ��������������� ���, ����� ������������
utf8 ���, ����� �� ����� ��������� �������� �� ������ ������.
��������� ���������� ��������� ���:

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8;

�������������� ����� ���� � ��������, ���� ������� �������� �������,
������� �� ���������� � ����� ������� ��������.

����������� ������ ����������, ���� �� ������ ������ ������� �� MySQL 4.0
��� �����, ��� �� �������� ������� �������� ��������, ������� ����������
������������ � ������ ��������, �������� �� ��������� �� ��������� ������
�������� �������. ��������, ���������� ��������� ����� �� ��������� ��������
sjis � ������� ���� ��� ���, ��� �������� �� ��������� �����
�������� MySQL latin1. �������� ������������� �������, �����
������������ ��������������� ����� ��������, �� �������������� ��� ���������.
������������, ��� �������� �� ��������� ����� �������� ������� ���
latin1, � col1 ��������� ��� CHAR(50),
�� �������� �������� � sjis. ������ ��� ������ �������������
������� � �������� ��� ������, ������� ������� ������������ ���������� ������
�������� ��� ����, ����� ��������� ����� ���������� ��������������:

ALTER TABLE t MODIFY col1 BINARY(50);

��������� ��� ������ ������������� ������� � �� �������� ��� ������ �
��������������� ������� ��������:

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;

��� ��������� �������, ����� ������� �� ���������� � ������������ ����
INSERT ��� UPDATE ����� ���������� �� MySQL 4.1
��� �����. � ���� ������ MySQL �������� �� ����� �������� � �������,
������������ latin1, � ������� ����� ��������� ����� ��������
sjislatin1, � ������ �� �����
���� ������������ ���������.

���� �� ���������� �������� ��� �������� ������� �������������, �� ������
����� ���������� ��, ��� ��������� ������� � ������� ALTER
TABLE
. ��������, ���� �� ���������� NOT NULL � �����
�������� DEFAULT, �� ������ ����� ���������� �� � ����������
ALTER TABLE. ����� ����������� � ���������� ����������� �������
�� ����� �������� ��� ��������.

10.10. ������ �������� � �����������,
������� ������������ MySQL

MySQL ������������ ����� 70 ����������� ��� ����� 30 ������� ��������.
���� ������ ���������, ������� ������ �������� MySQL ������������. �������
���� ��������� ��� ������ ������ ��������� ������� ��������. ��� �������
������ ��������, ����������� ���������� �����������.

�� ������ ������ ������� � ������ ��������� ������ �������� � �� ��������
�� ��������� ����������� ����������� SHOW CHARACTER SET:

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+
| Charset  | Description                 | Default collation   |
+----------+-----------------------------+---------------------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |
| dec8     | DEC West European           | dec8_swedish_ci     |
| cp850    | DOS West European           | cp850_general_ci    |
| hp8      | HP West European            | hp8_english_ci      |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |
| latin1   | cp1252 West European        | latin1_swedish_ci   |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |
| ascii    | US ASCII                    | ascii_general_ci    |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |
| cp1250   | Windows Central European    | cp1250_general_ci   |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |
| cp866    | DOS Russian                 | cp866_general_ci    |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |
| macce    | Mac Central European        | macce_general_ci    |
| macroman | Mac West European           | macroman_general_ci |
| cp852    | DOS Central European        | cp852_general_ci    |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |
| cp1256   | Windows Arabic              | cp1256_general_ci   |
| cp1257   | Windows Baltic              | cp1257_general_ci   |
| binary   | Binary pseudo charset       | binary              |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |
+----------+-----------------------------+---------------------+

10.10.1. ������ �������� Unicode

MySQL ����� ��� ������ �������� Unicode. �� ������ ��������� �����
�������������� ��� 650 ������, ��������� ��� ������ ��������.

  • ����������� ucs2 (UCS-2 Unicode):

    • ucs2_bin

    • ucs2_czech_ci

    • ucs2_danish_ci

    • ucs2_esperanto_ci

    • ucs2_estonian_ci

    • ucs2_general_ci (default)

    • ucs2_hungarian_ci

    • ucs2_icelandic_ci

    • ucs2_latvian_ci

    • ucs2_lithuanian_ci

    • ucs2_persian_ci

    • ucs2_polish_ci

    • ucs2_roman_ci

    • ucs2_romanian_ci

    • ucs2_slovak_ci

    • ucs2_slovenian_ci

    • ucs2_spanish2_ci

    • ucs2_spanish_ci

    • ucs2_swedish_ci

    • ucs2_turkish_ci

    • ucs2_unicode_ci

  • ����������� utf8 (UTF-8 Unicode):

    • utf8_bin

    • utf8_czech_ci

    • utf8_danish_ci

    • utf8_esperanto_ci

    • utf8_estonian_ci

    • utf8_general_ci (default)

    • utf8_hungarian_ci

    • utf8_icelandic_ci

    • utf8_latvian_ci

    • utf8_lithuanian_ci

    • utf8_persian_ci

    • utf8_polish_ci

    • utf8_roman_ci

    • utf8_romanian_ci

    • utf8_slovak_ci

    • utf8_slovenian_ci

    • utf8_spanish2_ci

    • utf8_spanish_ci

    • utf8_swedish_ci

    • utf8_turkish_ci

    • utf8_unicode_ci

�������� ��������, ��� � ������������ ucs2_roman_ci
utf8_roman_ci IJ ���������
��������������, ����� ��� � ���� UV.

����������� ucs2_hungarian_ci
utf8_hungarian_ci ���� ��������� � MySQL 5.1.5.

MySQL ������������ ����������� utf8_unicode_ci ��������
Unicode Collation Algorithm (UCA), ���������� ��

http://www.unicode.org/reports/tr10/. ����������� ����������
version-4.0.0 UCA weight keys:
http://www.unicode.org/Public/UCA/4.0.0/allkeys-4.0.0.txt.
��������� ���������� ���������� utf8_unicode_ci, �� ��� �����
����� � ��� ucs2_unicode_ci.

� ��������� ����� ����������� utf8_unicode_ci ����� ������
��������� ��������� ��� Unicode Collation Algorithm. ��������� ������� ��� ��
�� ��������������. ����� ��������� �� �������������� ����������� �����.
��� ������������ ������ ����� �� ����������� � ��������� ��������������������
����� � ������, ���� Udmurt, Tatar, Bashkir � Mari.

������� �������� � utf8_unicode_ci: ��� ������������
����������, �� ���� ����� ���� ������ ������������ ��� ������ �����������
������ ��������. ��������, � �������� � ��������� ������ ������
�� ����� ss.

utf8_general_ci �����������, ������� �� ������������
����������. ��� ����� ������ ������ �������-����������� ��������� �����
���������. ��� ��������, ��� ��������� ��� �����������
utf8_general_ci �������, �� ������� ����� ����������, ���
��������� ��� utf8_unicode_ci.

��������, ��������� ��������� ����� �
utf8_general_ci � � utf8_unicode_ci:

�� = A
�� = O
�� = U

�������� ����� �������������: ��� �������� �������� ���
utf8_general_ci:

�� = s

� �� �����, ��� ��� ������� ��� utf8_unicode_ci:

�� = ss

MySQL ������������ ������������� ��� ����� ����������� ��� ������ ��������
utf8 ������, ���� ������������ � utf8_unicode_ci
�� �������� ������ ��� �����. ��������, utf8_unicode_ci ��������
��������� ��� German � French, � ������ ��� ������� ����������� ���������
����������� ����������� utf8 ��� ���� ���� ������.

utf8_general_ci ����� ���������������� ��� German � French
�� ����������� ����, ��� �� ����� s, ��
ss. ���� ��� ��������� ��� ����� ���������� ���������, ��
���������� utf8_general_ci, ������ ��� ��� �������. �����,
����������� utf8_unicode_ci, ������ ��� ��� ����� �����.

utf8_swedish_ci, ������� ������ ������������� ��� �����
������������ utf8, ������� �� utf8_unicode_ci
��������������� ��������� �����. ��������, � Swedish ��������� �����
��������, ������� ����������� ��� German ��� French:

�� = Y < ��

����������� utf8_spanish_ciutf8_spanish2_ci
������������� ������������ � ������������� ����������, ��������������. �
����� ������������ �� (n-tilde) ��������� ������ �����
no. ����� ����, ��� ������������ ����������
ch ��������� ������ ����� cd, �
ll ��������� ������ ����� lm

10.10.2. ������������������ ������ ��������

������������������ ������ �������� ��������� �����������
������������������ ������, ���� French, Spanish, Catalan, Basque, Portuguese,
Italian, Albanian, Dutch, German, Danish, Swedish, Norwegian, Finnish,
Faroese, Icelandic, Irish, Scottish � English.

  • ����������� ascii (US ASCII):

    • ascii_bin

    • ascii_general_ci (�������� �� ���������)

  • ����������� cp850 (DOS West European):

    • cp850_bin

    • cp850_general_ci (�������� �� ���������)

  • ����������� dec8 (DEC Western European):

    • dec8_bin

    • dec8_swedish_ci (�������� �� ���������)

  • ����������� hp8 (HP Western European):

    • hp8_bin

    • hp8_english_ci (�������� �� ���������)

  • ����������� latin1 (cp1252 West European):

    • latin1_bin

    • latin1_danish_ci

    • latin1_general_ci

    • latin1_general_cs

    • latin1_german1_ci

    • latin1_german2_ci

    • latin1_spanish_ci

    • latin1_swedish_ci (�������� �� ���������)

    latin1 �������� �� ��������� ����� ��������.
    MySQL latin1 ������������ ����� ��� �� ����� ��������, ��� �
    Windows cp1252. ��� ��������, ��� ��� �����������
    ISO 8859-1 ��� IANA (Internet Assigned Numbers Authority)
    latin1, �� IANA latin1 ������������ ����� �����
    0x800x9f ��� ��������������
    � �� �����, ��� cp1252 �, �������������, MySQL
    latin1 ��������� ������� ��� ��� �������. ��������,
    0x80 ���� Euro. ��� ��������������
    ������� � cp1252 MySQL ����������� 0x81 � Unicode
    0x0081, 0x8d0x008d,
    0x8f0x008f, 0x90
    0x00900x9d0x009d.

    ����������� latin1_swedish_ci ��� �������� �� ���������,
    �������, ��������, ������������ ������������ ���������� MySQL. ���� �����
    ��������, ��� ��� �������� �� �������� ����������� Swedish/Finnish, �������
    ����� � �����, ��� �� ����������� � ���� �����������.

    ����������� �������� �� latin1_german1_ci
    latin1_german2_ci �� ���������� DIN-1 � DIN-2, ��� DIN ��������
    Deutsches Institut
    f��r Normung
    (�������� ���������� ANSI, � �����). DIN-1
    ���������� ��������� ������������, � DIN-2
    ���������� ������������ ����������� �����������.

    • ������� latin1_german1_ci (����������):

      �� = A
      �� = O
      �� = U
      �� = s
      
    • ������� latin1_german2_ci (����������� �����������):

      �� = AE
      �� = OE
      �� = UE
      �� = ss
      

    � ����������� latin1_spanish_ci
    �� (n-tilde) ��������� ������ �����
    letter between no.

  • ����������� macroman (Mac West European):

    • macroman_bin

    • macroman_general_ci (�������� �� ���������)

  • ����������� swe7 (7bit Swedish):

    • swe7_bin

    • swe7_swedish_ci (�������� �� ���������)

10.10.3.
��������������������� ������ ��������

MySQL ������������ ��������� ��� ������� ��������, ������������ � Czech
Republic, Slovakia, Hungary, Romania, Slovenia, Croatia � Poland.

  • ����������� cp1250
    (Windows Central European):

    • cp1250_bin

    • cp1250_croatian_ci

    • cp1250_czech_cs

    • cp1250_general_ci (�������� �� ���������)

    • cp1250_polish_ci

  • ����������� cp852 (DOS Central European):

    • cp852_bin

    • cp852_general_ci (�������� �� ���������)

  • ����������� keybcs2 (DOS Kamenicky Czech-Slovak):

    • keybcs2_bin

    • keybcs2_general_ci (�������� �� ���������)

  • ����������� latin2 (ISO 8859-2 Central European):

    • latin2_bin

    • latin2_croatian_ci

    • latin2_czech_cs

    • latin2_general_ci (�������� �� ���������)

    • latin2_hungarian_ci

  • ����������� macce (Mac Central European):

    • macce_bin

    • macce_general_ci (�������� �� ���������)

10.10.4. ��������������� �
��������������� ������ ��������

���������������� � ��������������� ������ ��������, �������������� MySQL,
�������� Armenian, Arabic, Georgian, Greek, Hebrew � Turkish.

  • ����������� armscii8
    (ARMSCII-8 Armenian):

    • armscii8_bin

    • armscii8_general_ci (�������� �� ���������)

  • ����������� cp1256 (Windows Arabic):

    • cp1256_bin

    • cp1256_general_ci (�������� �� ���������)

  • ����������� geostd8 (GEOSTD8 Georgian):

    • geostd8_bin

    • geostd8_general_ci (�������� �� ���������)

  • ����������� greek (ISO 8859-7 Greek):

    • greek_bin

    • greek_general_ci (�������� �� ���������)

  • ����������� hebrew (ISO 8859-8 Hebrew):

    • hebrew_bin

    • hebrew_general_ci (�������� �� ���������)

  • ����������� latin5 (ISO 8859-9 Turkish):

    • latin5_bin

    • latin5_turkish_ci (�������� �� ���������)

10.10.5. ���������� ������ ��������

���������� ������ �������� ���������� Estonian, Latvian � Lithuanian.

  • ����������� cp1257 (Windows Baltic):

    • cp1257_bin

    • cp1257_general_ci (�������� �� ���������)

    • cp1257_lithuanian_ci

  • ����������� latin7 (ISO 8859-13 Baltic):

    • latin7_bin

    • latin7_estonian_cs

    • latin7_general_ci (�������� �� ���������)

    • latin7_general_cs

10.10.6. ������ �������� ���������

������ �������� � ����������� ��������� ��� ������������� �
Belarusian, Bulgarian, Russian � Ukrainian.

  • ����������� cp1251 (Windows Cyrillic):

    • cp1251_bin

    • cp1251_bulgarian_ci

    • cp1251_general_ci (�������� �� ���������)

    • cp1251_general_cs

    • cp1251_ukrainian_ci

  • ����������� cp866 (DOS Russian):

    • cp866_bin

    • cp866_general_ci (�������� �� ���������)

  • ����������� koi8r (KOI8-R Relcom Russian):

    • koi8r_bin

    • koi8r_general_ci (�������� �� ���������)

  • ����������� koi8u (KOI8-U Ukrainian):

    • koi8u_bin

    • koi8u_general_ci (�������� �� ���������)

10.10.7. ��������� ������ ��������

��������� ������ ��������, ������� ������������ �����, �������� Chinese,
Japanese, Korean � Thai. ��� ����� ���� ���������. ��������, ��������� ������
������ ������ ������ ��������� ��������.

  • ����������� big5 (Big5
    Traditional Chinese):

    • big5_bin

    • big5_chinese_ci (�������� �� ���������)

  • ����������� cp932 (SJIS for Windows Japanese):

    • cp932_bin

    • cp932_japanese_ci (�������� �� ���������)

  • ����������� eucjpms (UJIS for Windows Japanese):

    • eucjpms_bin

    • eucjpms_japanese_ci (�������� �� ���������)

  • ����������� euckr (EUC-KR Korean):

    • euckr_bin

    • euckr_korean_ci (�������� �� ���������)

  • ����������� gb2312 (GB2312 Simplified Chinese):

    • gb2312_bin

    • gb2312_chinese_ci (�������� �� ���������)

  • ����������� gbk (GBK Simplified Chinese):

    • gbk_bin

    • gbk_chinese_ci (�������� �� ���������)

  • ����������� sjis (Shift-JIS Japanese):

    • sjis_bin

    • sjis_japanese_ci (�������� �� ���������)

  • ����������� tis620 (TIS620 Thai):

    • tis620_bin

    • tis620_thai_ci (�������� �� ���������)

  • ����������� ujis (EUC-JP Japanese):

    • ujis_bin

    • ujis_japanese_ci (�������� �� ���������)

10.10.7.1. ����� �������� cp932

� �� ��� ������ ����� cp932?

� MySQL ����� �������� sjis �������������
Shift_JIS ������������� IANA, ������� ������������ �������
JIS X0201 � JIS X0208 (��.

http://www.iana.org/assignments/character-sets).

������, �������� SHIFT JIS ��� ������������
������ ����� ����� ��������������, � ��� ����� �������� ����������
Shift_JIS, ������� ���������� ���������� ������������. ������,
������ ����������, ������� � ������!

��������, SHIFT JIS, �������������� � Japanese
Windows, ������������ ���������� Shift_JIS �� Microsoft, � ���
������ �������� Microsoft Windows Codepage: 932 ���
cp932. � ���������� � ��������, ��������������
Shift_JIS, cp932 ������������ ������� ����������
���� ����������� � ��������� �������� NEC � ����������� �������� IBM.

����� �������� ������������� �������� �������� ��� ������������� ����
�������� ����������. ��� �������� ������������ �� ��������� ��������:

  • MySQL ������������� ��������������� ������ ��������.

  • ������ �������� ������������� ����� Unicode (ucs2).

  • ����� �������� sjis �� ������������ ��������������
    ���� �������� ����������.

  • ������� ��������� ������ �������������� �� ��� �����������
    SHIFT JIS � Unicode, � ��������� �������
    ������������� � Unicode ��-�������, � ����������� �� ������� ��������������.
    MySQL ������������ ������ ���� �� ���� ������.

����� �������� MySQL cp932 ����������, �����
������ ��� ��������.

��������� MySQL ������������ �������������� ������ ��������, �����
�������� IANA Shift_JIS �� cp932: ��� ��� ���������
������ ��������, ������ ��� ��� ������������ ������ ������� ��������������.

� � ��� ������� ����� cp932
sjis?

����� �������� cp932 ����������
�� sjis ���������:

  • cp932 ������������ ����������� �
    ��������� ������� NEC, � ����� ����������� ������� �� IBM.

  • ��������� ������� � cp932 ����� ��� ��������� ����, ���
    �� ������� ����������������� � �� �� ����� Unicode-�����. ��� ��������������
    �� Unicode ������� � cp932 ���� �� ����� ������ ���� ������. ���
    ����� ������������ �������, ������������� Microsoft (����������� ��

    http://support.microsoft.com/kb/170559/EN-US/).

    ������� �������������� �������� �������� ���:

    • ���� ������ ��������� � JIS X 0208 � � �����������
      �������� NEC, ����������� ��� �� JIS X 0208.

    • ���� ������ ��������� � ����������� �������� NEC � � �����������
      �������� IBM, ����������� ��� �� ����������� �������� NEC.

    • ���� ������ ��������� � ��������� �������� IBM � � �����������
      �������� IBM, ����������� ��� �� ����������� �������� IBM.

    �������, ���������� ��
    http://www.microsoft.com/globaldev/reference/dbcs/932.htm
    ������������ ���������� ������������ �������� Unicode ��������
    cp932. ��� ������ ������� � ��������� cp932, ���
    �������� ���������� ���������������� ���, �� ������������ ���������������
    ��� �� Unicode (ucs2). ��� ������ ������� � ������������
    ��������� � ����� ������� ������� �������� ���������� ��������
    cp932, ������� ���������� � ��� ���� ����. ������ �� ����� �����
    ������� �������� ��� � ��������, ������� ���������� �������� Unicode ���
    ������� �� �������� cp932, ������� ���������� � ��� ����.

    ��������� ������ ����� ������ �������. ��� ������������� �����������
    ��� ��������� ������� ��������:

    • ����������� ������� NEC:

      http://www.microsoft.com/globaldev/reference/dbcs/932/932_87.htm
      
    • ��������� NEC ����������� ������� IBM:

      http://www.microsoft.com/globaldev/reference/dbcs/932/932_ED.htm
      
      http://www.microsoft.com/globaldev/reference/dbcs/932/932_EE.htm
      
    • ��������� ������� IBM:

      http://www.microsoft.com/globaldev/reference/dbcs/932/932_FA.htm
      
      http://www.microsoft.com/globaldev/reference/dbcs/932/932_FB.htm
      
      http://www.microsoft.com/globaldev/reference/dbcs/932/932_FC.htm
      
  • cp932 ������������ �������������� ������������
    ������������� �������� � ���������� � eucjpms � ������ ��������
    � ��������������� sjis/ujis. ����������� ��

    http://www.opengroup.or.jp/jvc/cde/sjis-euc-e.html.

��� ��������� ��������, �������������� � � �� ucs2 �������
��� sjiscp932. ��������� �������
������������ ��� ��������.

�������������� � ucs2:

sjis
/cp932��������
sjis -> ucs2
��������������

cp932
->ucs2 ��������������
5C 005C 005C
7E 007E 007E
815C 2015 2015
815F 005C FF3C
8160 301C FF5E
8161 2016 2225
817C 2212 FF0D
8191 00A2 FFE0
8192 00A3 FFE1
81CA 00AC FFE2

�������������� �� ucs2:

ucs2
��������
ucs2
-> sjis ��������������
ucs2 -> cp932
��������������
005C 815F 5C
007E 7E 7E
00A2 8191 3F
00A3 8192 3F
00AC 81CA 3F
2015 815C 815C
2016 8161 3F
2212 817C 3F
2225 3F 8161
301C 8160 3F
FF0D 3F 817C
FF3C 3F 815F
FF5E 3F 8160
FFE0 3F 8191
FFE1 3F 8192
FFE2 3F 81CA

������������ ����� �������� ������� �������� ������ �����, ���
������������� ����� --character-set-client-handshake (���
--skip-character-set-client-handshake) ����� ������ ������.

10.11. MySQL 5 FAQ: ��������� ������� �������� CJK

���� ����� �������� ���������� �� ����� ��������� MySQL � ���������
�������� ������������ ������� ��������� � CJK (Chinese-Japanese-Korean).

10.11.1:
� ������� ������� CJK � ���
�������. ������ SELECT ���������� �� ��� �������
??

��� �������� ������ ��-�� ��������� � MySQL, ������� �� �������������
���������� ��������� ��� ���������� ��������� ��� ������������ �������.
������� ��������� ����� ���� ��� ����������� ���� ����� �������:

  • ���������� ������ MySQL
    . ����������� ���������� SELECT
    VERSION();
    ��� �����.

  • ���������, ��� ���� ������ ����������
    ���������� ����������� ����� ��������.
    .

    ���� ����� ������, ��� ����� �������� ������������ ������ ����� ��, ���
    ����� �������� ������� ������������ ��� ����� �����������. ������, ��� ���
    ������������� �����������. �� ������ �������������� � ����, ��������
    ��������� SHOW CREATE TABLE tablename, �
    ����� ��������� ��� ����������:

    SELECT character_set_name, collation_name FROM information_schema.columns
           WHERE table_schema = your_database_name AND
           table_name = your_table_name AND column_name = your_column_name;
    
  • ���������� ����������������� ��������
    ������� ��� ��������, ������� �� ������������ ���������.
    .

    �� ������ �������� ��� ���������� ��� �������
    column_name � �������
    table_name, ��������� ��������� ������:

    SELECT HEX(column_name)
           FROM table_name;
    

    3F �������� ������ ?. ��� ��������, ���
    ? �������� ��������, ���������� ����������� � �������. ���
    �������� ����� ��������� ��-�� �������� ��� �������������� ��������������
    ������� �� ������ ������ �������� ������������ �� �������� ������ ��������.

  • ��������������, ��� ��������� �����������
    ���� � �������, �� ���� ����� �� ��������� literal (���
    _introducer hexadecimal-value), �� ��������� �
    ���������� ������ literal
    .

    ��������, �������� ������
    Katakana
    Pe
    (���') ���������� �� ���� CJK ������� ��������, � ����� ��������
    0x30da. ����� ��������� ����������� ���� � ������� ��� �����
    �������, ����������� ���� ������:

    SELECT '���' AS `���`; /* or SELECT _ucs2 0x30da; */
    

    ���� ��������� �� �����, ����������� ���� � ������� ��������� �������.

  • ��������������, ��� �������� �� � �����
    ��������� ��� ������ ���������� ����������, � ������ � MySQL
    .

    ����������� ��������� ������������ mysql
    (� Windows: mysql.exe), ����� ��������� ���
    ������. ���� mysql ���������� ��� ���������, ��
    ���� ���������� ��������� ����� �� ������, �� ��������, ��������, ��-��
    ���������� ��������� �������.

    ����� ��������, ������ ���� ��������� ���������, ����������� ����������
    SHOW VARIABLES ����� ������� ������ �������� �� ��,
    ��� ������������ �����:

    mysql> SHOW VARIABLES LIKE 'char%';
    +--------------------------+----------------------------------------+
    | Variable_name            | Value                                  |
    +--------------------------+----------------------------------------+
    | character_set_client     | utf8                                   |
    | character_set_connection | utf8                                   |
    | character_set_database   | latin1                                 |
    | character_set_filesystem | binary                                 |
    | character_set_results    | utf8                                   |
    | character_set_server     | latin1                                 |
    | character_set_system     | utf8                                   |
    | character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
    +--------------------------+----------------------------------------+
    8 rows in set (0.03 sec)
    

    ��� �������� ��������� ��������� ������ �������� ���
    ������������-�������������� ������������ (�������� �������� �� �������������
    utf8 Unicode), ���������� � �������� �� ������
    (latin1 �������� ������� �������� �������� ������ � ���������
    �� ��������� ��� MySQL).

    ���� Unicode (������ ������� utf8 �� Unix � ucs2
    � Windows) �������������� ��� Latin, ��� ����� �� ��, ��� ���� �������
    ������������ ������� ������������ ����� �����. ����� ������������� Windows
    �������, ��� ����� �������� Microsoft, ���� cp932 ��� Japanese
    Windows, �������� �� �����.

    ���� �� �� ������ ��������� ����������� ��������� �������, � �� ������� ��
    ������, ����� ��� �������� ���������, �� �������� �������� ����� �������� ��
    ����� ��� ������, � ������� �� ���������� (euckr = Korea;
    gb2312 ��� gbk = People’s Republic of China;
    big5 = Taiwan; sjis,
    ujis, cp932 ��� eucjpms = Japan;
    ucs2 or utf8 = ��� ������). ������ ����������
    �������� ������ ��������� ��������� ������������, ����������� � �����������.
    ������� ������� ����������, ������� ���������� ��� ��� �����:
    SET NAMES. ��������:

    SET NAMES 'big5';
    

    ���� ������ ��������� ���������, �� ������ ������ ��� ����������,
    ���������� my.cnf ��� my.ini. �������� �� ����� ��
    ��������� ������, ��������� �� ���:

    [mysqld]
    character-set-server=big5
    
    [client]
    default-character-set=big5
    

    ����� ��������, ��� ������� �������� � ���������� ������������ API,
    ������������ � ����� ���������� ���������.

10.11.2:
����� ��������� (GB) ������
�������� �������� MySQL?

MySQL ������������ ��� ����� �������� GB
GB (
Guojia Biaozhun
���
������������� �������) ������
��������, ������� �������� ������������ � ���: gb2312
gbk. ������ ���� ������� ��������� ������� gbk
gb2312, � ��� �������� � ����������� �������, ������ ���
gbk �������� ������������� gb2312, �� � ��������
����� ��� ������� ��������� ������ ��������� �������, � ��� �� �������� (��.
���� #16072).

����� �� ������� ���������� �����, ����� ������� �������� ��������� �
gb2312 ��� gbk � ��������� ����������� ����������.
����������, ��������� ��� ������ ����� ���������� �� ������� �
gb2312 ��� gbk.

  • ��� ������ ���������� �������� gb2312,
    ������������� �������� ����������� gb2312_chinese_ci:
    http://d.udm.net/bar/~bar/charts/gb2312_chinese_ci.html.

  • MySQL gbk � ����������������
    Microsoft code page 936
    . ��� ���������� �� ������������
    gbk ��� �������� A1A4 (middle dot),
    A1AA (em dash), A6E0-A6F5A8BB-A8C0.
    ��� ��������� ���������� �������� ��.

    http://recode.progiciels-bpi.ca/showfile.html?name=dist/libiconv/gbk.h.

  • ��� ��������� ���������� ����������� gbk/Unicode ��.

    http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT
    .

  • ��� ��������� ���������� MySQL-�������� gbk ��.

    http://d.udm.net/bar/~bar/charts/gbk_chinese_ci.html.

10.11.3:
����� �������� � ������ ����� ���
������ � ��������� ������� �������� Big5?

MySQL ������������ ����� �������� Big5, ������� �������� ����� � ��������
� �� T������ (Republic of China). MySQL big5 � ����������������
������� �������� Microsoft 950, ������� ����� ������ �� ������������ �����
�������� big5. ����� ������� �� ���� ����� ��������, ������� �
MySQL 4.1.16/5.0.16 (� ���������� ����� #12476). ��������, ��������� ���������� �������� �
������� ������� MySQL, �� �� � ������ �������:

mysql> CREATE TABLE big5 (BIG5 CHAR(1) CHARACTER SET BIG5);
Query OK, 0 rows affected (0.13 sec)
mysql> INSERT INTO big5 VALUES (0xf9dc);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM big5;
+------+
| big5 |
+------+
| �̡  |
+------+
1 row in set (0.02 sec)

������� � ���������� ���������� HKSCS ���� ����������������.
��, ��� ��������� � ���� ����������, ����� ����� ���������� ������������
�������� ��� ����� #13577
.

10.11.4:
������ �������� ��������������
������ �������� ������ �������?

MySQL ������������ ������ �������� sjis, ujis,
cp932eucjpms ��� ��, ��� Unicode. �����
����������� ������� � ���, ����� ��������������� ����� �������� ��������.
��������, ���� Unix-������ (������ � sjis ��� ujis)
� Windows-������ (� ����� ����� ������ ����������� cp932).

� ��������� ������� �������������� ������� ucs2 ������������
��������, � ������� sjis, cp932, ujis
eucjpms ������������ ���������, �� ���� ��������� 4 �������
������������ ����������������� ���������, ����� �� �����������
CONVERT(ucs2) ��� ���������� �������, ���������� ��������
ucs2, ������� � sjis, cp932,
ujis ��� eucjpms.

��� ������� ucs2 sjis cp932 ujis eucjpms
BROKEN BAR 00A6 3F 3F 8FA2C3 3F
FULLWIDTH BROKEN BAR FFE4 3F FA55 3F 8FA2
YEN SIGN 00A5 3F 3F 20 3F
FULLWIDTH YEN SIGN FFE5 818F 818F A1EF 3F
TILDE 007E 7E 7E 7E 7E
OVERLINE 203E 3F 3F 20 3F
HORIZONTAL BAR 2015 815C 815C A1BD A1BD
EM DASH 2014 3F 3F 3F 3F
REVERSE SOLIDUS 005C 815F 5C 5C 5C
FULLWIDTH «» FF3C 3F 815F 3F A1C0
WAVE DASH 301C 8160 3F A1C1 3F
FULLWIDTH TILDE FF5E 3F 8160 3F A1C1
DOUBLE VERTICAL LINE 2016 8161 3F A1C2 3F
PARALLEL TO 2225 3F 8161 3F A1C2
MINUS SIGN 2212 817C 3F A1DD 3F
FULLWIDTH HYPHEN-MINUS FF0D 3F 817C 3F A1DD
CENT SIGN 00A2 8191 3F A1F1 3F
FULLWIDTH CENT SIGN FFE0 3F 8191 3F A1F1
POUND SIGN 00A3 8192 3F A1F2 3F
FULLWIDTH POUND SIGN FFE1 3F 8192 3F A1F2
NOT SIGN 00AC 81CA 3F A2CC 3F
FULLWIDTH NOT SIGN FFE2 3F 81CA 3F A2CC

������ ����������� ��� ����� �������:

ucs2 sjis cp932
NOT SIGN 00AC 81CA 3F
FULLWIDTH NOT SIGN FFE2 3F 81CA

��� ��������, ��� MySQL ��������������� NOT SIGN (Unicode
U+00AC) � sjis 0x81CA � �
cp932 3F (3F ��� ��� � ���� ����
������� (?), �� ���� ��, ��� ������ ������������,
����� �������������� �� ����� �����������.

10.11.5:
��� � ������ ������,
���� � ���� ��������������� SJIS 81CAcp932?

������� ��������� ������ ������������ �����: ����� ����� ��������� ��
��������� �������������� ���, ����� 81CA (NOT SIGN)
sjis ���������� 81CA (FULLWIDTH NOT SIGN)
cp932. ��������� ��� ����� ��������� �����������.

10.11.6:
��� MySQL ������������ ���� Yen
(��)?

�������� ��������� ������, ��� ��������� ������ �������� ������� ��������
(sjiseuc) ������������ 5C ���
reverse solidus ( �� �� backslash),
� ������ ������������ ��� ��� ���� ���� (��).

MySQL ������� ������ �� ����� ������� JIS (Japanese Industrial Standards).
� MySQL 5C ������ �������� ����
()
.

10.11.7:
MySQL ��������� ������ ���������
����� ��������, ��� 5C ������������ ���� ����?

��� ���� �� ��������� ������� ��� �������� ����� ����, ������, ��� ��
����� � MySQL 5.1 ��� 5.2.

10.11.8:
����� �������� � ������ ����� ���
������ � ���������� �������� �������� � MySQL?

� ������, ���� ���� ��������� ������ ������ �������� euckr
(Extended Unix Code Korea),
������ ���� �������� ���� ��������.

�� ���������� ASCII-������� EUC-KR, � �������
��� 0x5c ��������� REVERSE SOLIDUS, ������
KS-Roman-�������� EUC-KR, � ������� ���
0x5c ���������� WON SIGN(���). ���
��������, ��� �� �� ������
��������������� Unicode U+20A9euckr:

mysql> SELECT CONVERT('���' USING euckr) AS euckr,
    ->        HEX(CONVERT('���' USING euckr)) AS hexeuckr;
+-------+----------+
| euckr | hexeuckr |
+-------+----------+
| ?     | 3F       |
+-------+----------+
1 row in set (0.00 sec)

����������� ��������� ��������� MySQL �����:

http://d.udm.net/bar/~bar/charts/euckr_korean_ci.html.

10.11.9:
������ � ������� ��������� ��
������ «Data truncated«?

��� ����������� �� �������� ������� � ����� �������� Unicode
(ucs2) � ������ Chinese (gb2312):

mysql> CREATE TABLE ch
    ->        (ucs2 CHAR(3) CHARACTER SET ucs2,
    ->        gb2312 CHAR(3) CHARACTER SET gb2312);
Query OK, 0 rows affected (0.05 sec)

�� ������� �������� ������ ������ � � ����� ��������:

mysql> INSERT INTO ch VALUES ('A�B','A�B');
Query OK, 1 row affected, 1 warning (0.00 sec)

������� ��������������. ������� ���������, ��� ��� ���������:

mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------+
| Level   | Code | Message                                     |
+---------+------+---------------------------------------------+
| Warning | 1265 | Data truncated for column 'gb2312' at row 1 |
+---------+------+---------------------------------------------+
1 row in set (0.00 sec)

��� ��� ��� �������������� ������ ������������ ������� gb2312.

mysql> SELECT ucs2, HEX(ucs2), gb2312, HEX(gb2312) FROM ch;
+-------+--------------+--------+-------------+
| ucs2  | HEX(ucs2)    | gb2312 | HEX(gb2312) |
+-------+--------------+--------+-------------+
| A�B | 00416C4C0042 | A?B    | 413F42      |
+-------+--------------+--------+-------------+
1 row in set (0.00 sec)

������� ��������� �����, ������� �������� ������ �����:

  1. ����, ��� ��� ��������
    ���������������
    , � �� �������, �����������
    ��� MySQL. �� ������������ ��������� ������� ��, ��� �����, ����� ��������
    ����� ���������� �����������, ��� ������������.

  2. ������ � �� ��������� � ������ ��������
    gb2312. �� ������������� ��� �������� �����.

  3. �� ������ ��������� ��������� ������ � �����������. � ���� ������ ��
    ���� �������� ��������: � ��������� ����������� ������ ������� ��
    �������������� ����. ������ ��� ����� ������������ ������������ �����
    ��������� (��. ���� #9337
    ). �� ���� ��� ����������� ���-��� �������, ������ � ���� ��� ���������
    2165 ����� �������� ��� �����.

  4. SQL_MODE=TRADITIONAL ������� �� ��������� �� ������, ��
    ������ ������ 2165 �� ������ ������: ERROR 1406 (22001): Data too long
    for column 'gb2312' at row 1
    .

10.11.10:
������ ��� ������� GUI-���������
��� ���� ��������� �� ���������� ������� CJK ��������� � ���� ����������
���������, ������������ Access, PHP ��� ������ API?

�������� ������ ����������� � �������, �������� ������
mysql (� Windows:
mysql.exe), � �����������
��������� ��� �� ����� ������ ���. ����
mysql �������� ���������, ��
�������� ����� ���� � ���, ��� ��� ��������� ���������� ��������� �������
�������������. ����������� mysql, �����
������, ����� ����� �������� ��� ���������� � ������� ����������
SHOW VARIABLES LIKE 'char%';. ���� �� ����������� Access, �� ��
�������� �������� ������������ � MyODBC. � ���� ������ �� ������ ���������
������������ ODBC. ����, ��������, �� ����������� big5, �� �����
�� SET NAMES 'big5'. �������� ��������, ��� ; ��
��������� � ���� ������. ���� �� ����������� ASP, �� ����� �� ��������
SET NAMES � ���. ������� ������, ������� ������� � �������:

<%
Session.CodePage=0
Dim strConnection
Dim Conn
strConnection="driver={MySQL ODBC 3.51 Driver}; 
               server=server;uid=username;" 
               & "pwd=password; 
               database=database; 
               stmt=SET NAMES 'big5';"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strConnection
%>

����������� ��������, ���� �� ����������� ����� ����� ��������, ������,
��� latin1 � Connector/NET, �� ������ ���������� ����� ��������
� ������ �����������. ���� �� ����������� PHP, ��������� ���:

<?php
$link = mysql_connect($host, $usr, $pwd);
mysql_select_db($db);
if (mysql_error()) {
   print "Database ERROR: " . mysql_error();
}
mysql_query("SET NAMES 'utf8'", $link);
?>

� ���� ������ �� ������������ SET NAMES, ����� ��������
character_set_client, character_set_connection
character_set_results.

��������� ������������ ����� ������ ���������� mysqli, � ��
������� mysql. ��� ������������� mysqli ����������
������ ��� �� ���� ��������� ��� �������� �����:

<?php
$link = new mysqli($host, $usr, $pwd, $db);
if (mysqli_connect_errno()) {
   printf("Connect failed: %sn", mysqli_connect_error());
   exit();
}
$link->query("SET NAMES 'utf8'");
?>

������ ��������, � ������� ����� ������������ � ���������� ���������� ��
PHP: ��� ������ � ���������������, ���������� ���������. ������ ����������
��� ��������� ���� <meta> ����������, ����� ���������
��������: ��������, ����� ����������, ����� ����� ������������
��������������� ���������� �������� ��� UTF-8, �� ������
�������� <meta http-equiv="Content-Type" content="text/html;
charset=utf-8">
<head> HTML-��������.

10.11.11:
� ��������� �� MySQL 5.1.
��� � ���� ������������ � ���������, ������������ MySQL 4.0,
������������ ������� ��������?

� MySQL 4.0 ������ ���� ���������� �����
�������� ��� ������� � �������, ������� ���������� ���������������. ���
���������� � MySQL 4.1. ����� ������������ �����������, �� �������� �������
��� ������ ��������, ������� ��������� ������������. ������ ���������� ���
���, ����� ���������� ���������� ������� character_set_client,
character_set_resultscharacter_set_connection. �
���������������� ������ ��������� �������� SET NAMES,
������������ ��� ������ ��������. ������ �����: �� �� ������ ���������
������� �������� ������������, �������� mysqld
� ���������� --character-set-server=utf8. ������, ���������
��������� �������, ��� ������������ ��������� MySQL 4.0. ����� ������
��������� ��������� ��� ���������, ������������ �������� �
mysqld �������������
--character-set-client-handshake, ������� ����� ���� �������� �
--skip-character-set-client-handshake. ���� �� ����������
mysqld
--skip-character-set-client-handshake, ��, ����� ������������
�����������, ��� �������� ������� ��� ������ ��������, ������� ���������
������������. ������, ������ ������������� ���� ������ �� ������������.

��������, ������������, ��� ��� ������� ����� �������� �������
latin1 (���� �� ��� ��� � ������� CJK, �� ��� �������� ��
���������). ������������ �����, ��� ������������ ���������� utf8
������, ��� ������������ ������� ������������ ������������. ������ ���������
������ � latin1 ��� �������� �� ��������� ����� ��������:

mysqld --character-set-server=latin1

����� ��������� ������������ � �������� �� ���������
������� �������� utf8:

mysql --default-character-set=utf8

������� ��������� ��������� ����� ���� ��������, ������������
����� SHOW VARIABLES:

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | latin1                                 |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | latin1                                 |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
8 rows in set (0.01 sec)

������ ���������� ������������, � ����� � ������, ���������
mysqladmin. ����� ���������
������ �����, �� �� ��� ��� ��������, ����� �� �� ����� ����� ��������:

mysqld --character-set-server=utf8 --skip-character-set-client-handshake

��������� ������������ � utf8 ��� ��� ��� �������� ��
��������� ����� ��������, � ����� ���������� ������� ��������� ���������:

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | latin1                                 |
| character_set_connection | latin1                                 |
| character_set_database   | latin1                                 |
| character_set_filesystem | binary                                 |
| character_set_results    | latin1                                 |
| character_set_server     | latin1                                 |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
8 rows in set (0.01 sec)

��� �� ������ ������, ��������� ������� ������� SHOW
VARIABLES
, ������ ���������� ��������� ��������� ������������, ����
������������ ����� --skip-character-set-client-handshake.

10.11.12:
������ ���������
LIKE � ����� FULLTEXT � ��������� CJK ���������?

������� ����� ������� �������� � �������� LIKE �� ��������
BINARYBLOB: �� ������ ����� ����� �������. �
�������������� �������� ��������, ��������� ������� ����� �� ����� ���������
�����. ��������, � utf8, A ������� ���� ����, ��
��� ������� ���� ������, ��� �������� �����:

+-------------------------+---------------------------+
| OCTET_LENGTH(_utf8 'A') | OCTET_LENGTH(_utf8 '���') |
+-------------------------+---------------------------+
| 1                       | 3                         |
+-------------------------+---------------------------+
1 row in set (0.00 sec)

���� �� �� �����, ��� ���������� �����, �� �� �� �����, ��� ����������
��������� ������� ���� � ����� ������� �������, ���� LIKE '_A%'.
������� ������� � ���, ����� ������������ ���������� ����� �������� CJK ���
����������������� � ����� �������� CJK ����� ����������.

��� ���� �������, ������ MySQL �� ����� ��������� �����������
�������������� ��������. ���� ��� �� ������ ������������ ����������, �� ��
������� �������� ������� ��������, ��� ������� �������������.

��� ������� FULLTEXT �� ������ �����, ��� ����� ���������� �
�������������. � ��������� ������� ��� ����� ��������, ������ ��� �����������
(���� �� ���) ��� ���������� ������, ����� ���������������� ����� �����.
������, ��� �� ��� � ��������� �������.

10.11.13:
����� ������ ��������
CJK �������� � MySQL?

������ ������� �������� CJK ����� ���������� � ����������� �� ����� ������
MySQL. ��������, ����� �������� eucjpms �� ������������� ��
MySQL 5.0.3. ������, ��� ��� ��� ���������������� ����� ���������� � �������
DESCRIPTION ��� ������� ����� � �������
INFORMATION_SCHEMA.CHARACTER_SETS, �� ������ �������� �������
������ ���� ��-Unicode ������� �������� CJK, ��������� ���� ������:

mysql> SELECT CHARACTER_SET_NAME, DESCRIPTION FROM
    ->        INFORMATION_SCHEMA.CHARACTER_SETS
    ->        WHERE DESCRIPTION LIKE '%Chinese%' OR
    ->        DESCRIPTION LIKE '%Japanese%' OR DESCRIPTION LIKE '%Korean%'
    ->        ORDER BY CHARACTER_SET_NAME;
+--------------------+---------------------------+
| CHARACTER_SET_NAME | DESCRIPTION               |
+--------------------+---------------------------+
| big5               | Big5 Traditional Chinese  |
| cp932              | SJIS for Windows Japanese |
| eucjpms            | UJIS for Windows Japanese |
| euckr              | EUC-KR Korean             |
| gb2312             | GB2312 Simplified Chinese |
| gbk                | GBK Simplified Chinese    |
| sjis               | Shift-JIS Japanese        |
| ujis               | EUC-JP Japanese           |
+--------------------+---------------------------+
8 rows in set (0.01 sec)

10.11.14:
��� � �����, �������� �� ������
X ��������� �� ���� ������� ��������?

����������� ����������� ��������� � �������� ��������
Kana
���������� �� ���� CJK-������� ��������. ��� ����������� ��������� ���������
������ UCS-2 Unicode, ����������� ��� �� ��� ������ ������
�������� � ���������� ���������� � ����������������� �������.

DELIMITER //
CREATE PROCEDURE p_convert(ucs2_char CHAR(1) CHARACTER SET ucs2)
BEGIN
  CREATE TABLE tj (ucs2 CHAR(1) character set ucs2,
                   utf8 CHAR(1) character set utf8,
                   big5 CHAR(1) character set big5,
                   cp932 CHAR(1) character set cp932,
                   eucjpms CHAR(1) character set eucjpms,
                   euckr CHAR(1) character set euckr,
                   gb2312 CHAR(1) character set gb2312,
                   gbk CHAR(1) character set gbk,
                   sjis CHAR(1) character set sjis,
                   ujis CHAR(1) character set ujis);
  INSERT INTO tj (ucs2) VALUES (ucs2_char);
  UPDATE tj SET utf8=ucs2, big5=ucs2, cp932=ucs2, eucjpms=ucs2, euckr=ucs2,
                gb2312=ucs2, gbk=ucs2, sjis=ucs2, ujis=ucs2;

  /* If there's a conversion problem, UPDATE will produce a warning. */
  SELECT hex(ucs2) AS ucs2, hex(utf8) AS utf8, hex(big5) AS big5,
         hex(cp932) AS cp932, hex(eucjpms) AS eucjpms, hex(euckr) AS euckr,
         hex(gb2312) AS gb2312, hex(gbk) AS gbk, hex(sjis) AS sjis,
         hex(ujis) AS ujis FROM tj;
  DROP TABLE tj;
END//

���� ����� ���� ����� ��������� �������� ucs2 ��� ���������
������� ���� (����������������� �������������) ��� ����� �������. ��������,
�� ������ Unicode ����������� � ���� ucs2
(
http://www.unicode.org/Public/UNIDATA/UnicodeData.txt) �� �����, ���
������ Katakana
Pe
���������� �� ���� CJK-������� ��������, � ��� �������� ������� ����
0x30da. ���� �� ���������� ��� �������� ��� �������� ���
p_convert(), ��������� ������������ �����:

mysql> CALL p_convert(0x30da)//
+------+--------+------+-------+---------+-----+------+------+------+------+
| ucs2 | utf8   | big5 | cp932 | eucjpms |euckr|gb2312| gbk  | sjis | ujis |
+------+--------+------+-------+---------+-----+------+------+------+------+
| 30DA | E3839A | C772 | 8379  | A5DA    |ABDA |A5DA  | A5DA | 8379 | A5DA |
+------+--------+------+-------+---------+-----+------+------+------+------+
1 row in set (0.04 sec)

��� ��� �� ���� �� �������� ������� �� 3F, �� ���� ������
��������������� ����� (?), �� �����, ���
������ �������������� ���������.

10.11.15:
������ CJK-������ ��
����������� ��������� � Unicode? (I)

������ ���� ���������, ��� ��������� ������ utf8_unicode_ci
��� ucs2_unicode_ci, ���� ���������� ORDER BY ��
��, ��� ��� �������. ���� �� ������� �� ��������� �����������, ��� �������
������, � ������� ���� �����������, ��� ����� ����� �� ������ ���������
����������� ������� ����� ��� ��������� ����������� Unicode. MySQL ����������
�������, ��������� ��
http://www.unicode.org/Public/UCA/4.0.0/allkeys-4.0.0.txt.
��� �� ������ �������, ������� �� �������, ����� � unicode.org,
������ ��� MySQL ���������� ������ ������� 4.0.0 allkeys
, � �� ����� ����� 4.1.0. ��� ������, ��� ������������ ����� ���������
������������ ��������� ������������, ������� ������������ �� �������, �����
�� �������� �������� ���� ���������� �
����� #16526,
�������������� ��������� �������:

mysql< CREATE TABLE tj (s1 CHAR(1) CHARACTER SET utf8 COLLATE
                 utf8_unicode_ci);
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO tj VALUES ('���'),('���');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM tj WHERE s1 = '���';
+-----+
| s1  |
+-----+
| ��� |
| ��� |
+-----+
2 rows in set (0.00 sec)

������ � ������ ������ ����������� �� ���, ������� �� ������. ������ MySQL
������� ���? ������� �� ���� �������� ������� ���� Unicode, ������� ��������
���������, ����� ����������������� ����� ���
ucs2-������ ��������:

mysql> SELECT s1, HEX(CONVERT(s1 USING ucs2)) FROM tj;
+-----+-----------------------------+
| s1  | HEX(CONVERT(s1 USING ucs2)) |
+-----+-----------------------------+
| ��� | 304C                        |
| ��� | 304B                        |
+-----+-----------------------------+
2 rows in set (0.03 sec)

������ �� ���� 304B304C � ������� 4.0.0
allkeys
� ������� ��� ������:

304B; [.1E57.0020.000E.304B] # HIRAGANA LETTER KA
304C; [.1E57.0020.000E.304B][.0000.0140.0002.3099] # HIRAGANA LETTER GA; QQCM

����������� ����� Unicode (����� ����� #)
�������� ��� �������� ������ (Hiragana), ������������� ������������� (������,
����� ��� ���� ����������) � �������� ������������� (KA ���
GA, ������������ � �������������� ���������� ��� �� ����� ����
��������). ����� ����� ��������� ��� (primary weight
, ������ ����������������� ����� ������ ���������� ������)
1E57 �� ����� �������. ��� ��������� � ������ � ���������� MySQL
���������� ������ ��������� ���, ��������� ��� ������ �����. ��� ��������,
��� �� ��������� ������ ���������, ��������
Unicode ������������. ���� �� ����� �������� ��, �� ������ ����� ������������
non-UCA (Unicode Collation Algorithm) �����������
(utf8_unicode_bin ��� utf8_general_ci), ����
���������� �������� HEX(), ���� ��������� ORDER BY
CONVERT(s1 USING sjis)
. ���� ����������, �������� Unicode, �������,
������������: �������, ������� ���������� �� ������������ ������, ��� ����.
�� ��������� ��������� ������ ����������� ��� �������� �������� ��������
��������� JIS X 4061, � ������� �����������/������������� ���� ��������,
�������� KA/GA, �������� �����������
��� ����� ������������.

10.11.16:
������ CJK-������ ��
����������� ��������� � Unicode? (����������)

���� �� ����������� Unicode (ucs2 ��� utf8) � ��
������ ������� ���������� Unicode, �� MySQL ��� ��� ��������� ���� �������
�����������, �� �� ������ ������� ��������� ����� �������� �������:

mysql> SHOW CREATE TABLE tG
******************** 1. row ******************
Table: t
Create Table: CREATE TABLE `t` (`s1` char(1) CHARACTER SET ucs2 DEFAULT NULL)
                     ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

��� ��� ����� �������� ����������, ������� ��������� ��, ����� ����������
������� INFORMATION_SCHEMA.COLUMNS �����
������������ ������������ ����� �������:

mysql> SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
    ->        FROM INFORMATION_SCHEMA.COLUMNS
    ->        WHERE COLUMN_NAME = 's1' AND TABLE_NAME = 't';
+-------------+--------------------+-----------------+
| COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME  |
+-------------+--------------------+-----------------+
| s1          | ucs2               | ucs2_general_ci |
+-------------+--------------------+-----------------+
1 row in set (0.01 sec)

�� ������ ������, ��� ����������� ucs2_general_ci ������
ucs2_unicode_ci. ������� ����, ������ ��� ���, ����� ����
�������, ��������� SHOW CHARSET, ��� �������� �����:

mysql> SHOW CHARSET LIKE 'ucs2%';
+---------+---------------+-------------------+--------+
| Charset | Description   | Default collation | Maxlen |
+---------+---------------+-------------------+--------+
| ucs2    | UCS-2 Unicode | ucs2_general_ci   | 2      |
+---------+---------------+-------------------+--------+
1 row in set (0.00 sec)

��� ucs2utf8 �������� �� ���������
�����������: general. ����� ���������� �����������
Unicode, ����������� COLLATE ucs2_unicode_ci.

10.11.17:
������ ��� ��������������
������� ��������� MySQL?

MySQL �� ������������ �������������� �������, �� ���� �������, �������
��������� ������, ��� � 3 ������ ��� UTF-8. ����� ������������
������ Basic Multilingual Plane/Plane 0
. ������ ��������� ����� ������ �������� Han �������������; ���������
��� ��� �������������. ��� ������� � ������� ���� ���������� �
����� #12600, �������
������ ��������� ��� �� ������. �
utf8 �� ������ ����� ������� ������, ����� ������������ �
�������, ������� �� ��������. ����� �� �� ����� ��, �����
����� ������������� ������.

���� ��������� ������� ������ ������������ ucs2 ������
utf8, ����� ������� �������� �� �������������� �����. ������,
������� �������� �� ����������. �� ������ ����� �������� ��� ������ ��
BLOB ��� BINARY, ������� �� ���������
������� �������� ������������.

10.11.18:
����� ��� �� ������ ����
CJKV?

���. ������ CJKV (Chinese
Japanese Korean Vietnamese
) ���������� � ����������� ������� ��������,
������� �������� Han (���������� ���������) �������. MySQL �� ����� ��������
�����, ����� ������������ ������ ����������� �������, ������������ �������
Han. MySQL ������������ ����������� ����������� ������� � ��������� Western.

���� #4745 �������
� ������������������ ����������� �����������, ������� ����� ���� ��������� �
�������, ���� ������� ����������� ����������� � ����.

10.11.19:
MySQL ��������� �������� CJK
�������������� � ������ ��� ������ � ������?

��� �������� ������������� � MySQL 5.1, ������������� �����������
����� ��������������� ��������� � ������.

��������, ���� �� �������� ���� ������ ��� �� �������, ���
������������ ������� �� ������������ CJK � ������ ���������, MySQL �������
������� @0w@00a5@00ae, ������� �������� ������ �����������
�������� ����������� E6A5AE, �� ���� �����������������
������������� ��� Unicode-������� ���. ������, ���� ��
���������� ���������� SHOW DATABASES, �� ������ ������, ��� ����
������ ����������� ��� ���.

10.11.20:
��� � ���� �������� ��������
����������� �� MySQL �� ���������, ��������� � �������� �����?

���������� ��������� ������ ����������� ��� MySQL 5.1.12 ����� ����
������� ��
http://dev.mysql.com/doc/#chinese-5.1. �������� ��� MySQL 4.1 ����� ����
�������� �
http://dev.mysql.com/doc/#japanese-4.1.

10.11.21:
��� � ���� �������� ������� �� CJK
� ��������� ��������� � MySQL?

��������� ������� ��������:

  • �������� ����� ������������� MySQL ����� ���� ������
    ��
    http://dev.mysql.com/user-groups/.

  • �� ������ ������� � ������� � ��������� ����� � MySQL KK Japan:

    Tel: +81(0)3-5326-3133
    Fax: +81(0)3-5326-3001
    Email: dsaito@mysql.com
    
  • �������� ���������� ������� � ��������� ������� ������ �������� ��

    http://tinyurl.com/y6xcuf.

  • �������� ����� «MySQL Character Sets, Collation, Unicode» ��

    http://forums.mysql.com/list.php?103.

from utf8 to utf8mb4:

1.show all DATABASE default characterset:

SELECT SCHEMA_NAME 'YOUR_DATABASE_NAME', 
default_character_set_name 'charset', 
DEFAULT_COLLATION_NAME 'collation' 
FROM information_schema.SCHEMATA;

2.show all tables status(character set), focus on column ‘collation’:

use YOUR_DATABASE_NAME;    
SHOW TABLE STATUS ;

3.generate convert sql:
convert database & all tables to utf8mb4,utf8mb4_unicode_ci

USE information_schema;
SELECT CONCAT("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") AS _sql
FROM `TABLES` WHERE table_schema LIKE "YOUR_DATABASE_NAME" AND TABLE_TYPE='BASE TABLE' GROUP BY table_schema UNION
SELECT CONCAT("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") AS _sql  
FROM `TABLES` WHERE table_schema LIKE "YOUR_DATABASE_NAME" AND TABLE_TYPE='BASE TABLE' GROUP BY table_schema, TABLE_NAME 
/*include all columns, commonly don't need this.*/
/*
UNION
SELECT CONCAT("ALTER TABLE `",`COLUMNS`.table_schema,"`.`",`COLUMNS`.table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") AS _sql 
FROM `COLUMNS` INNER JOIN `TABLES` ON `TABLES`.table_name = `COLUMNS`.table_name WHERE `COLUMNS`.table_schema like "YOUR_DATABASE_NAME" and data_type in ('varchar','char') AND TABLE_TYPE='BASE TABLE' UNION
SELECT CONCAT("ALTER TABLE `",`COLUMNS`.table_schema,"`.`",`COLUMNS`.table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") AS _sql 
FROM `COLUMNS` INNER JOIN `TABLES` ON `TABLES`.table_name = `COLUMNS`.table_name WHERE `COLUMNS`.table_schema like "YOUR_DATABASE_NAME" and data_type in ('text','tinytext','mediumtext','longtext') AND TABLE_TYPE='BASE TABLE';
*/

4.run the sql generated.

5.refresh your database.

6.check:

SHOW TABLE STATUS ;

from utf8 to utf8mb4:

1.show all DATABASE default characterset:

SELECT SCHEMA_NAME 'YOUR_DATABASE_NAME', 
default_character_set_name 'charset', 
DEFAULT_COLLATION_NAME 'collation' 
FROM information_schema.SCHEMATA;

2.show all tables status(character set), focus on column ‘collation’:

use YOUR_DATABASE_NAME;    
SHOW TABLE STATUS ;

3.generate convert sql:
convert database & all tables to utf8mb4,utf8mb4_unicode_ci

USE information_schema;
SELECT CONCAT("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") AS _sql
FROM `TABLES` WHERE table_schema LIKE "YOUR_DATABASE_NAME" AND TABLE_TYPE='BASE TABLE' GROUP BY table_schema UNION
SELECT CONCAT("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") AS _sql  
FROM `TABLES` WHERE table_schema LIKE "YOUR_DATABASE_NAME" AND TABLE_TYPE='BASE TABLE' GROUP BY table_schema, TABLE_NAME 
/*include all columns, commonly don't need this.*/
/*
UNION
SELECT CONCAT("ALTER TABLE `",`COLUMNS`.table_schema,"`.`",`COLUMNS`.table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") AS _sql 
FROM `COLUMNS` INNER JOIN `TABLES` ON `TABLES`.table_name = `COLUMNS`.table_name WHERE `COLUMNS`.table_schema like "YOUR_DATABASE_NAME" and data_type in ('varchar','char') AND TABLE_TYPE='BASE TABLE' UNION
SELECT CONCAT("ALTER TABLE `",`COLUMNS`.table_schema,"`.`",`COLUMNS`.table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") AS _sql 
FROM `COLUMNS` INNER JOIN `TABLES` ON `TABLES`.table_name = `COLUMNS`.table_name WHERE `COLUMNS`.table_schema like "YOUR_DATABASE_NAME" and data_type in ('text','tinytext','mediumtext','longtext') AND TABLE_TYPE='BASE TABLE';
*/

4.run the sql generated.

5.refresh your database.

6.check:

SHOW TABLE STATUS ;

Понравилась статья? Поделить с друзьями:
  • Character ai chat error
  • Char error rate
  • Char convert error in smb 018 763
  • Chaos group installer error
  • Channel private error