【问题标题】:Why can I store an Ukrainian string in a varchar column?为什么我可以将乌克兰字符串存储在 varchar 列中?
【发布时间】:2015-12-05 01:06:25
【问题描述】:

我有点惊讶,因为我能够将乌克兰字符串存储在 varchar 列中。

我的桌子是:

create table delete_collation
(
   text1 varchar(100) collate SQL_Ukrainian_CP1251_CI_AS
)

并且使用这个查询我可以插入:

insert into delete_collation
values(N'використовується для вирішення квитки')

但是当我删除 'N' 时,它会在 select 语句中显示 ??????

没关系,还是我在使用整理来理解 unicode 和非 unicode 时遗漏了什么?

【问题讨论】:

  • 为什么不直接使用 Unicode?​​span>
  • 我将只使用 unicode。只是想澄清一些关于 DBCS 和 unicode 的疑虑。
  • 如果您有疑问,请阅读this
  • 优秀的文章..谢谢

标签: sql-server unicode multilingual


【解决方案1】:

来自MSDN

在 Unicode 字符串常量前加上字母 N。没有 N 前缀,字符串被转换为默认代码页 数据库。此默认代码页可能无法识别某些字符。

更新:
请看类似问题::
What is the meaning of the prefix N in T-SQL statements?
Cyrillic symbols in SQL code are not correctly after insert
sql server 2012 express do not understand Russian letters

【讨论】:

  • 默认代码页是什么意思。是在我的列整理中定义的代码页还是为数据库定义的代码页
  • 对于数据库:SELECT SERVERPROPERTY('Collation')
【解决方案2】:

扩展 MegaTron 的答案:

使用collate SQL_Ukrainian_CP1251_CI_AS,SQL Server 可以使用 CodePage 1251 将乌克兰字符存储在varchar 列中。

但是,当您指定不带 N 前缀的字符串时,该字符串将在发送到数据库之前转换为默认的非 unicode 代码页,这就是您看到 ?????? 的原因。

因此使用varchar 并照常进行整理是完全可以的,但在向数据库发送字符串时必须始终包含N 前缀,以避免中间转换为默认(非乌克兰语)代码页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多