[T-SQL] 資料庫資料型態與數學符號,前置詞N..

  • 2811
  • 0
  • SQL
  • 2016-08-03

[SQL SERVER] 資料庫資料型態與數學符號,前置詞N..非Unicode DataType 與 Unicode DataType 

會有這樣的問題是因為,DB在匯入Excel的資料時,字串中有包含數學符號,(如2次方..)

結果在匯入資料後,查詢結果,發現有些字串出現了問號,或是亂碼。

因為是用SSIS進行資料匯入,所以覺得是SSIS的設定沒有設定好。就瘋狂的查找SSIS的設定哪裡出問題!!

(畢竟在轉入時,有將很多錯誤都設定忽略............這是不好的>"<)

經過一番折騰,才發現根本就是最最最基本的....... Unicode DataType 與 非Unicode DataType 的問題!!

放上自己測試時的SQL語法,可以直接驗證資料庫資料類別,在顯示與寫入資料出現的結果。

在 SQL Server 中處理 Unicode 字串常數時,必需為所有的 Unicode 字串加上前置詞 N
--建立基礎資料表..
DECLARE  @MathTypeN TABLE(
	[CR] [char](30),
	[VCR] [varchar](30) ,
	[NCR] [nchar](30),
	[NVCR] [nvarchar](30),
	[BRY] [binary](50),
	[VBRY] [varbinary](50)
) 
--寫入資料有加上 N 
INSERT INTO @MathTypeN(CR,VCR,NCR,NVCR,BRY,VBRY)
VALUES
( 
	N'mom™ 1.8V I²C',
	N'mom™ 1.8V I²C',
	N'mom™ 1.8V I²C',
	N'mom™ 1.8V I²C',
	CONVERT(binary,N'mom™ 1.8V I²C'),
	CONVERT(varbinary,N'mom™ 1.8V I²C')
)

SELECT CR,VCR,NCR,NVCR,BRY,VBRY
 FROM  @MathTypeN
 

結果咧!!!! 只要是N系列的(UNICODE字元)...就可以正常顯示資料.............

如果您沒有在 Unicode 字串常數前面加上 N 做為前置詞,則 SQL Server 會在使用字串前,先將其轉換成目前資料庫的非 Unicode 字碼頁。
 --建立基礎資料表
DECLARE  @MathType TABLE(
	[CR] [char](30),
	[VCR] [varchar](30) ,
	[NCR] [nchar](30),
	[NVCR] [nvarchar](30),
	[BRY] [binary](50),
	[VBRY] [varbinary](50)
) 
 
--寫入資料沒有加上N
INSERT INTO @MathType(CR,VCR,NCR,NVCR,BRY,VBRY)
VALUES
('mom™ 1.8V I²C',
'mom™ 1.8V I²C',
'mom™ 1.8V I²C',
'mom™ 1.8V I²C',
CONVERT(binary,'mom™ 1.8V I²C'),
CONVERT(varbinary,'mom™ 1.8V I²C'))
 
 SELECT CR,VCR,NCR,NVCR,BRY,VBRY
 FROM  @MathType

結果咧.......就是通通都給大大的問號!!!!

同場加映...二進位資料型態的轉換結果。

---二進位資料的轉換結果 
DECLARE  @MathTypeB  TABLE(
	[CR] [char](30),
	[VCR] [varchar](30) ,
	[NCR] [nchar](30),
	[NVCR] [nvarchar](30),
	[BRY] [binary](50),
	[VBRY] [varbinary](50)
) 

INSERT INTO @MathTypeB(CR,VCR,NCR,NVCR,BRY,VBRY)
VALUES
( N'mom™ 1.8V I²C',
N'mom™ 1.8V I²C',
N'mom™ 1.8V I²C',
N'mom™ 1.8V I²C',
CONVERT(binary,N'mom™ 1.8V I²C'),
CONVERT(varbinary,N'mom™ 1.8V I²C'))
,
('mom™ 1.8V I²C',
'mom™ 1.8V I²C',
'mom™ 1.8V I²C',
'mom™ 1.8V I²C',
CONVERT(binary,'mom™ 1.8V I²C'),
CONVERT(varbinary,'mom™ 1.8V I²C'))
 
 --利用CONVERT處理..資料匯出 
SELECT 
CONVERT(char(30),BRY) AS BRY_CR,
CONVERT(Nchar(30),BRY) AS BRY_NCR,
CONVERT(Varchar(30),BRY) AS BRY_VCR,
CONVERT(NVarchar(30),BRY) AS BRY_NVCR,
CONVERT(char(30),VBRY) AS VBRY_CR,
CONVERT(Varchar(30),VBRY) AS VBRY,
CONVERT(Nchar(50),VBRY) AS VBRY_NCR,
CONVERT(Nvarchar(50),VBRY) AS VBRY_NVCR
 FROM  @MathTypeB

結果!!!!.....記得要加N啦!!!

最後,用EXCEL將資料匯入的時後,資料的型態也要設定正確,不然轉入時,也會出現一堆無法轉入的錯誤資訊。

魔鬼就藏在基礎知識中啊!!!!!.....................

水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。