Sql-Server

為什麼 varchar 數據類型允許 unicode 值?

  • May 21, 2021

我有一個帶有 varchar 列的表。它允許商標(™)、版權(©)和其他 Unicode 字元,如下所示。

Create table VarcharUnicodeCheck
(
col1 varchar(100)
)

insert into VarcharUnicodeCheck (col1) values ('MyCompany')
insert into VarcharUnicodeCheck (col1) values ('MyCompany™')
insert into VarcharUnicodeCheck (col1) values ('MyCompany░')
insert into VarcharUnicodeCheck (col1) values ('MyCompanyï')
insert into VarcharUnicodeCheck (col1) values ('MyCompany')

select * from VarcharUnicodeCheck

但是varchar 的定義說,它允許非 unicode 字元串數據。但是 Trademark(™) 和 Registered(®) 符號是Unicode字元。定義是否與 varchar 數據類型的屬性相矛盾?我讀了幾個連結,比如第一個第二個。但是當定義說它只允許非 unicode 字元串值時,我仍然不明白為什麼它允許 unicode 字元串。

但是 Trademark(™) 和 Registered(®) 符號是 Unicode 字元。

你在這裡錯了。您的字元串僅包含 ascii 字元。

這是一個簡單的測試,顯示您的字元都是 ascii(+ 一些擴展 ascii,ascii 程式碼在 128 到 255 之間):

declare @VarcharUnicodeCheck table
(
col1 varchar(100)
)

insert into @VarcharUnicodeCheck (col1) values ('MyCompany')
insert into @VarcharUnicodeCheck (col1) values ('MyCompany™')
insert into @VarcharUnicodeCheck (col1) values ('MyCompany░')
insert into @VarcharUnicodeCheck (col1) values ('MyCompanyï')
insert into @VarcharUnicodeCheck (col1) values ('MyCompany')

select *,
       right(col1, 1)as last_char, 
       ascii(right(col1, 1)) as_last_char_ascii
from @VarcharUnicodeCheck;

在這裡您可以清楚地看到您的所有字元都是 1 字節編碼的:

在此處輸入圖像描述

是的,它們不是純 ascii 字元,但它們是Extended ASCII

在這裡,我向您展示真正的 Unicode 字元Trademark(™)及其程式碼和二進製表示:

declare @t table (uni_ch nchar(1), ascii_ch char(1));
insert into @t values (N'™', '™');

select unicode(uni_ch) as [unicode of ™], 
      ascii(ascii_ch) [ascii of ™], 
      cast(uni_ch as varbinary(10)) as [uni_ch as varbinary], 
      cast(ascii_ch as varbinary(10)) as [ascii_ch as varbinary]
from @t;

在此處輸入圖像描述

最後,您可以看到 Trademark(™) Unicode 字元的程式碼是 8482 而不是 153:

select nchar(8482), nchar(153)

引用自:https://dba.stackexchange.com/questions/196570