在sqlserver中的unicode数据类型和非unicode数据类型的区别
发布时间:2020-12-12 16:03:08 所属栏目:MsSql教程 来源:网络整理
导读:? Unicode 支持的字符范围更大。 ? ? 存储 ? Unicode ? 字符所需要的空间更大。 ? ? nchar ? 和 ? nvarchar ? 列最多可以有 ? 4,000 ? 个字符,而不象 ? char ? 和 ? varchar ? 字符那样可以有 ? 8,000 ? 个字符。 ? ?Unicode ? 常量使用 ? N ? 开头来指定:
?
Unicode
支持的字符范围更大。
? ? 存储 ? Unicode ? 字符所需要的空间更大。 ? ? nchar ? 和 ? nvarchar ? 列最多可以有 ? 4,000 ? 个字符,而不象 ? char ? 和 ? varchar ? 字符那样可以有 ? 8,000 ? 个字符。 ? ?Unicode ? 常量使用 ? N ? 开头来指定: N'A ? Unicode ? string' 。 ? ? 所有 ? Unicode ? 数据都使用相同的 ? Unicode ? 代码页。排序规则不控制用于 ? Unicode ? 列的代码页,仅控制比较规则和是否区分大小写等特性。? ? Unicode ? :宽字节字符集 ? ? 1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数? ? ? 可以调用 Microsoft ? Visual ? C++ 的运行期库包含函数 _mbslen 来操作多字节(既包括单字节也包括双字节)字符串。 ? ? 调用 strlen 函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的 0 之前有多少个字节。 ? ? 2. 如何对 DBCS (双字节字符集)字符串进行操作? ? ? 函数 描述 ? ? PTSTR ? CharNext ? ( ? LPCTSTR ? ) ; 返回字符串中下一个字符的地址 ? ? PTSTR ? CharPrev ? ( ? LPCTSTR,? LPCTSTR ? ); 返回字符串中上一个字符的地址 ? ? BOOL ? IsDBCSLeadByte( ? BYTE ? ) ; 如果该字节是 DBCS 字符的第一个字节,则返回非 0 值 ? ? 3. 为什么要使用 Unicode ? ? ? ( 1 ) 可以很容易地在不同语言之间进行数据交换。 ? ? ( 2 ) 使你能够分配支持所有语言的单个二进制 .exe 文件或 DLL 文件。 ? ? ( 3 ) 提高应用程序的运行效率。 ? ? Windows ? 2000 是使用 Unicode 从头进行开发的,如果调用任何一个 Windows 函数并给它传递一个 ANSI 字符串,那么系统首先要将字符串转换成 Unicode ,然后将 Unicode 字符串传递给操作系统。如果希望函数返回 ANSI 字符串,系统就会首先将 Unicode 字符串转换成 ANSI 字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用 Unicode 来开发应用程序,就能够使你的应用程序更加有效地运行。 ? ? Windows ? CE ? 本身就是使用 Unicode 的一种操作系统,完全不支持 ANSI ? Windows 函数 ? ? Windows ? 98 ? 只支持 ANSI ,只能为 ANSI 开发应用程序。 ? ? Microsoft 公司将 COM 从 16 位 Windows 转换成 Win32 时,公司决定需要字符串的所有 COM 接口方法都只能接受 Unicode 字符串。 ? ? 4. 如何编写 Unicode 源代码? ? ? Microsoft 公司为 Unicode 设计了 WindowsAPI ,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用 Unicode 来对它进行编译。只需要定义两个宏( UNICODE 和 _UNICODE ),就可以修改然后重新编译该源文件。 ? ? _UNICODE 宏用于 C 运行期头文件,而 UNICODE 宏则用于 Windows 头文件。当编译源代码模块时,通常必须同时定义这两个宏。 ? ? 5. Windows 定义的 Unicode 数据类型有哪些? ? ? 数据类型 说明 ? ? WCHAR Unicode 字符 ? ? PWSTR 指向 Unicode 字符串的指针 ? ? PCWSTR 指向一个恒定的 Unicode 字符串的指针 ? ? 对应的 ANSI 数据类型为 CHAR , LPSTR 和 LPCSTR 。 ? ? ANSI/Unicode 通用数据类型为 TCHAR , PTSTR,LPCTSTR 。 ? ? 6. 如何对 Unicode 进行操作? ? ? 字符集 特性 实例 ? ? ANSI 操作函数以 str 开头 strcpy ? ? Unicode 操作函数以 wcs 开头 wcscpy ? ? MBCS 操作函数以 _mbs 开头 _mbscpy ? ? ANSI/Unicode 操作函数以 _tcs 开头 _tcscpy ( C 运行期库) ? ? ANSI/Unicode 操作函数以 lstr 开头 lstrcpy ( Windows 函数) ? ? 所有新的和未过时的函数在 Windows2000 中都同时拥有 ANSI 和 Unicode 两个版本。 ANSI 版本函数结尾以 A 表示; Unicode 版本函数结尾以 W 表示。 Windows 会如下定义: ? ? #ifdef ? ? UNICODE ? ? #define ? ? CreateWindowEx ? ? CreateWindowExW ? ? #else ? ? #define ? ? CreateWindowEx ? ? CreateWindowExA ? ? #endif ? ? ? // ? !UNICODE ? ? 7. 如何表示 Unicode 字符串常量? ? ? 字符集 实例 ? ? ANSI “string” ? ? Unicode L“string” ? ? ANSI/Unicode T( “ string ” ) 或 _TEXT( “ string ” )if( ? szError[0] ? == ? _TEXT( ‘ J ’ ) ? ){ ? } ? ? 8. 为什么应当尽量使用操作系统函数? ? ? 这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程 Explorer.exe 所使用。由于这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入 RAM 。 ? ? 如: StrCat , StrChr , StrCmp 和 StrCpy 等。 ? ? 9. 如何编写符合 ANSI 和 Unicode 的应用程序? ? ? ( 1 ) 将文本串视为字符数组,而不是 chars 数组或字节数组。 ? ? ( 2 ) 将通用数据类型(如 TCHAR 和 PTSTR )用于文本字符和字符串。 ? ? ( 3 ) 将显式数据类型(如 BYTE 和 PBYTE )用于字节、字节指针和数据缓存。 ? ? ( 4 ) 将 TEXT 宏用于原义字符和字符串。 ? ? ( 5 ) 执行全局性替换(例如用 PTSTR 替换 PSTR )。 ? ? ( 6 ) 修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递 sizeof(szBuffer), 而应该传递( sizeof(szBuffer)/sizeof(TCHAR) 。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来分配内存。这就是说,应该调用 malloc(nCharacters ? *sizeof(TCHAR)), 而不是调用 malloc(nCharacters) 。 ? ? 10. 如何对字符串进行有选择的比较? ? ? 通过调用 CompareString 来实现。 ? ? 标志 含义 ? ? NORM_IGNORECASE 忽略字母的大小写 ? ? NORM_IGNOREKANATYPE 不区分平假名与片假名字符 ? ? NORM_IGNORENONSPACE 忽略无间隔字符 ? ? NORM_IGNORESYMBOLS 忽略符号 ? ? NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符 ? ? SORT_STRINGSORT 将标点符号作为普通符号来处理 ? ? 11. 如何判断一个文本文件是 ANSI 还是 Unicode ? ? ? 判断如果文本文件的开头两个字节是 0xFF 和 0xFE ,那么就是 Unicode ,否则是 ANSI 。 ? ? 12. 如何判断一段字符串是 ANSI 还是 Unicode ? ? ? 用 IsTextUnicode 进行判断。 IsTextUnicode 使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 ? IsTextUnicode 有可能返回不正确的结果。 ? ? 13. 如何在 Unicode 与 ANSI 之间转换字符串? ? ? Windows 函数 MultiByteToWideChar 用于将多字节字符串转换成宽字符串;函数 WideCharToMultiByte 将宽字符串转换成等价的多字节字符串。? ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |