我正在使用BULK INSERT导入CSV文件.CSV文件中的一列包含一些包含分数的值(例如1m½f).
我不需要对分数进行任何数学运算,因为这些值仅用于显示目的,因此我将列设置为nvarchar.该BULK INSERT作品,但是当我SQL中查看记录的部分已被替换一分钱符号(¢),因此显示的文本1m¢f.
我很想知道为什么会这样,以及如何解决问题的任何想法.该BULK INSERT命令是:
BULK INSERT dbo.temp FROM 'C:\Temp\file.csv'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' );
Run Code Online (Sandbox Code Playgroud) 我们将迁移一个应用程序以使其支持Unicode,并且必须在整个数据库的unicode字符集或存储在N [VAR] CHAR2中的unicode列之间进行选择.
我们知道如果我们选择NVARCHAR2,我们将不再有可能使用Oracle Text索引列内容,因为Oracle Text只能根据CHAR类型索引列.
除此之外,从Oracle收获的可能性是否可能出现其他重大差异?
此外,是否有可能在较新版本的Oracle中添加一些新功能,但只支持CHAR列或NCHAR列,但不支持两者?
谢谢您的回答.
谢谢您的回答.我将讨论你的观点,适用于我们的案例:
我们的应用程序通常单独存储在Oracle数据库中,并负责处理数据本身.连接到数据库的其他软件仅限于Toad,Tora或SQL开发人员.
我们还使用SQL*Loader和SQL*Plus与数据库通信以获取基本语句或在产品版本之间进行升级.我们还没有听说过有关NVARCHAR2的所有软件的任何具体问题.
我们也不知道我们客户中的数据库管理员想要在数据库上使用其他无法支持NVARCHAR2数据的工具,我们并不关心他们的工具是否可能会中断,毕竟他们都熟练工作并且可能会发现必要时还有其他工具.
你的最后两点对我们的案例更有洞察力.我们不使用Oracle的许多内置包,但它仍然会发生.我们将探讨这个问题.
如果我们wchar_t用于存储UTF-16 的应用程序(在Visual C++下编译)必须对所有已处理的数据执行编码转换,我们是否还会期望性能中断?
在关于TDWTF的一个稍微激烈的讨论中,出现了一个关于DB中varchar列大小的问题.
例如,取一个包含人名(仅名称,无姓)的字段.很容易看出它不会很长.大多数人的名字少于10个字符,少数是20以上的人.如果你要制作你的专栏,比如varchar(50),它肯定会拿到你遇到的所有名字.
但是对于大多数DBMS而言,无论是制作varchar(50)还是varchar(255),它的大小或速度都没有区别.
那么为什么人们试图让他们的列尽可能小?我知道在某些情况下你可能确实想要限制字符串的长度,但大多数情况并非如此.如果有一个名字极长的人的罕见情况,那么更大的利润只会是有益的.
对于MSSQL: http://msdn.microsoft.com/en-us/library/ms176089.aspx
存储大小是输入的实际数据长度+ 2个字节.
对于MySQL: http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html
如果列值需要0 - 255个字节,则为L + 1个字节;如果值可能需要超过255个字节,则为L + 2个字节
我找不到Oracle的文档,而且我没有使用过其他DBMS.但我没有理由相信它有任何不同.
我们正在将一些数据从sql server迁移到oracle.对于NVARCHAR在SQL Server中定义的NVARCHAR列,我们开始在Oracle中创建列,认为它们类似.但看起来它们不是.
我已经在stackoverflow上阅读了几篇帖子,并希望确认我的发现.
如果数据库字符集是AL32UTF8(在我们的情况下也是如此),Oracle VARCHAR2已经支持unicode.
SQLServer VARCHAR 不支持unicode.SQLServer明确要求列在NCHAR/NVARCHAR类型中以unicode(特别是2字节UCS-2格式)存储数据.
因此,可以/应该将SQL Server NVARCHAR列迁移为Oracle VARCHAR2列是否正确?
我正在尝试将现有的SQL NText列更改为nvcharmax(max),并在大小限制上遇到错误.我相信,有大量的现有数据,其中一些数据超过了8k的限制.
我们希望转换它,以便在LINQ中搜索该字段.
我尝试过的2x SQL语句是:
update Table
set dataNVarChar = convert(nvarchar(max), dataNtext)
where dataNtext is not null
update Table
set dataNVarChar = cast(dataNtext as nvarchar(max))
where dataNtext is not null
Run Code Online (Sandbox Code Playgroud)
而我得到的错误是:
Cannot create a row of size 8086 which is greater than the allowable maximum row size of 8060.
Run Code Online (Sandbox Code Playgroud)
这是使用SQL Server 2008.
任何帮助表示感谢,谢谢.
下面标记的答案是正确的,SQL 2008可以在我的情况下将列更改为正确的数据类型,并且我们在其上使用的LINQ利用应用程序没有戏剧性:
alter table [TBL] alter column [COL] nvarchar(max)
Run Code Online (Sandbox Code Playgroud)
我也被建议跟进:
update [TBL] set [COL] = [COL]
Run Code Online (Sandbox Code Playgroud)
通过将数据从lob结构移动到表(如果长度小于8k)来完成转换,从而提高性能/保持正常.
如果数据库中有2列,例如.
code varchar(3)
name nvarchar(50)
Run Code Online (Sandbox Code Playgroud)
如何通过代码告诉hibernate传递varchar?
在hibernate映射中,字符串映射到nvarchar,它产生如下查询:
Select code, name From table where code=N'AAA' (instead of code='AAA')
Run Code Online (Sandbox Code Playgroud)
这是非常糟糕的,因为它导致索引扫描而不是索引搜索操作(扫描所有索引节点而不是直接转到请求的节点)
由于代码在数百万行以及多个索引和外键中使用,因此将其从varchar更改为nvarchar将导致性能下降(更多IO操作,因为nvarchar使用的空间比varchar多两倍).
有没有办法告诉hibernate根据数据库类型进行映射,而不是Java类型?
谢谢
在SqlServer中,我们可以使用NVarchar(MAX),但这在sqlite中是不可能的.我可以为Nvarchar(?)提供的最大大小是多少?
我知道转换nvarchar时varchar,某些数据会丢失/更改.
但是,在将varchar数据类型转换为nvarchar?时,是否存在数据更改的风险?
IVe阅读了很多关于此的内容.
还有一些问题:
我不是在谈论区分大小写......
如果我有一个char(?例如)并且他存储在nvarchar - 它可以容纳任何东西,为什么我需要collation在这里?
如果我是"FaceBook"并且我需要能够存储语言中的all字符all,那么校对和我的nvarchar列之间的关系是什么?
提前致谢.
保持nvarchar字段唯一的好方法是什么.我有一个存储mp3文件网址的字段.url长度可以是10个字符到4000之间的任何值.我试图创建一个索引,它说它不能创建索引,因为总长度超过900个字节.
如果该字段未编入索引,则搜索任何内容的速度都会很慢.我正在使用c#,asp.net mvc作为前端.
问候
Paraminder
nvarchar ×10
sql ×5
sql-server ×3
varchar ×3
oracle ×2
unicode ×2
bulkinsert ×1
collation ×1
database ×1
hibernate ×1
max-size ×1
size ×1
sqldatatypes ×1
sqlite ×1
varchar2 ×1