AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 90296
Accepted
Nad
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 2 个回答
  • 30263 Views

2 个回答

  • Voted
  1. 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.

    • 14
  2. Raphael
    2021-06-17T06:18:27+08:002021-06-17T06:18:27+08:00

    只需将属性的类型更改为 TEXT 而不是 varchar: 在此处输入图像描述

    • -3

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve