Кодировка символов таблицы - исключение в приложении

У меня есть код:

CREATE TABLE IF NOT EXISTS Person
(
   name varchar(24) ...
)
CHARACTER SET utf8 COLLATE utf8_polish_ci;

В моем приложении это работает нормально, но я читаю, если кто-то вставит в поле имени строку, содержащую символ, код которого больше 127, база данных будет использовать 2 байта (или больше) для хранения этого символа. Так что я думаю, я изменю набор символов на utf16:

CHARACTER SET utf16 COLLATE utf16_polish_ci;

Но теперь, когда я запускаю свое приложение, появляется исключение: KeyNotFoundException. Это происходит именно по этим инструкциям:

MySqlCommand komenda = baza.Połączenie.CreateCommand ();
komenda.CommandText  = zapytanie;

MySqlDataReader dr = komenda.ExecuteReader (); // HERE, at execute reader method

if (dr.Read ()) ...

1) У кого-нибудь была похожая проблема? 2) Есть идеи, как использовать всегда 2 байта / символ в поле базы данных?

2 ответа

Решение

Я не уверен, что понимаю, почему вы переходите с UTF-8 на UTF-16. Я предполагаю, что вы обеспокоены тем, что любые символы, для хранения которых требуется два байта или более, не поместятся в кодировке UTF-8. Это не вариант. В MySQL UTF-8 значения могут храниться с одним, двумя или тремя байтами. Точки Unicode U+0000 до U+007F занимают 1 байт, а точки U+0080 до U+07FF занимают 2 байта - этот диапазон охватывает польский алфавит. Поскольку большинство символов в польском алфавите занимают 1 байт для хранения, вам, вероятно, следует придерживаться UTF-8 и сохранить немного памяти. Однако, если вы хотите всегда использовать 2 байта, за счет потраченного впустую пространства, вы можете использовать UTF-16.

Вот несколько полезных ссылок:

Поддержка Unicode в MySQL: http://dev.mysql.com/doc/refman/5.6/en/charset-unicode.html

Базовый обзор Unicode: http://www.joelonsoftware.com/articles/Unicode.html

Что касается исключения, и это чисто предположение, оно может иметь какое-то отношение к попытке чтения данных, кодированных в UTF-8, как если бы они были кодированы в UTF-16. Изменили ли вы набор символов после того, как в вашей таблице уже были данные в кодировке UTF-8?

Документация гласит:

[...] Для символов utf8 может потребоваться до трех байтов на символ [...]

Прочитайте эту ссылку для получения дополнительной информации.

Мой совет - не сосредотачиваться на том, сколько байтов использует СУБД, поскольку одна из ее целей - абстрагировать вас от этого. Просто сосредоточьтесь на кодировании в соответствии с выбранными типами данных.

Другие вопросы по тегам