Sql-Server
為什麼 varchar 數據類型允許 unicode 值?
我有一個帶有 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)