Sql server 将SQL Server中的所有数据转换为unicode

Sql server 将SQL Server中的所有数据转换为unicode,sql-server,unicode,utf-8,Sql Server,Unicode,Utf 8,我的数据库表字符串列是nvarchar 但是当我使用应用程序插入数据时,我忘记添加N'前缀。因此,在web上显示的不是UTF-8。这会引起很多问题 如何使用一些T-SQL命令将所有现有表和所有字符串列类型和数据替换为UTF-8?试试这个- 查询: SELECT o.table_name , column_name = c.name , transform_to = UPPER(t.name) + ' -> ' + CASE WHEN t.name = 'cha

我的数据库表字符串列是
nvarchar

但是当我使用应用程序插入数据时,我忘记添加
N'
前缀。因此,在web上显示的不是UTF-8。这会引起很多问题

如何使用一些T-SQL命令将所有现有表和所有字符串列类型数据替换为UTF-8?

试试这个-

查询:

SELECT 
      o.table_name
    , column_name = c.name
    , transform_to = UPPER(t.name) + ' -> ' + CASE WHEN t.name = 'char' THEN 'NCHAR' ELSE 'NVARCHAR' END
    , 'ALTER TABLE ' + o.table_name + 
        ' ALTER COLUMN [' + c.name + '] ' +
        CASE WHEN t.name = 'char' 
        THEN 'NCHAR('
        ELSE 'NVARCHAR('
        END + CASE WHEN c.max_length != -1 THEN CAST(c.max_length * 2 AS NVARCHAR(10)) ELSE 'MAX' END + ')'
FROM sys.columns c WITH (NOWAIT)
JOIN (
    SELECT 
          table_name = '[' + s.name + '].[' + o.name + ']'
        , o.[object_id]
    FROM sys.objects o WITH (NOWAIT)
    JOIN sys.schemas s WITH (NOWAIT) ON o.[schema_id] = s.[schema_id]
    WHERE o.[type] = 'U'
) o ON c.[object_id] = o.[object_id]
JOIN sys.types t WITH (NOWAIT) ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id
WHERE t.name IN ('char', 'varchar', 'text')
ORDER BY 
      o.table_name
    , c.column_id
table_name                      column_name      transform_to          
------------------------------- ---------------- --------------------- ---------------------------------------------------------------------------------------
[dbo].[Employee]                TabelNumber      VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[Employee] ALTER COLUMN [TabelNumber] NVARCHAR(12)
[dbo].[EmployeeAssigned]        EmployeeTypeCD   VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[EmployeeAssigned] ALTER COLUMN [EmployeeTypeCD] NVARCHAR(30)
[dbo].[EmployeeType]            EmployeeTypeCD   VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[EmployeeType] ALTER COLUMN [EmployeeTypeCD] NVARCHAR(30)
[dbo].[PaymentType]             PaymentCode      CHAR -> NCHAR         ALTER TABLE [dbo].[PaymentType] ALTER COLUMN [PaymentCode] NCHAR(4)
[dbo].[ScheduleDetail]          AbsenceCode      VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[ScheduleDetail] ALTER COLUMN [AbsenceCode] NVARCHAR(50)
[dbo].[ScheduleTemplateDetail]  AbsenceCode      VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[ScheduleTemplateDetail] ALTER COLUMN [AbsenceCode] NVARCHAR(50)
[dbo].[Supplement]              WorkFactorCD     VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[Supplement] ALTER COLUMN [WorkFactorCD] NVARCHAR(50)
结果:

SELECT 
      o.table_name
    , column_name = c.name
    , transform_to = UPPER(t.name) + ' -> ' + CASE WHEN t.name = 'char' THEN 'NCHAR' ELSE 'NVARCHAR' END
    , 'ALTER TABLE ' + o.table_name + 
        ' ALTER COLUMN [' + c.name + '] ' +
        CASE WHEN t.name = 'char' 
        THEN 'NCHAR('
        ELSE 'NVARCHAR('
        END + CASE WHEN c.max_length != -1 THEN CAST(c.max_length * 2 AS NVARCHAR(10)) ELSE 'MAX' END + ')'
FROM sys.columns c WITH (NOWAIT)
JOIN (
    SELECT 
          table_name = '[' + s.name + '].[' + o.name + ']'
        , o.[object_id]
    FROM sys.objects o WITH (NOWAIT)
    JOIN sys.schemas s WITH (NOWAIT) ON o.[schema_id] = s.[schema_id]
    WHERE o.[type] = 'U'
) o ON c.[object_id] = o.[object_id]
JOIN sys.types t WITH (NOWAIT) ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id
WHERE t.name IN ('char', 'varchar', 'text')
ORDER BY 
      o.table_name
    , c.column_id
table_name                      column_name      transform_to          
------------------------------- ---------------- --------------------- ---------------------------------------------------------------------------------------
[dbo].[Employee]                TabelNumber      VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[Employee] ALTER COLUMN [TabelNumber] NVARCHAR(12)
[dbo].[EmployeeAssigned]        EmployeeTypeCD   VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[EmployeeAssigned] ALTER COLUMN [EmployeeTypeCD] NVARCHAR(30)
[dbo].[EmployeeType]            EmployeeTypeCD   VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[EmployeeType] ALTER COLUMN [EmployeeTypeCD] NVARCHAR(30)
[dbo].[PaymentType]             PaymentCode      CHAR -> NCHAR         ALTER TABLE [dbo].[PaymentType] ALTER COLUMN [PaymentCode] NCHAR(4)
[dbo].[ScheduleDetail]          AbsenceCode      VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[ScheduleDetail] ALTER COLUMN [AbsenceCode] NVARCHAR(50)
[dbo].[ScheduleTemplateDetail]  AbsenceCode      VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[ScheduleTemplateDetail] ALTER COLUMN [AbsenceCode] NVARCHAR(50)
[dbo].[Supplement]              WorkFactorCD     VARCHAR -> NVARCHAR   ALTER TABLE [dbo].[Supplement] ALTER COLUMN [WorkFactorCD] NVARCHAR(50)

首先,请注意SQL Server不支持UTF-8。因此,您的应用程序代码中可能仍然存在编码问题(您没有显示任何示例数据或代码,因此很难说到底发生了什么)

话虽如此,您不能简单地
更新
数据以将其更改为Unicode:

declare @t table (c nchar(1))

insert into @t select '말'
insert into @t select N'말'

select c, ascii(c), unicode(c) from @t

update @t set c = cast(c as nchar(1))

select c, ascii(c), unicode(c) from @t

正如你所看到的,这个角色말 如果不使用
N
前缀,则存储为ASCII 63,即使将其显式转换为Unicode,SQL Server也无法神奇地知道您真正想要的是Unicode代码点47568。因此,您唯一能做的就是返回并重新插入所有数据。

此脚本检测char、varchar、text列并为问题表生成更改。我认为他的列已经是nvarchar,问题是,他在插入数据时忘记了N前缀,现在他想将数据转换为unicode格式。@Amit Mittal,部分同意您的意见,但问题是:“要将所有现有表和所有字符串列数据替换为UTF-8”,此SQL脚本有助于解决此问题。但正如Amit所说,我仍然需要N thingy来帮助数据转换为unicode格式。我认为现在查询无法将数据转换为unicode格式。Unicode是16位的,而ASCII是8位的,如果您忘记了N前缀,则只有8位数据被插入到数据库中,并且查询不可能恢复丢失的8位数据。您必须使用N前缀重新插入数据。如果我错了,请纠正我?如果有帮助,请尝试一下:我的应用程序使用Peta Poco,它只与PetaPoco_Obj.insert(数据)类似。我这边没有SQL语句。这是由ORM自己完成的。是的,你是对的。我试图重新更新,但它不起作用。但是我无法重新插入数据,因为我需要原始ID,而且数据量相当大。不幸的是,如果应用程序在数据库中存储了错误的值,那么SQL Server无法知道正确的值应该是什么。