SQL Server unicode 支持的具體體現(xiàn)
以下的文章主要向大家講述的是SQL Server unicode 支持,假如你對(duì)SQL Server unicode的實(shí)際應(yīng)用有興趣了解的話,你就可以通過以下的文章對(duì)其有更好的了解,以下就是具體方案的描述,希望在你今后的學(xué)習(xí)中會(huì)有所幫助。
所有的文檔和網(wǎng)上的文章都說N可以解決問題。但如果使用wstring bind后select...,則會(huì)發(fā)現(xiàn)得到的 wstring 格式的column很大可能結(jié)果是亂碼。
其實(shí)可以這樣解釋這個(gè)問題:鍵盤是沒法輸入uniocde編碼的,除非用微軟拼音的內(nèi)碼輸入。因此數(shù)據(jù)庫的客戶端軟件輸入表的內(nèi)容并非SQL Server unicode,即使在表設(shè)計(jì)的時(shí)候用了N。因此select出來的結(jié)果并不能用wsting來解析。
那么我們怎么在初始化數(shù)據(jù)庫的時(shí)候使用SQL Server unicode字符串呢?
- SQLRETURN SQLExecDirect(
- SQLHSTMT StatementHandle,
- SQLCHAR * StatementText,
- SQLINTEGER TextLength);
sql 在執(zhí)行的時(shí)候,調(diào)用SQLExecDirect,其sql語句是SQLCHAR 類型,其實(shí)就是unsigned char 的一段空間,并不一定要求這是一個(gè)以'\0'結(jié)尾的ascii 字符串。如果StatementText是一個(gè)ascii 字符串,TextLength可以設(shè)置為SQL_NTS。
StatementText是可以嵌入SQL Server unicode字符的,比如使用INSERT INTO T (c1,c2) VALUES(N'unicode string',data),這時(shí)候TextLength要填入整個(gè)串的長度而不是SQL_NTS。
拼寫出這樣一個(gè)串既不能用窄字符串的函數(shù)集合,也不能用寬字符串的函數(shù)集合。這里使用memcpy類的函數(shù)來構(gòu)造這樣的串,然后調(diào)用SQLExecDirect,取得了成功。比如,
- USE [test]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- CREATE TABLE [dbo].[電話薄](
- [姓名] [ntext] NULL,
- [電話] [nchar](32) NULL
- ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
- /*
- * insert a unicode string into the table
- *
- */
- struct buf_s{
- void * buf;
- int len;
- };
- /*
- *just be same as memcpy ,except for the return.
- */
- int memapend(void * dst, void * src ,int len)
- {
- memcpy(dst,src,len);
- return len;
- }
- void insert()
- {
- unsigned char sql_buf[256]={0};
- int len_sql=0;
- char str1[]="insert into 電話薄 (姓名,電話) values(N'";
- int len1=strlen(str1);
- wchar_t str2[]=L"張三";
- int len2=wcslen(str2)*sizeof(wchar_t);
- char str3[]="',N'";
- int len3=strlen(str3);
- wchar_t str4[]=L"010123456";
- int len4=wcslen(str4)*sizeof(wchar_t);
- char str5[]="')";
- int len5=strlen(str5);
- buf_s buf_s_a []={str1,len1,
- str2,len2,
- str3,len3,
- str4,len4,
- str5,len5};
- for (int i=0;i<sizeof(buf_s_a)/sizeof(buf_s);i++)
- {
- len_sql+=memapend(sql_buf+len_sql, buf_s_a[i].buf,buf_s_a[i].len);
- }
- SQLExecDirect(h,sql_buf,len_sql);
- }
- btw:find a good site for ms_sqlserver:
以上的相關(guān)內(nèi)容就是對(duì)SQL Server unicode 支持的介紹,望你能有所收獲。
【編輯推薦】