Нормализовать строку Юникода в SQL Server? - PullRequest
7 голосов
/ 18 октября 2011

Есть ли в SQL Server функция для нормализации строки Юникода? например

UPDATE Orders SET Notes = NormalizeString(Notes, 'FormC')

Формы нормализации Unicode:

  • C & # x200b; положение ( C ): A + ¨ становится Ä
  • D & # x200b; ecomposition ( D ): Ä становится A + ¨
  • Совместимая композиция ( KC ): A + ¨ + + n становится Ä + f + i + n
  • Совместимая декомпозиция ( KD ): Ä + + n становится A + ¨ + f + i + n

Я не могу найти встроенную функцию, поэтому я предполагаю, что ее нет.


В идеале, если может быть только один, тогда мне нужна форма C сегодня:

Форма нормализации Unicode C, каноническая композиция. Преобразует каждую разложенную группировку, состоящую из базового символа и комбинирующих символов, в канонический предварительно составленный эквивалент. Например, A + ¨ становится Ä.

Смотри также

Ответы [ 2 ]

6 голосов
/ 19 октября 2011

Извините, нет, на сегодняшний день такой функции нет ни в одной версии SQL Server (тестовые сборки 2012 года). Сравнения могут быть корректно нечувствительными к композиции, но нет функции для преобразования использования композиции символов в одну нормальную форму.

Это было предложено для будущей версии стандарта ANSI с синтаксисом NORMALIZE(string, NFC), но пройдет много времени, прежде чем оно перейдет в реальный мир. На данный момент, если вы хотите выполнить нормализацию, вам придется делать это на надлежащем языке программирования с лучшими возможностями обработки строк, либо путем извлечения строки из базы данных, либо путем написания хранимой процедуры CLR для этого.

1 голос
/ 05 октября 2016

попробуйте эту функцию CLR

using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString fnRemoveDiacritics(string text)
    {
        string stringFormD = text.Normalize(System.Text.NormalizationForm.FormD);
        System.Text.StringBuilder retVal = new System.Text.StringBuilder();
        for (int index = 0; index < stringFormD.Length; index++)
        {
            if (System.Globalization.CharUnicodeInfo.GetUnicodeCategory(stringFormD[index]) != System.Globalization.UnicodeCategory.NonSpacingMark)
                retVal.Append(stringFormD[index]);
        }
        return retVal.ToString().Normalize(System.Text.NormalizationForm.FormC);
    }
}

и в SQL

SELECT dbo.fnRemoveDiacritics('Äěščřžýáíé')
-- Returns: Aescrzyaie

благодаря http://www.dotnetportal.cz/blogy/4/Tomas-Jecha/663/NET-Tip-6-Ciste-odstraneni-diakritiky

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...