如何将长字符串插入到 UTF8 排序的 varchar(N) 列中?

问题描述 投票:0回答:1

我在 VARCHAR(MAX) 源中有数据,我需要将其作为 VARCHAR(N) 插入到另一个表中。 我需要使用的排序规则是UTF8(特别是Czech_100_CI_AS_SC_UTF8)。 问题是,即使我将数据减少到最大允许长度(使用 LEFT 函数或 SUBSTRING 或其他),某些数据的插入也会失败,

Msg 2628, Level 16, State 1, Line 25
String or binary data would be truncated in table 'tablename', column 'columnname'. Truncated value: 'sometext'.

我的问题是,如何正确缩短文本,使其适合,但仍保留尽可能多的内容? 字符串的实际长度取决于所使用的字符,对于纯拉丁文本,可以使用完整长度。如果有一些重音字符,则会稍微缩短可用长度。如果文本完全是 unicode(非拉丁脚本,例如日语),则可用长度可能会减少一半或三分之一。

重现步骤:

DROP TABLE IF EXISTS [#tmpdl]
GO
CREATE TABLE [#tmpdl] ([Txt] VARCHAR(10) COLLATE Czech_100_CI_AS_SC_UTF8 NULL)
GO
INSERT INTO [#tmpdl] ([Txt]) VALUES (LEFT('123456789abcd', 10)) --this works
GO
INSERT INTO [#tmpdl] ([Txt]) VALUES (LEFT('123456789ábcd', 10)) --this fails
GO
INSERT INTO [#tmpdl] ([Txt]) VALUES (LEFT(N'一二三四', 10)) --this also fails
GO
sql-server t-sql utf-8 varchar sql-server-collation
1个回答
0
投票
INSERT INTO [#tmpdl] ([Txt]) VALUES (cast(N'123456789ábcd' COLLATE Czech_100_CI_AS_SC_UTF8 as varchar(10)));
INSERT INTO [#tmpdl] ([Txt]) VALUES (cast(N'一二三四' COLLATE Czech_100_CI_AS_SC_UTF8 as varchar(10)));
© www.soinside.com 2019 - 2024. All rights reserved.