比如说将编码从GBK改为UTF8或者将编码从UTF8改为GBK。
29 个解决方案
#1
排序规则 默认的是什么?
用unicode 可以用类型 nvarchar nchar等
用unicode 可以用类型 nvarchar nchar等
#2
服务器级别,确定方法很简单。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
#3
看错了。。。看成MYSQL~
#4
排序规则默认Chinese_PRC_CI_AS
通过这里可以看出其中的汉字是UTF编码还是GBK编码吗?
通过这里可以看出其中的汉字是UTF编码还是GBK编码吗?
#5
#6
要用汉字的话 就用unicode存储 nvarchar
#7
排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。
如:
Chinese_PRC_CS_AI_WS
前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则,按拼音排序。
Chinese_PRC_Stroke 表示按汉字笔画排序;
排序规则的后半部份即后缀 含义:
_BIN 二进制排序
_CI(CS) 是否区分大小写,CI不区分,CS区分(case-insensitive/case-sensitive)
_AI(AS) 是否区分重音,AI不区分,AS区分(accent-insensitive/accent-sensitive)
_KI(KS) 是否区分假名类型,KI不区分,KS区分(kanatype-insensitive/kanatype-sensitive)
_WI(WS) 是否区分宽度 WI不区分,WS区分(width-insensitive/width-sensitive)
区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,
比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项。
#8
你好,谢谢,但是我输入的东西中大约一半是汉字,一半是英文。
而且现在的问题是一行数据总大小,
若为GBK编码,汉字每编码为2字节,我的数据中mssql中一行的总大小如何都会在6800字节以内。
但是对UTF-8格式的汉字而言,很多汉字的编码是3个字节,这样下来一行的总大小就可能超过8K,而mssql中一行的大小是不能够超过8K的,这样就会产生一个错误。
若想避免这个错误,最佳的方法就是在mssql中使用GBK编码,但是我不知道怎么控制。
而且现在的问题是一行数据总大小,
若为GBK编码,汉字每编码为2字节,我的数据中mssql中一行的总大小如何都会在6800字节以内。
但是对UTF-8格式的汉字而言,很多汉字的编码是3个字节,这样下来一行的总大小就可能超过8K,而mssql中一行的大小是不能够超过8K的,这样就会产生一个错误。
若想避免这个错误,最佳的方法就是在mssql中使用GBK编码,但是我不知道怎么控制。
#9
如果是nvarchar字段类型 使用的是Unicode编码类型 一个字符占2个字节
所以最多使用 nvarchar(4000)
当然 如果你用的是SQL Server2005及其以上版本 你可以使用 nvarchar(max) 一行大小最多可以达到2GB
mssql中一行的大小是不能够超过8K的,这样就会产生一个错误。
==》
这句话是对的 但是他只是相对于一般的数据类型而言 如果表中包含 text ntext nvarchar(max)等特殊字段类型 则没有这个限制
#10
嗯,是的,因为text在该行只占用16个字节,就是指个路而已。
我有八个列,每个列大约800个字节,用text类型就有点过份了,
但是用varchar的话,若汉字是二字节的,那么总共6400个字节再加上id列,加上日期等一些小列也才6800字节。若有些汉字是三字节的,那就无法保证一定不超过8000字符。
用nvarchar的话那是一定会超过8000字符的,毕竟里面有一些英文字符,若那些算两字节的话就会超出。
在这种情况下每列800字节的东西也用test类型比较好吗?
我有八个列,每个列大约800个字节,用text类型就有点过份了,
但是用varchar的话,若汉字是二字节的,那么总共6400个字节再加上id列,加上日期等一些小列也才6800字节。若有些汉字是三字节的,那就无法保证一定不超过8000字符。
用nvarchar的话那是一定会超过8000字符的,毕竟里面有一些英文字符,若那些算两字节的话就会超出。
在这种情况下每列800字节的东西也用test类型比较好吗?
#11
汉字若是三字节的话,每列可能就不止800个字节。
汉字是两字节的话,每列可能只有600字节,在一些特殊的情况下可能达到700多字节。
汉字是两字节的话,每列可能只有600字节,在一些特殊的情况下可能达到700多字节。
#12
其中难受的地方在于0.8K字节的东西用text来保存,心里总是堵得慌。
以前只是大于8K的地方用text来保存。
以前只是大于8K的地方用text来保存。
#13
我有八个列,每个列大约800个字节,用text类型就有点过份了,
但是用varchar的话,若汉字是二字节的,那么总共6400个字节再加上id列,加上日期等一些小列也才6800字节。若有些汉字是三字节的,那就无法保证一定不超过8000字符。
用nvarchar的话那是一定会超过8000字符的,毕竟里面有一些英文字符,若那些算两字节的话就会超出。
====》
页的单个行中的最大数据量和开销是 8,060 字节 (8 KB)。但是,这不包括用 Text/Image 页类型存储的数据。包含 varchar、nvarchar、varbinary 或 sql_variant 列的表不受此限制的约束。
当表中的所有固定列和可变列的行的总大小超过限制的 8,060 字节时,SQL Server 将从最大长度的列开始动态将一个或多个可变长度列移动到 ROW_OVERFLOW_DATA 分配单元中的页。
将列移动到 ROW_OVERFLOW_DATA 分配单元中的页后,将在 IN_ROW_DATA 分配单元中的原始页上维护 24 字节的指针。如果后续操作减小了行的大小,SQL Server 会动态将列移回到原始数据页.
SQL Server会自动处理你溢出的长度。。
但是用varchar的话,若汉字是二字节的,那么总共6400个字节再加上id列,加上日期等一些小列也才6800字节。若有些汉字是三字节的,那就无法保证一定不超过8000字符。
用nvarchar的话那是一定会超过8000字符的,毕竟里面有一些英文字符,若那些算两字节的话就会超出。
====》
页的单个行中的最大数据量和开销是 8,060 字节 (8 KB)。但是,这不包括用 Text/Image 页类型存储的数据。包含 varchar、nvarchar、varbinary 或 sql_variant 列的表不受此限制的约束。
当表中的所有固定列和可变列的行的总大小超过限制的 8,060 字节时,SQL Server 将从最大长度的列开始动态将一个或多个可变长度列移动到 ROW_OVERFLOW_DATA 分配单元中的页。
将列移动到 ROW_OVERFLOW_DATA 分配单元中的页后,将在 IN_ROW_DATA 分配单元中的原始页上维护 24 字节的指针。如果后续操作减小了行的大小,SQL Server 会动态将列移回到原始数据页.
SQL Server会自动处理你溢出的长度。。
#14
这里你只要将你的变长字段 设置成nvarchar(4000)就可以了 只要保证你的单个字段不超出8K就好。。
#15
哦,这是sql2005新的功能吗?我在2003server,sql2000下测试时报错了,说该行大小大于8060字节。
#16
你的建表语句 我看下 ~~~~~
#17
CREATE TABLE [dbo].[test1] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[cont1] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[cont2] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[cont3] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
以上是我测试的一个表,其中cont1,cont2,cont3都是长8000的varchar类型,往里面每个字段都写入略大于6000的英文字母,然后就报错。
报错语句如下:无法创建大小为 18133 的行,该值大于允许的最大值 8060。
语句已终止。
[id] [int] IDENTITY (1, 1) NOT NULL ,
[cont1] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[cont2] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[cont3] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
以上是我测试的一个表,其中cont1,cont2,cont3都是长8000的varchar类型,往里面每个字段都写入略大于6000的英文字母,然后就报错。
报错语句如下:无法创建大小为 18133 的行,该值大于允许的最大值 8060。
语句已终止。
#18
insert test1
select REPLICATE('a',7000),REPLICATE('a',7000),REPLICATE('a',7000)
去执行下 我这不报错~
#19
每行最长是8060 插入的时候会有警告提示
#20
服务器: 消息 511,级别 16,状态 1,行 1
无法创建大小为 21019 的行,该值大于允许的最大值 8060。
语句已终止。
无法创建大小为 21019 的行,该值大于允许的最大值 8060。
语句已终止。
#21
我的有报错,不明白原因。
#22
2000我没环境 你去查下相关文档~
#23
在2000中 没有办法突破
SQL Server2000中最大数据行的大小为8060(我们可以使用的大小为8039),即创建表时所有列的大小总和不能超过8060。 这个限制
介意把字段拆分到多个表 用关键字段联接使用~
介意把字段拆分到多个表 用关键字段联接使用~
#24
好,谢谢老大,结贴。
#25
都没怎么用过MySQL~
#26
服务器级别,确定方法很简单。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
#27
服务器级别,确定方法很简单。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
#28
自己先到网上去搜索一下,资料很多的,我当时就是在网上找的,细节忘了 ^_^
#29
什么呀就结贴? 问题没解决啊,我存汉语没事,存英语提示超出.我认为是编码问题.
#1
排序规则 默认的是什么?
用unicode 可以用类型 nvarchar nchar等
用unicode 可以用类型 nvarchar nchar等
#2
服务器级别,确定方法很简单。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
#3
看错了。。。看成MYSQL~
#4
排序规则默认Chinese_PRC_CI_AS
通过这里可以看出其中的汉字是UTF编码还是GBK编码吗?
通过这里可以看出其中的汉字是UTF编码还是GBK编码吗?
#5
#6
要用汉字的话 就用unicode存储 nvarchar
#7
排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。
如:
Chinese_PRC_CS_AI_WS
前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则,按拼音排序。
Chinese_PRC_Stroke 表示按汉字笔画排序;
排序规则的后半部份即后缀 含义:
_BIN 二进制排序
_CI(CS) 是否区分大小写,CI不区分,CS区分(case-insensitive/case-sensitive)
_AI(AS) 是否区分重音,AI不区分,AS区分(accent-insensitive/accent-sensitive)
_KI(KS) 是否区分假名类型,KI不区分,KS区分(kanatype-insensitive/kanatype-sensitive)
_WI(WS) 是否区分宽度 WI不区分,WS区分(width-insensitive/width-sensitive)
区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,
比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项。
#8
你好,谢谢,但是我输入的东西中大约一半是汉字,一半是英文。
而且现在的问题是一行数据总大小,
若为GBK编码,汉字每编码为2字节,我的数据中mssql中一行的总大小如何都会在6800字节以内。
但是对UTF-8格式的汉字而言,很多汉字的编码是3个字节,这样下来一行的总大小就可能超过8K,而mssql中一行的大小是不能够超过8K的,这样就会产生一个错误。
若想避免这个错误,最佳的方法就是在mssql中使用GBK编码,但是我不知道怎么控制。
而且现在的问题是一行数据总大小,
若为GBK编码,汉字每编码为2字节,我的数据中mssql中一行的总大小如何都会在6800字节以内。
但是对UTF-8格式的汉字而言,很多汉字的编码是3个字节,这样下来一行的总大小就可能超过8K,而mssql中一行的大小是不能够超过8K的,这样就会产生一个错误。
若想避免这个错误,最佳的方法就是在mssql中使用GBK编码,但是我不知道怎么控制。
#9
如果是nvarchar字段类型 使用的是Unicode编码类型 一个字符占2个字节
所以最多使用 nvarchar(4000)
当然 如果你用的是SQL Server2005及其以上版本 你可以使用 nvarchar(max) 一行大小最多可以达到2GB
mssql中一行的大小是不能够超过8K的,这样就会产生一个错误。
==》
这句话是对的 但是他只是相对于一般的数据类型而言 如果表中包含 text ntext nvarchar(max)等特殊字段类型 则没有这个限制
#10
嗯,是的,因为text在该行只占用16个字节,就是指个路而已。
我有八个列,每个列大约800个字节,用text类型就有点过份了,
但是用varchar的话,若汉字是二字节的,那么总共6400个字节再加上id列,加上日期等一些小列也才6800字节。若有些汉字是三字节的,那就无法保证一定不超过8000字符。
用nvarchar的话那是一定会超过8000字符的,毕竟里面有一些英文字符,若那些算两字节的话就会超出。
在这种情况下每列800字节的东西也用test类型比较好吗?
我有八个列,每个列大约800个字节,用text类型就有点过份了,
但是用varchar的话,若汉字是二字节的,那么总共6400个字节再加上id列,加上日期等一些小列也才6800字节。若有些汉字是三字节的,那就无法保证一定不超过8000字符。
用nvarchar的话那是一定会超过8000字符的,毕竟里面有一些英文字符,若那些算两字节的话就会超出。
在这种情况下每列800字节的东西也用test类型比较好吗?
#11
汉字若是三字节的话,每列可能就不止800个字节。
汉字是两字节的话,每列可能只有600字节,在一些特殊的情况下可能达到700多字节。
汉字是两字节的话,每列可能只有600字节,在一些特殊的情况下可能达到700多字节。
#12
其中难受的地方在于0.8K字节的东西用text来保存,心里总是堵得慌。
以前只是大于8K的地方用text来保存。
以前只是大于8K的地方用text来保存。
#13
我有八个列,每个列大约800个字节,用text类型就有点过份了,
但是用varchar的话,若汉字是二字节的,那么总共6400个字节再加上id列,加上日期等一些小列也才6800字节。若有些汉字是三字节的,那就无法保证一定不超过8000字符。
用nvarchar的话那是一定会超过8000字符的,毕竟里面有一些英文字符,若那些算两字节的话就会超出。
====》
页的单个行中的最大数据量和开销是 8,060 字节 (8 KB)。但是,这不包括用 Text/Image 页类型存储的数据。包含 varchar、nvarchar、varbinary 或 sql_variant 列的表不受此限制的约束。
当表中的所有固定列和可变列的行的总大小超过限制的 8,060 字节时,SQL Server 将从最大长度的列开始动态将一个或多个可变长度列移动到 ROW_OVERFLOW_DATA 分配单元中的页。
将列移动到 ROW_OVERFLOW_DATA 分配单元中的页后,将在 IN_ROW_DATA 分配单元中的原始页上维护 24 字节的指针。如果后续操作减小了行的大小,SQL Server 会动态将列移回到原始数据页.
SQL Server会自动处理你溢出的长度。。
但是用varchar的话,若汉字是二字节的,那么总共6400个字节再加上id列,加上日期等一些小列也才6800字节。若有些汉字是三字节的,那就无法保证一定不超过8000字符。
用nvarchar的话那是一定会超过8000字符的,毕竟里面有一些英文字符,若那些算两字节的话就会超出。
====》
页的单个行中的最大数据量和开销是 8,060 字节 (8 KB)。但是,这不包括用 Text/Image 页类型存储的数据。包含 varchar、nvarchar、varbinary 或 sql_variant 列的表不受此限制的约束。
当表中的所有固定列和可变列的行的总大小超过限制的 8,060 字节时,SQL Server 将从最大长度的列开始动态将一个或多个可变长度列移动到 ROW_OVERFLOW_DATA 分配单元中的页。
将列移动到 ROW_OVERFLOW_DATA 分配单元中的页后,将在 IN_ROW_DATA 分配单元中的原始页上维护 24 字节的指针。如果后续操作减小了行的大小,SQL Server 会动态将列移回到原始数据页.
SQL Server会自动处理你溢出的长度。。
#14
这里你只要将你的变长字段 设置成nvarchar(4000)就可以了 只要保证你的单个字段不超出8K就好。。
#15
哦,这是sql2005新的功能吗?我在2003server,sql2000下测试时报错了,说该行大小大于8060字节。
#16
你的建表语句 我看下 ~~~~~
#17
CREATE TABLE [dbo].[test1] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[cont1] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[cont2] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[cont3] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
以上是我测试的一个表,其中cont1,cont2,cont3都是长8000的varchar类型,往里面每个字段都写入略大于6000的英文字母,然后就报错。
报错语句如下:无法创建大小为 18133 的行,该值大于允许的最大值 8060。
语句已终止。
[id] [int] IDENTITY (1, 1) NOT NULL ,
[cont1] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[cont2] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[cont3] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
以上是我测试的一个表,其中cont1,cont2,cont3都是长8000的varchar类型,往里面每个字段都写入略大于6000的英文字母,然后就报错。
报错语句如下:无法创建大小为 18133 的行,该值大于允许的最大值 8060。
语句已终止。
#18
insert test1
select REPLICATE('a',7000),REPLICATE('a',7000),REPLICATE('a',7000)
去执行下 我这不报错~
#19
每行最长是8060 插入的时候会有警告提示
#20
服务器: 消息 511,级别 16,状态 1,行 1
无法创建大小为 21019 的行,该值大于允许的最大值 8060。
语句已终止。
无法创建大小为 21019 的行,该值大于允许的最大值 8060。
语句已终止。
#21
我的有报错,不明白原因。
#22
2000我没环境 你去查下相关文档~
#23
在2000中 没有办法突破
SQL Server2000中最大数据行的大小为8060(我们可以使用的大小为8039),即创建表时所有列的大小总和不能超过8060。 这个限制
介意把字段拆分到多个表 用关键字段联接使用~
介意把字段拆分到多个表 用关键字段联接使用~
#24
好,谢谢老大,结贴。
#25
都没怎么用过MySQL~
#26
服务器级别,确定方法很简单。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
#27
服务器级别,确定方法很简单。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
#28
自己先到网上去搜索一下,资料很多的,我当时就是在网上找的,细节忘了 ^_^
#29
什么呀就结贴? 问题没解决啊,我存汉语没事,存英语提示超出.我认为是编码问题.