Кодовая страница строк преобразования IBM-850 / Windows-1252 / UTF-8 - PullRequest
2 голосов
/ 15 декабря 2011

Хорошо, у меня есть база данных в формате DbaseIV, которая имеет данные в кодовой странице IBM-850, которые мне нужно импортировать в SQL Server 2008. Я использую сценарий asp для импорта данных, недавно я обнаружил проблемы с хранением специальных символов в строки.

В настоящее время это поля varchar ... в ответе веб-страницы все хорошо, но когда я пытаюсь просмотреть данные в базе данных, эти специальные символы заменяются или интерпретируются другим способом.

Я использую параметризованные значения в запросе SQL для хранения данных, которые мне нужны для преобразования моих данных из кодовой страницы 850 (IBM-850) в 1252 (Windows-1252) или 65001 (UTF-8).

Пример данных

104 31  Yaxcabß NULL

и это должно быть

104 31  Yaxcabá NULL

Источник

это источник asp

function ImportarEntidadfed(oFileName,oDBFConn)
    Dim sSQL, RSImport, oSysConn, aIData, cont
    dim keys(1), bNewData, iUpdate(1), iInsert(1), itmp
    Dim oCmd
    dim afile
    dim sResult
    sSQL = "SELECT entidad,nom_ent,mun,nom_mun,loc,nom_loc,longitud,latitud FROM " & oFileName & " ORDER BY entidad,mun,loc;" 
    Set oRs = oDBFConn.execute(sSQL)
    Set oSysConn = Server.CreateObject("ADODB.Connection")
    oSysConn.ConnectionString=strcon
    aIData= oRs.GetRows()
    keys(0)=""
    keys(1)="" 
    iUpdate(0)=0
    iInsert(0)=0
    iUpdate(1)=0
    iInsert(1)=0
    For cont = 0 to Ubound(aIData,2)
        if keys(0) <> aIData(0,cont) And aIData(0,cont) <> "00" Then 'Entidad federativa
            sResult = aIData(1,cont)
            oSysConn.open 
            sSQL = "SELECT * FROM yyyyyy WHERE cve_entfed= ? ;"
            '-------------------------------------------------------------------
            Set oCmd = Server.CreateObject("ADODB.Command")
            oCmd.CommandText = sSQL
            set oCmd.ActiveConnection= oSysConn
            Set oPar = oCmd.CreateParameter("cve_entfed",129,1,2,aIData(0,cont)) ' Char(2)
            oCmd.Parameters.Append(oPar)
            '-------------------------------------------------------------------
            Set oRs=oCmd.Execute()
            'Set oRs=oSysConn.execute(sSQL)
            bNewData = oRs.EOF
            'oSysConn.Close
            if bNewData Then
                sSQL = "INSERT INTO yyyyyy (descripcion,cve_entfed) VALUES ( ? , ? );"
            Else
                sSQL = "UPDATE yyyyyy SET descripcion= ? WHERE cve_entfed= ? ;"
            End if

            '-------------------------------------------------------------------
            Set oCmd = Server.CreateObject("ADODB.Command")
            oCmd.CommandText = sSQL
            set oCmd.ActiveConnection= oSysConn
            Set oPar = oCmd.CreateParameter("descripcion",200,1,255,aIData(1,cont)) 'StringSane(aIData(1,cont)) varchar(max)
            oCmd.Parameters.Append(oPar)
            Set oPar = oCmd.CreateParameter("cve_entfed",129,1,2,aIData(0,cont)) ' Char(2)
            oCmd.Parameters.Append(oPar)
            '-------------------------------------------------------------------
            'oSysConn.open
            'call oSysConn.execute(sSQL,itmp)
            Set oRs=oCmd.Execute(itmp)

            oSysConn.Close
            if bNewData Then
                sResult = sResult & " [INS] "
            else
                sResult = sResult & " [ACT] "
            End if
            keys(0) = aIData(0,cont)
        end if
    Next
    Set oSysConn = nothing
    ImportarEntidadfed = sResult & " (Municipios " & Cstr(iUpdate(0)) & "[ACT] " & Cstr(iInsert(0)) & "[INS]) (Localidades " & Cstr(iUpdate(1)) & "[ACT] " & CStr(iInsert(1)) & "[INS])"
end function

sub Import()
    Dim oDBFConn
    Dim oDir, oFs, oFiles, oFile
    Dim sResult

    Set oDBFConn = Server.CreateObject ("ADODB.Connection")
    Set oFS = Server.CreateObject("Scripting.FileSystemObject")
    Set oDir = oFs.GetFolder(Server.MapPath(".\import\") & "\")
    'response.write(Server.MapPath(".\import\"))
    sResult = ""
    Set oFiles = oDir.Files

    oDBFConn.open sDBFConn
    For Each oFile in oFiles
        aFile=Split(oFile.ShortName,".",-1,1)
        if Ubound(aFile) = 1 Then
            if Ucase(aFile(1)) = "DBF" Then
                sResult = sResult & oFile.name  & ":" & ImportarEntidadfed(Cstr(oFile.ShortName),oDBFConn) & "<br/>"
            end if
        end if
    Next
    oDBFConn.Close

    response.write(sResult)
    Set oDBFConn = nothing
    Set oFS = nothing
    Set oDir = nothing
End sub

Call Import()

Возможное решение

Подумав некоторое время об этой проблеме, я вспомнил, что на самом сервере SQL есть опция для преобразования кодовой страницы COLLATE, и я обнаружил, что, возможно, сопоставление соответствует моим потребностям SQL_1Xcompat_CP850_CI_AS, но я не знаю, как его использовать во вставке / обновлении, и если будет работать хотя бы.

1 Ответ

0 голосов
/ 13 января 2012

Если я правильно понимаю, вы хотите изменить параметры сортировки для столбца и базы данных.

Если это так, вы должны сначала изменить параметры сортировки базы данных, чтобы при добавлении нового столбца они также были в том же порядке.

Этот sql проверяет текущую сортировку для базы данных

SELECT DATABASEPROPERTYEX('YourDatabase', 'Collation') SQLCollation;

Затем, чтобы изменить параметры сортировки базы данных, используйте это утверждение

ALTER DATABASE YourDatabase
COLLATE French_CI_AI ;

Тогда вы должны изменить параметры сортировки столбца. Используйте это утверждение, чтобы увидеть, какое сопоставление столбцы

SELECT name, collation_name
FROM sys.columns
WHERE OBJECT_ID IN ( SELECT OBJECT_ID
FROM sys.objects
WHERE type = 'U'
AND name = 'YourTable')

Затем, чтобы изменить сопоставление столбцов, вы можете использовать это утверждение

ALTER TABLE TestTable
ALTER COLUMN FirstCol VARCHAR(10)
COLLATE SQL_Latin1_General_CP1_CS_AS NULL

Надеюсь, это поможет

...