`

在存储过程里使用N前缀 Mssql

 
阅读更多

2011-3-31

摘自:Mssql 2005的帮助页

 

在服务器上执行的代码中(例如在存储过程和触发器中)显示的 Unicode 字符串常量必须以大写字母 N 为前缀。即使所引用的列已定义为 Unicode 类型,也应如此。如果不使用 N 前缀,字符串将转换为数据库的默认代码页。这可能导致不识别某些字符。

例如,在前面示例中创建的存储过程可以按以下方式在服务器上执行:

 
EXECUTE Product_Info @name = N'Chain'

使用 N 前缀的要求适用于服务器上产生的字符串常量和从客户端发送的字符串常量。

 

 

 

 

---------------------------------------------------------------------------------------

在数据库里定义使用Unicode的好处

 

若要使数据库识别 Unicode,除了使用 nchar、nvarchar 和 ntext 数据类型定义 Unicode 存储外,还可以定义识别 Unicode 的客户端交互。可以通过在数据库服务器端执行下列操作来定义识别 Unicode 的客户端交互:

  • 在表列以及 CONVERT() 和 CAST() 操作中,将非 Unicode 数据类型转换为 Unicode 数据类型。

  • 使用 ASCII() 和 CHAR() 函数的 Unicode 等价函数 UNICODE() 和 NCHAR() 来替换它们。

  • 以 Unicode 格式定义存储过程和触发器的变量和参数。

  • 以字母 N 为前缀标识 Unicode 字符串常量。

使用 UNICODE()、NCHAR() 和其他函数

ASCII() 函数返回所传递字符的非 Unicode 字符代码。因此,在为非 Unicode 字符串使用 ASCII 函数的情况下为 Unicode 字符串使用等价函数 UNICODE()。对于 CHAR 函数也是如此;NCHAR 是其 Unicode 的等价函数。

由于 SOUNDEX() 函数是基于英语拼音规则定义的,因此除非字符串只包含拉丁字符 A 到 Z 和 a 到 z,否则此函数对于 Unicode 字符串是没有意义的。

ASCII、CHAR 和 SOUNDEX 可以传递 Unicode 参数,但这些参数被隐式转换为非 Unicode 字符串。这可能导致处理之前 Unicode 字符丢失,因为这些函数在定义时对非 Unicode 字符串执行操作。

除了 UNICODE() 和 NCHAR() 函数以外,下列字符串操作函数会尽可能支持 Unicode:CHARINDEX()、LEFT()、LEN()、UPPER()、LOWER()、LTRIM()、RTRIM()、PATINDEX()、REPLACE()、QUOTENAME()、REPLICATE()、REVERSE()、STUFF()、SUBSTRING() 和 UNICODE()。这些函数接受 Unicode 参数,为 Unicode 字符串留出 2 字节的字符边界,并在输入参数为 Unicode 格式时使用 Unicode 排序规则进行字符串比较。

定义存储过程中的参数

使用 Unicode 数据类型定义参数可以保证客户端请求或输入在服务器上隐式转换为 Unicode 格式,并在处理中不被损坏。如果将参数指定为 OUTPUT 参数,Unicode 类型也可以在其返回到客户端时使损坏的几率降到最低程度。

在以下存储过程中,变量作为 Unicode 数据类型声明。

  复制代码
CREATE PROCEDURE Product_Info
    @name nvarchar(40)
AS
SELECT p.ListPrice, v.Name
    FROM Production.Product p 
        INNER JOIN Purchasing.ProductVendor pv
            ON p.ProductID = pv.ProductID  
        INNER JOIN Purchasing.Vendor v
            ON pv.VendorID = v.VendorID
WHERE p.Name = @name;

使用 N 前缀

在服务器上执行的代码中(例如在存储过程和触发器中)显示的 Unicode 字符串常量必须以大写字母 N 为前缀。即使所引用的列已定义为 Unicode 类型,也应如此。如果不使用 N 前缀,字符串将转换为数据库的默认代码页。这可能导致不识别某些字符。

例如,在前面示例中创建的存储过程可以按以下方式在服务器上执行:

  复制代码
EXECUTE Product_Info @name = N'Chain'

使用 N 前缀的要求适用于服务器上产生的字符串常量和从客户端发送的字符串常量。

 

分享到:
评论

相关推荐

    mysql 流水号 存储过程 附表结构

    总的来说,了解如何在MySQL中创建和使用存储过程生成流水号,对于开发高效且健壮的数据库应用至关重要。结合附带的表结构,我们可以构建一个强大的流水号生成系统,既能满足业务需求,又易于扩展和维护。

    mysql procedure源码

    在MySQL中创建存储过程主要使用`CREATE PROCEDURE`语句。语法格式如下: ```sql CREATE PROCEDURE proc_name ([proc_parameter[,...]]) BEGIN -- SQL语句 END; ``` 其中`proc_name`为存储过程的名字,`proc_...

    MYSQL规范.pdf

    MySQL的默认存储引擎在不同版本间有所不同,推荐使用Innodb存储引擎,因为它支持事务处理、行级锁和更好的数据恢复性,并且在高并发环境下能提供更好的性能。数据库和表应当统一使用UTF8字符集,以避免字符集转换...

    Oracle到mysql的迁移步骤及各种注意事项_数据库.docx

    - MySQL中没有Oracle中的“包”概念,因此在迁移时,你需要将Oracle的存储过程名直接作为MySQL的存储过程名,可能需要加上原本的包名作为前缀。 - MySQL存储过程的创建语法有所不同,例如使用`DELIMITER $$`来更改...

    MySQL的基本介绍及优化实践.pptx

    - **系统架构**:MySQL采用客户端/服务器架构,主要包括客户端连接器、查询缓存、分析器、优化器、执行器以及存储引擎等组件。 - **SQL语句模块执行过程**: - **客户端连接器**:管理客户端与服务器之间的连接,并...

    MySQL数据库设计、优化

    MySQL作为一种广泛使用的开源关系型数据库管理系统,其设计的好坏直接影响着系统的性能、稳定性和可维护性。因此,合理的数据库设计对于确保应用程序能够高效运行至关重要。 #### 二、数据库设计规范 ##### 基础...

    MySQL索引背后的数据结构及算法原理

    在B+Tree中,所有数据记录都存储在叶子节点上,而非叶子节点只用于加速查找过程。这样的设计使得B+Tree在查找、插入和删除操作上具有较高的性能,尤其是在处理大量数据时更为明显。 #### 为什么使用B-Tree(B+Tree) ...

    MySQL 精选的 60 道面试题(包含答案)

    索引下推:MySQL 5.6 引入的索引下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。 9. 哪些操作会导致索引失效?对索引使用左或者左右模糊匹配,对索引...

    第2章 用 MySQL 处理数据

    在使用MySQL处理数据时,数据类型的选择至关重要。不同的数据类型会影响存储空间的需求、处理速度以及查询效率等方面。例如,选择合适的整数类型(如TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT等)不仅能够节省存储...

    Mysql中文参考手册

    - 在字符串内部,如果需要引用引号本身,可以使用双引号("")或单引号(''),或者通过转义字符(\)前缀来实现。 - 如果字符串以双引号界定,则内部的单引号不需要特殊处理;反之亦然。 #### 三、数字的书写...

    MySQL前缀索引导致的慢查询分析总结

    前缀索引是一种在MySQL中优化大字段索引的技术,主要应用于字符串类型的字段,如VARCHAR或TEXT类型。这种索引只包含字段的前N个字符,以减少索引的存储空间,尤其对于非常长的字段,可以显著降低索引占用的磁盘空间...

    MySQL数据库:常量、变量.pptx

    N前缀必须为大写。只能用单引号括起字符串。 举例:N‘hello’,N‘How are you!’ Unicode 数据中的每个字符用两个字节存储,而每个ASCII字符用一个字节存储。 在字符串中不仅可以使用普通的字符,也可使用几个转义...

    什么是Tire树1

    在Java中,Trie树的节点通常由一个枚举类型定义节点种类(如内部节点和叶子节点),并使用一个字符数组来存储指向子节点的指针。以下是一个简化的TrieNode类的示例: ```java enum NodeKind {LN, BN} class ...

    MySQL索引及其原理1

    MyISAM使用非聚集索引,数据和索引分开存储,而InnoDB使用聚集索引,索引和数据在同一结构中。 7. **如何使用索引** - **创建索引**:可以在创建表时指定,也可在创建后添加。 - **删除索引**:当不再需要索引时...

    Mysql数据的数据类型说明

    在MySQL数据库中,合理选择数据类型对于优化存储空间、提高查询效率以及确保数据准确性具有重要作用。本文将围绕给定文件提供的信息,深入探讨MySQL中的各种数据类型,包括它们的特性、用途及注意事项。 #### 整型...

    MySQL数据库设计规范1

    18. **禁止存储文件**:避免在数据库中存储图片、文件等大对象,应使用文件系统或专门的文件存储服务。 19. **结构变更通知**:表结构修改需经过DBA审核。 **二、索引设计规范** 1. **非唯一索引**:命名为`idx_...

    MySQL索引背后的数据结构及算法原理.pdf

    在MySQL中,不同的存储引擎对索引的支持有所不同。MyISAM引擎使用BTree实现索引,但不支持事务处理。InnoDB引擎则不仅使用BTree索引,而且支持事务处理,它是MySQL默认的存储引擎。InnoDB的主键索引是聚集索引,数据...

    深入理解mysql索引底层.zip

    MySQL是一种广泛使用的开源关系型数据库管理系统,其性能和效率很大程度上取决于索引的使用和设计。索引是数据库系统中的重要组成部分,它极大地提升了数据查询的速度。本资料“深入理解MySQL索引底层”将帮助我们...

    mysql 参考

    根据给定文件的部分内容,我们可以深入探讨MySQL数据库中的一些关键概念和操作,特别是关于字符串和数字的处理方式。以下是对标题、描述以及...理解并掌握这些知识,对于有效地使用MySQL进行数据存储和检索至关重要。

    MySQL索引背后的数据结构及算法原理.docx

    本文主要聚焦于BTree索引,这是MySQL中最常见的一种索引类型,尤其是在日常使用中。BTree索引(包括B+Tree)是大多数数据库系统和文件系统选择的索引结构,因为它能够适应大容量数据并提供高效的查找性能。 首先,...

Global site tag (gtag.js) - Google Analytics