转换字符串代码页IBM-850 / Windows-1252 / UTF-8

时间:2011-12-14 20:33:28

标签: sql-server sql-server-2008 tsql asp-classic ado

好的,我有一个DbaseIV格式的数据库,在Codepage IBM-850中有数据,我需要导入到SQL Server 2008.我使用asp脚本导入数据,最近我发现存储特殊字符的问题字符串。

目前这个字段是varchar ...在网页的响应中一切都很好但是当我尝试查看数据库中的数据时,这些特殊字符会被替换或以其他方式解释。

我在SQL查询中使用参数化值来存储我需要将数据从Codepage 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 :(得分:0)

如果我理解你是正确的,你想要更改列和数据库的排序规则。

如果是这样,您必须先更改数据库的排序规则,这样如果添加新列,则这些排序也将采用相同的排序规则。

此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

我希望这会有所帮助