Nad Asked: 2015-01-28 04:59:18 +0800 CST2015-01-28 04:59:18 +0800 CST 2015-01-28 04:59:18 +0800 CST 在表中存储日文字符 772 我正在使用 SQL Server 2008 R2,并且我想将日文字符存储在表的一列中。 假设我想存储日文名称,我该如何实现?有没有简单的方法? sql-server collation 2 个回答 Voted Best Answer Solomon Rutzky 2015-01-28T05:49:24+08:002015-01-28T05:49:24+08:00 您需要使用orNCHAR(1 - 4000)来存储从 4001 到超过 1,073,741,822 个字符的任何位置(或者,如果存储如下所述的任何补充字符,则可能更少)。NVARCHARNVARCHAR(1 - 4000)NVARCHAR(MAX) 从技术上讲,如果您使用与代码页 932 关联的排序规则,则可以在字段中存储日文字符。但是,这被认为是一种“传统”方法,仍然会给您带来一些问题。处理这个问题的适当方法是使用上面提到的 Unicode 数据类型。有关. _ _VARCHARJapanese_*VARCHAR 您还需要指定日语排序规则,以便数据按预期进行比较和排序。您可以使用以下命令找到可用的日语排序规则: SELECT * FROM fn_helpcollations() WHERE name LIKE N'Japanese%'; 您在字段规范中使用该值,例如: CREATE TABLE dbo.test ( JapaneseText NVARCHAR(3000) COLLATE Japanese_CI_AS_KS_WS ); 请参阅 MSDN 页面的以下部分以获取有关使用排序规则的更多信息以及CI/ CS、AS/ AI、KS和中的每一个WS以及BIN/BIN2和SC(上面未显示)的含义:排序规则。 并且根据您需要存储的字符,您可能需要密切注意以SC(即“补充字符”)结尾的排序规则。默认情况下,NCHAR/NVARCHAR数据存储为UCS-2,这与 非常相似UTF-16,但UCS-2每个字符始终为 2 个字节。另一方面,UTF-16为了支持超过 65,536 个字符(最大大小为 2 个字节,或UInt16.MaxValue+ 1),可以存储 4 个字节的字符(称为“代理对”)。有关详细信息,请参阅以下有关排序规则和 Unicode 支持(“补充字符”部分)的 MSDN 页面。 绝对不要使用NTEXT。自 SQL Server 2005 出现以来,这已被弃用!使用它没有好处/理由,事实上,有几个缺点。 更新 虽然不理想,但可以将日文字符存储在CHAR/VARCHAR字段和变量中。这样做需要将数据库的默认排序规则设置为与代码页 932 (Shift-JIS) 关联的排序规则。您可以通过运行以下查询找到该排序规则列表: SELECT col.name FROM sys.fn_helpcollations() col WHERE COLLATIONPROPERTY(col.name, 'CodePage') = 932; 我通过使用该列表中的条目创建一个数据库并运行以下语句进行了一个简单的测试: SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation'); -- Japanese_Unicode_CI_AS SELECT COLLATIONPROPERTY(N'Japanese_Unicode_CI_AS', 'CodePage'); -- 932 SELECT CONVERT(VARCHAR(50), 0x944094B294CD985198EE9AD79AA0); -- 如抜範浪偃壅國 SELECT LEN('如抜範浪偃壅國'), DATALENGTH('如抜範浪偃壅國'); -- 7, 14 这是因为代码页 932 是双字节字符集 (DBCS),它不同于也是双字节的 UCS-2 / UTF-16。DBCS 字符集是 8 位编码中的双字节字符集(如扩展 ASCII 代码页)。您可以在最后一个查询中看到,DATALENGTH是字符LENgth的两倍,并且数据属于一种类型,因为字符串文字上VARCHAR没有前缀,并且was to , not 。Windows / SQL Server 支持 4 个 DBCS 代码页:NCONVERTVARCHARNVARCHAR 932 = 日语(Shift-JIS) 936 = 简体中文 (GB2312) 949 = 韩语 950 = 繁体中文 (Big5) 仅在绝对需要时才使用这些,例如支持与遗留系统的交互。当然,排序规则仍然可以使用,但将数据存储在NVARCHAR而不是VARCHAR. Raphael 2021-06-17T06:18:27+08:002021-06-17T06:18:27+08:00 只需将属性的类型更改为 TEXT 而不是 varchar:
您需要使用or
NCHAR(1 - 4000)
来存储从 4001 到超过 1,073,741,822 个字符的任何位置(或者,如果存储如下所述的任何补充字符,则可能更少)。NVARCHAR
NVARCHAR(1 - 4000)
NVARCHAR(MAX)
从技术上讲,如果您使用与代码页 932 关联的排序规则,则可以在字段中存储日文字符。但是,这被认为是一种“传统”方法,仍然会给您带来一些问题。处理这个问题的适当方法是使用上面提到的 Unicode 数据类型。有关. _ _
VARCHAR
Japanese_*
VARCHAR
您还需要指定日语排序规则,以便数据按预期进行比较和排序。您可以使用以下命令找到可用的日语排序规则:
您在字段规范中使用该值,例如:
请参阅 MSDN 页面的以下部分以获取有关使用排序规则的更多信息以及
CI
/CS
、AS
/AI
、KS
和中的每一个WS
以及BIN
/BIN2
和SC
(上面未显示)的含义:排序规则。并且根据您需要存储的字符,您可能需要密切注意以
SC
(即“补充字符”)结尾的排序规则。默认情况下,NCHAR
/NVARCHAR
数据存储为UCS-2
,这与 非常相似UTF-16
,但UCS-2
每个字符始终为 2 个字节。另一方面,UTF-16
为了支持超过 65,536 个字符(最大大小为 2 个字节,或UInt16.MaxValue
+ 1),可以存储 4 个字节的字符(称为“代理对”)。有关详细信息,请参阅以下有关排序规则和 Unicode 支持(“补充字符”部分)的 MSDN 页面。绝对不要使用
NTEXT
。自 SQL Server 2005 出现以来,这已被弃用!使用它没有好处/理由,事实上,有几个缺点。更新
虽然不理想,但可以将日文字符存储在
CHAR
/VARCHAR
字段和变量中。这样做需要将数据库的默认排序规则设置为与代码页 932 (Shift-JIS) 关联的排序规则。您可以通过运行以下查询找到该排序规则列表:我通过使用该列表中的条目创建一个数据库并运行以下语句进行了一个简单的测试:
这是因为代码页 932 是双字节字符集 (DBCS),它不同于也是双字节的 UCS-2 / UTF-16。DBCS 字符集是 8 位编码中的双字节字符集(如扩展 ASCII 代码页)。您可以在最后一个查询中看到,
DATALENGTH
是字符LEN
gth的两倍,并且数据属于一种类型,因为字符串文字上VARCHAR
没有前缀,并且was to , not 。Windows / SQL Server 支持 4 个 DBCS 代码页:N
CONVERT
VARCHAR
NVARCHAR
仅在绝对需要时才使用这些,例如支持与遗留系统的交互。当然,排序规则仍然可以使用,但将数据存储在
NVARCHAR
而不是VARCHAR
.只需将属性的类型更改为 TEXT 而不是 varchar: