在oracle数据库中插入字符串时,一些国家字符会被问号替换,即使它们插入NCHAR或NVARCHAR列 - 应该能够处理所有Unicode字符.
使用Oracle的SQL Developer,sqlplus或使用JDBC驱动程序会发生这种情况.
数据库NLS_CHARACTERSET设置为WE8ISO8859P1(西欧iso-8859-1).用于NCHAR列的NLS_NCHAR_CHARACTERSET设置为AL16UTF16.(UTF-16)
任何不在NLS_CHARACTERSET中的字符似乎都被替换为反转的问号.
设计数据库时,在决定 nvarchar 应该有多大时,您会考虑哪些决定。
如果我要制作一个地址表,我的直觉反应是地址行 1 为 nvarchar(255),就像旧的访问数据库一样。
我发现使用这个让我对旧的“字符串将被截断”感到烦恼。我知道可以通过限制输入框来防止这种情况,但如果用户确实拥有超过 255 的地址行,则应该允许这种情况。
我应该让我的 nvarchar(????) 有多大
有人可以解释一下:
SELECT
CASE WHEN CAST('iX' AS nvarchar(20))
> CAST('-X' AS nvarchar(20)) THEN 1 ELSE 0 END,
CASE WHEN CAST('iX' AS varchar(20))
> CAST('-X' AS varchar(20)) THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)
结果: 0 1
SELECT
CASE WHEN CAST('i' AS nvarchar(20))
> CAST('-' AS nvarchar(20)) THEN 1 ELSE 0 END,
CASE WHEN CAST('i' AS varchar(20))
> CAST('-' AS varchar(20)) THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)
结果: 1 1
在第一个查询中,nvarchar()结果不是我所期望的,但是删除Xmake会使nvarchar()排序按预期发生.
(我原来的查询中使用的''和N''文字语法来区分varchar()和nvarchar() …
我有一个我为我们的生产线创建的脚本,用户在执行之前将一些变量输入到脚本中.问题是变量是NVARCHAR(9),如果用户输入10个字符,那么最后一个字符被切断(正如预期的那样)我想知道的是如果输入一个值,我怎么能让SQL抛出一个错误太长?这个问题源于用户指责他们的输入.例:
Valid input -
DECLARE @ClientCode NVARCHAR(9)
SET @ClientCode = N'ABCDEFGHI'
SELECT @ClientCode
Results
ABCDEFGHI
Run Code Online (Sandbox Code Playgroud)
输入无效 -
DECLARE @ClientCode NVARCHAR(9)
SET @ClientCode = 'ABCDDEFGHI'
SELECT @ClientCode
Results
ABCDDEFGH
Run Code Online (Sandbox Code Playgroud)
我希望的是一个SSMS会引发错误的设置.我希望避免的是 -
DECLARE @ClientCode NVARCHAR(50)
...
IF LEN(@ClientCode) > 9
RAISERROR('Too long dummy.',16,1)
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
在我的桌子上
LoginDate
2013-08-29 13:55:48
Run Code Online (Sandbox Code Playgroud)
该loginDate列的数据类型是nvarchar(150)
我想logindate使用SQL命令将列转换为日期时间格式
预期结果.
LoginDate
29-08-2013 13:55:48
Run Code Online (Sandbox Code Playgroud) 我正在使用Entity Framework 4.3.1,代码优先,我正在查看正在生成的查询的SQL事件探查器.这是一个例子:
正如您所看到的 - 它指定了参数,nvarchar(max)但在我的配置中,我指定了一个MaxLength值.因此,我希望参数将作为参数传递.nvarchar(n) 因为它没有这样做,我们发现查询运行缓慢,这个简单的更改会加快它们的速度.
有谁知道我们如何说服实体框架生成正确的nvarchar长度?
这是我的实体和配置代码:
public class StorageTransportOrderItem
{
public string StorageTransportOrderItemNumber { get; set; }
public string StorageNumber { get; set; }
[...]
}
Run Code Online (Sandbox Code Playgroud)
ToTable("StorageTransportOrderItem");
Property(p => p.StorageTransportOrderNumber)
.HasMaxLength(10);
Property(d => d.StorageTransportOrderItemNumber)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
.HasMaxLength(4);
HasKey(d => new
{
d.StorageTransportOrderItemNumber,
d.StorageNumber,
d.StorageTransportOrderNumber
});
Run Code Online (Sandbox Code Playgroud)
FROM [dbo].[StorageTransportOrder] AS [Extent1]
WHERE ([Extent1].[StorageNumber] = @p__linq__0) AND ([Extent1]
[StorageTransportOrderNumber] = @p__linq__1)
) AS [Limit1]',N'@p__linq__0 nvarchar(max) ,@p__linq__1 nvarchar(max)
',@p__linq__0=N'200',@p__linq__1=N'0001374850'
Run Code Online (Sandbox Code Playgroud)
请注意nvarchar(max),这是使它变慢的原因.
我有一个问题,我不知道如何解决它.
我在数据库中有一个简单的表
CREATE TABLE [dbo].[home] (
[Id] INT NOT NULL,
[text] NTEXT NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
Run Code Online (Sandbox Code Playgroud)
我在visual studio 2012中使用FormView,FormView与数据库的Home表连接,并且有编辑/更新/删除选项.
问题是当我尝试更新te数据库中的文本时出现错误
The data types ntext and nvarchar are incompatible in the equal to operator.
Run Code Online (Sandbox Code Playgroud)
请帮帮忙..
这是我用来在DB中编写的代码:
<%@ Page Title="" Language="C#" MasterPageFile="~/admin/adminmaster.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="admin_Default" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:FormView ID="FormView1" runat="server" DataKeyNames="Id" DataSourceID="SqlDataSource1">
<EditItemTemplate>
text:
<asp:TextBox Text='<%# Bind("text") %>' runat="server" ID="textTextBox" /><br />
Id:
<asp:Label Text='<%# Eval("Id") %>' runat="server" ID="IdLabel1" /><br …Run Code Online (Sandbox Code Playgroud) 我们最近开始在之前运行的应用程序中看到此错误。没有进行任何代码更改来导致错误,也没有更改数据库(据我所知)。据说最近对服务器的数据源配置(驱动程序版本)进行了一些更改,但我没有明确的细节。
应用程序在失败操作中使用的表中没有任何 nvarchar2 列。hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
如果没有一些手动编码,PHP PDO ODBC 似乎无法存储 NVARCHAR 字符 (UTF-16)。这似乎是互联网上一个相当常见的“错误”,而且似乎没有人有明确的解决方案。
\n\n如何重现该错误
\n\n\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf意思是你好)\xc3\xa3\xe2\x80\x9c\xc3\xa3\xe2\x80\x9a\xe2\x80\x9c\xc3\xa3\xc2\xab\xc3\xa3\xc2\xa1\xc3\xa3\xc2\xaf\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf情况还不错,但也不好。PHP 可以工作,但是当您有其他不是 PHP 的应用程序从您的数据库访问该信息时,它们将得到错误的字符串:\xc3\xa3\xe2\x80\x9c\xc3\xa3\xe2\x80\x9a\xe2\x80\x9c\xc3\xa3\xc2\xab\xc3\xa3\xc2\xa1\xc3\xa3\xc2\xaf。
理想情况下,您希望到处\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf都有。
症状
\n\nPDO 似乎没有任何 NVARCHAR 的概念,即使用 16 位编码的字符。事实上,您通过 PDO 传递到 SQL SERVER 或从 SQL SERVER 检索的所有内容都将以 8 位为单位。如何“证明”呢?这里是 :
\n\n\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf。您首先必须知道 PHP 将字符串视为二进制并且(如果这样设置)它将以 UTF-8 存储它们。
\n\n因此,如果我们查看 的二进制表示形式\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf,您将得到E38193E38293E381ABE381A1E381AFSQL SERVER 为您提供的二进制表示形式\xc3\xa3\xe2\x80\x9c\xc3\xa3\xe2\x80\x9a\xe2\x80\x9c\xc3\xa3\xc2\xab\xc3\xa3\xc2\xa1\xc3\xa3\xc2\xaf。(取决于您的整理)
摘要:在EXEC sp_executesql @code失败的含量比4000更长@code,但@code不截断为4000个Unicode字符。
我正在观察 SQL Server 2014 Developer Edition 上的问题。
更多细节:我的 SQL 安装脚本动态定义了一些代码,因为它应该修改代码以反映环境(只有一次,在安装过程中)。让以下@datasource变量捕获特定环境的结果:
DECLARE @datasource nvarchar(100) = N'testdb.dbo.source_table'
Run Code Online (Sandbox Code Playgroud)
的@code变量声明为的nvarchar(max)类型和REPLACE函数用于修改字符串根据需要(即,以取代由所述占位符@datasource内容) -见下面的代码段。
在 Management Studio 中执行sp_executesql时@code,显示以下错误:
消息 156,级别 15,状态 1,过程 my_sp,第 86 行
关键字“AS”附近的语法不正确。
消息 102,级别 15,状态 1,过程 my_sp,第 88 行
“WHERE”附近的语法不正确。
下面的代码片段是上述方式失败的代码的精确副本(将被复制)。功能可能并不重要——可能只有代码的长度很重要。的@code内容显然是由截短sp_executesql; 但是,它不应该是(见下文):
-- ... repeated from above
DECLARE @datasource nvarchar(100) = N'testdb.dbo.source_table'
DECLARE @code nvarchar(MAX) …Run Code Online (Sandbox Code Playgroud)