我的数据库表字符串列是nvarchar
.
但是当我使用应用程序插入数据时,我忘了添加N'
前缀。所以网页上的显示不是 UTF-8。这会导致很多问题。
如何使用一些 T-SQL 命令将所有现有表和所有字符串列类型和数据替换为 UTF-8?
我的数据库表字符串列是nvarchar
.
但是当我使用应用程序插入数据时,我忘了添加N'
前缀。所以网页上的显示不是 UTF-8。这会导致很多问题。
如何使用一些 T-SQL 命令将所有现有表和所有字符串列类型和数据替换为 UTF-8?
首先,请注意 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
正确重新读取所有数据。
试试这个——
询问:
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)