我有一个代码:
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 个字节/字符吗?
最佳答案
我不确定我是否理解您为什么要从 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。
这里有一些有用的链接:
MySQL 中的 Unicode 支持: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 编码数据后,您是否更改了字符集?
关于c# - 表格字符编码 - 应用程序异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9882942/