Кодировка символов таблицы - исключение в приложении - PullRequest
1 голос
/ 27 марта 2012

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

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 ]

3 голосов
/ 27 марта 2012

Я не уверен, что понимаю, почему вы переходите с 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?

1 голос
/ 27 марта 2012

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

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

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

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

...