Кодировка символов таблицы - исключение в приложении
У меня есть код:
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 может потребоваться до трех байтов на символ [...]
Прочитайте эту ссылку для получения дополнительной информации.
Мой совет - не сосредотачиваться на том, сколько байтов использует СУБД, поскольку одна из ее целей - абстрагировать вас от этого. Просто сосредоточьтесь на кодировании в соответствии с выбранными типами данных.