1. 问题描述

在同步数据时常常会发现一个错误:将截断字符串或二进制数据

2. 问题原因

这个问题出现的原因是:要插入的数值字段的长度超出了数据库中字段的长度。比如:插入的字符串字节长度是40,数据库中字段长度设置为了varchar(36)就会报此错误。

3.问题扩展

a. 如何计算字符串长度和字节长度,既:datalength和len区别。

len:返回字符串的长度

datalength:返回字符串的字节长度

select len(convert(varchar(50),N'狮lion')) --5 N''表示Unicode格式字符串
select datalength(convert(varchar(50),N'狮lion')) --6
select len(N'狮lion') --5
select datalength(N'狮lion') --10

接下来我们分析一下为何会这样.

len返回字符串的字符长度,既:一个汉字'狮'+4个字母'lion'=5个字符。每个汉字和字母都占一个字符长度。

datalength返回字符串的字节长度。对于字节长度,需要理解:一般编码模式下,汉字和英文字母所占字节是不一样的。一般来说,汉字占2个字节,英文字符占一个字节。而对于Unicode编码,汉字和英文字母都占2个字节。

讲解一下varchar和nvarchar的区别,varchar是普通编码的字符串,nvarchar是Unicode编码的字符串,对应例子,就是对汉字'狮'来说,varchar格式的字符串长度为1,nvarchar格式的字符串长度为2。

len(convert(varchar(50),N'狮lion')) --返回字符长度,'狮lion',一共5个字符,varchar格式字符
len(N'狮lion') --返回字符长度,'狮lion',一共5个字符,nvarchar格式字符
datalength(convert(varchar(50),N'狮lion')) --返回字节长度,varchar格式字符'狮lion','狮'占2个字节,
--'lion'中每个字母占用一个字节,共占用4个字节
datalength(N'狮lion') --返回字节长度,Unicode格式字符,汉字'狮'占2个字节,
--'lion'中每个字母占用2个字节,共占用8个字节

文章引用:https://blog.csdn.net/oncealong/article/details/37573927

b. 如何查看数据库的编码格式。

--查看sqlserver数据库的编码格式
SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage');
查询结果:
936 简体中文GBK
950 繁体中文BIG5
437 美国/加拿大英语
932 日文
949 韩文
866 俄文
65001 unicode UFT-8

c. varchar和char和nvarchar三者的区别

  1. char是定长(固定长度),效率高于varchar;也就是当你输入的字符小于你指定的数目时,例如:char(8),你输入的字符小于8时,它会再后面补空值。当你输入的字符大于指定的数时,它会截取超出的字符。
  2. varchar[n]是变长且非unicode字符数据类型,n的取值在1到8000之间,该类型英文字符占一个字节,中文字符占两个字节。优点:更加合理利用空间,不会造成过多的浪费。
  3. nvarchar[n]是变长且unicode字符数据类型,n的取值在1到4000之间,该类型字符无论中英文都占取两个字节

    其中varchar和nvarchar两字段分别有字段值:你好hello

    那么varchar字段占2×2+5=9个字节的存储空间,而nvarchar字段占7×2=14个字节的存储空间。

    如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar

文章引用:https://www.cnblogs.com/flqcchblog/p/4560781.html

(SqlServe)关于字符串长度被截断的问题的更多相关文章

  1. js获取字符串的实际长度并截断实际长度

    在项目中有这样一个需求,就是一个很长的字符串,需要截断成几组字符串,而这几组字符串里既包含汉字,又包含字母,下面提供了几种方法 1,获取字符串的长度 function getstrlength(str ...

  2. 字符串长度函数strlen()

    如下是我的测试文件: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { ...

  3. ECMAScript6补全字符串长度方法padStart()和padEnd()

    一.padStart() 1.定义 padStart()方法用另一个字符串(默认为空格)重复填充到对象字符串到指定长度,填充从对象字符串左侧开始,返回新的字符串. 2.语法 str.padStart( ...

  4. [No0000A4]DOS命令(cmd)批处理:替换字符串、截取字符串、扩充字符串、获取字符串长度

    1.替换字符串,即将某一字符串中的特定字符或字符串替换为给定的字符串.举例说明其功能:========================================= @echo off set a ...

  5. iOS小知识:计算字符串长度(如果有表情,表情的长度为1)

    在做项目的时候,textField能够输入表情,但是iOS的表情是占两个字符的,再计算字符串长度的时候就和想象的不一样了,所以用了次方法会将表情的长度转成1,最后得到的字符串的长度就是能看到的实际的长 ...

  6. JS判断字符串长度(中文长度为2,英文长度为1)

    目的:计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: String.prototype.gblen = function() { var len = 0; for (var i=0; ...

  7. JS判断字符串长度的5个方法

    这篇文章主要介绍了JS判断字符串长度的5个方法,并且区分中文和英文,需要的朋友可以参考下 目的:计算字符串长度(英文占1个字符,中文汉字占2个字符)   方法一:    代码如下: String.pr ...

  8. [转载] python 计算字符串长度

    本文转载自: http://www.sharejs.com/codes/python/4843 python 计算字符串长度,一个中文算两个字符,先转换成utf8,然后通过计算utf8的长度和len函 ...

  9. php 计算字符串长度

    在项目的开发中,常常遇到要计算一个字符串的长度(中英文结合),由于产品要求不同,每个中文的长度要求也不一样. 解决utf-8编码下的字符串长度(可自定义每个中英文算几个字节) /** * 计算字符串长 ...

随机推荐

  1. Windows 安装 Go语言开发环境

    Windows 安装 Go语言开发环境   下载安装包 下载地址:http://www.golangtc.com/download   32 位请选择名称中包含 windows-386 的 msi 安 ...

  2. python序列(二)列表的删除操作

    1.使用del命令删除列表中的指定位置上的元素 >>> s=[1,2,3,4] >>> del s[1] >>> s [1, 3, 4] 2.使用 ...

  3. CentOS7 实战源码安装mysql5.7.17数据库服务器

    CentOS7 实战源码安装mysql5.7.17数据库服务器 简介:实战演练mysql数据库服务器的搭建  mysql简介: mysql是一个开源的关系型数据库管理系统,现在是oracle公司旗下的 ...

  4. 阿里巴巴java开发手册-嵩山版 下载

    引言 今天阿里巴巴开发手册嵩山版又发布了,距离上次泰山版发布才仅仅几个月.是不是有的同学又要感叹下这速度也太快了点吧.我泰山版还没看完,嵩山版直接来了.没看完不要紧,我们直接看嵩山版本就好了.一次性把 ...

  5. myeclipse经常弹出Subversion Native Library Not Available框解决办法

    两种解决方案:(1)在myeclipse中选择 "Windows" -> Perferences. 然后通过左上方的筛选,选出svn设置菜单,点解左侧的"SVN&q ...

  6. 高性能MySQL学习总结二----常见数据类型选择及优化

    一.数据类型的选择 MySQL的数据类型有很多种,选择正确的数据类型对于获得高性能特别地重要,如何选择合适的数据类型呢?主要遵从以下三个原则: 1.更小的通常情况下性能更好 一般情况下,应该尽量使用可 ...

  7. Redis-基础和应用篇

    2020,到新公司这一年多以来,更新文章和总结知识的习惯被丢掉了.我复盘了下自己,原因不是公司技术氛围不好,也不是每天业务需求太多,其根本原因还是---惰性.作为我们技术人随着年龄的增长,精力也会被生 ...

  8. Spring Boot 2.x基础教程:实现文件上传

    文件上传的功能实现是我们做Web应用时候最为常见的应用场景,比如:实现头像的上传,Excel文件数据的导入等功能,都需要我们先实现文件的上传,然后再做图片的裁剪,excel数据的解析入库等后续操作. ...

  9. 转载-Oracle 数据库导入导出 dmp文件

    首先询问对方数据库的表空间名称和大小,然后在你的oracle中建立相应表空间,最后使用命令导入.导出数据.补充:1.要新建一个数据库: Oracle数据导入导出imp/exp就相当于oracle数据还 ...

  10. 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)

    使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置jdk-15.0.1-免配置路径版提取码:earu免安装版 ...