Почему Sql CE меняет значение Unicode? - PullRequest
1 голос
/ 16 февраля 2011

Я принимаю неструктурированный текст различных документов из разных источников. Я использую Sql Server Compact Edition 3.5.

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

После вставки термина «определения» я наложил ограничение на уникальный ключ для строки, в которой уже есть «определения». Если вы внимательно изучите два, вы обнаружите, что значение, которое я вставляю, это не «f» и «i», а фактически один символ. Тем не менее, SqlCe пытается преобразовать его в бытие и «f» и «я». Десять символов в одном слове, одиннадцать в другом, но SqlCe видит их одинаковыми.

Столбец таблицы nvarchar.

Я указал параметр как nvarchar.

Запрос очень прост:

            cmd.CommandText = "INSERT INTO dictionary(lemma) VALUES(?);";

            DbParameter lemma = cmd.CreateParameter();
            cmd.Parameters.Add(lemma);

            for (int i = 0; i < terms.Count; i++)
            {
                lemma.Value = terms[i].Key;
                cmd.ExecuteNonQuery();
            }

Я также пробовал:

            cmd.CommandText = "INSERT INTO dictionary(lemma) VALUES(?);";

            SqlCeParameter lemma = new SqlCeParameter("lemma", SqlDbType.NVarChar);
            cmd.Parameters.Add(lemma);

            for (int i = 0; i < terms.Count; i++)
            {
                lemma.Value = terms[i].Key;
                cmd.ExecuteNonQuery();
            }

В том, что я вставляю, байты для символа 'f' равны 1 251, в отличие от 'f' и 'i' 105 0, 110 0. Смотрите следующее:

 {byte[20]}
 [0]: 100
 [1]: 0
 [2]: 101
 [3]: 0
 [4]: 1
 [5]: 251
 [6]: 110
 [7]: 0
 [8]: 105
 [9]: 0
 [10]: 116
 [11]: 0
 [12]: 105
 [13]: 0
 [14]: 111
 [15]: 0
 [16]: 110
 [17]: 0
 [18]: 115
 [19]: 0

Принимая во внимание, что значение в базе данных (которое SqlCe видит как нарушение уникального ключа):

{byte[22]}
[0]: 100
[1]: 0
[2]: 101
[3]: 0
[4]: 102
[5]: 0
[6]: 105
[7]: 0
[8]: 110
[9]: 0
[10]: 105
[11]: 0
[12]: 116
[13]: 0
[14]: 105
[15]: 0
[16]: 111
[17]: 0
[18]: 110
[19]: 0
[20]: 115
[21]: 0

Как я могу заставить SQL Server CE правильно вставить значение?

РЕДАКТИРОВАТЬ: Исправлен код, показанный выше.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

SQL CE не изменяет ни одно из ваших значений.Проблема в том, что вы определили столбец как IDENTITY, который допускает только уникальные значения, а SQL CE определяет уникальность VARCHARS с помощью правил сопоставления.По умолчанию сопоставляются строки, учитывающие культурные особенности, поэтому 'if' = 'fi', 'Å' = 'Å' и многие другие.

Я не знаю ни одного сопоставления SQL, которое сравнивает каждое значение Unicodeв отличии.Если это действительно то, что вам нужно, вам придется хранить ваши данные как VarBinary и выполнять двоичные сравнения.

Пересмотреть ваше желание сравнивать символы как двоичные, SQL определяет VarChar как читаемый человеком текст,и SQL, и Unicode определяют соответствующие лигатуры, диакритические знаки и др.как соответствующие строки.Это имеет смысл, люди действительно читают их одинаково, и они неотличимы в большинстве шрифтов.

0 голосов
/ 16 февраля 2011

Попробуйте

for (int i = 0; i < terms.Count; i++)
{
    cmd.CommandText = "INSERT INTO dictionary (lemma) VALUES (@lemma)";
    cmd.parameters.AddWithValue(@lemma, lemma);         
    cmd.ExecuteNonQuery();
}
...