1

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

但是当我使用应用程序插入数据时,我忘了添加N'前缀。所以网页上的显示不是 UTF-8。这会导致很多问题。

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

4

2 回答 2

2

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

话虽如此,您不能简单地UPDATE将数据更改为 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. 因此,您唯一能做的就是返回并INSERT正确重新读取所有数据。

于 2013-05-10T13:45:39.720 回答
1

试试这个——

询问:

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)
于 2013-05-10T06:43:42.977 回答