今天系统出了个问题。一个货物在货物表(MySQL数据库),通过程序读取转换后,存入出入库数据表(SQL SERVER数据库)报错。
经查是因为货品名称中英文字符加在一起有125个字符,超过SQL SERVER数据库中货品名称列(varchar(200))的容量。奇怪的是MySQL数据库中货品名称也是以varchar(200)存储的,怎么没有问题呢?
原来SQL SERVER和MySQL对于varchar的设计有所不同。
SQL SERVER:
varchar(n)最多能存n个
字节
,一个中文是两个字节。
MySQL:
4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 ;
详细见:
点击打开链接
今天系统出了个问题。一个货物在货物表(MySQL数据库),通过程序读取转换后,存入出入库数据表(SQL SERVER数据库)报错。经查是因为货品名称中英文字符加在一起有125个字符,超过SQL SERVER数据库中货品名称列(varchar(200))的容量。奇怪的是MySQL数据库中货品名称也是以varchar(200)存储的,怎么没有问题呢? 原来SQL SER
首先需要说明的是
mysql
中只有char和
varchar
,并没有n
varchar
这种类型。但是
sql
srver中char、
varchar
和n
varchar
都是存在的。
先来说说char,char不管在
mysql
还是
sql
server
中,都是一种定长存储类型,所谓定长存储类型,就是存储的字符没有达到定义的长度,就会以英文空格字符的形式填满。
但是
mysql
中
varchar
不是这样。比如你定义va
exists含义
exists表示()内子查询语句返回结果不为空说明where条件成立就会执行主
sql
语句,如果为空就表示where条件不成立,
sql
语句就不会执行。not exists和exists相反,子查询语句结果为空,则表示where条件成立,执行
sql
语句。负责不执行。
之前在学oracle
数据库
的时候,接触过exists,做过几个简单的例子,如
1.如果部门名称中含有字母A,则查询所有员工信息(使用exists)
select * from emp where exists (select
MySQL
和
SQL
Server
是两种不同的关系型
数据库
管理系统,它们的语法有一些
区别
:
1. 数据类型:
MySQL
和
SQL
Server
支持的数据类型有所不同,例如
MySQL
支持的数据类型包括:INT、
VARCHAR
、TEXT、DATE等,而
SQL
Server
支持的数据类型包括:INT、
VARCHAR
、TEXT、DATE、DATETIME等。
2. 日期函数:
MySQL
和
SQL
Server
的日期函数也有所不同,例如
MySQL
中常用的日期函数包括:NOW()、DATE()、DATE_ADD()等,而
SQL
Server
中常用的日期函数包括:GETDATE()、DATEPART()、DATEADD()等。
3. 存储过程:
MySQL
和
SQL
Server
的存储过程语法也有所不同,例如
MySQL
中的存储过程使用DELIMITER语句来定义分隔符,而
SQL
Server
中的存储过程使用BEGIN和END语句来定义代码块。
4. 触发器:
MySQL
和
SQL
Server
的触发器语法也有所不同,例如
MySQL
中的触发器使用CREATE TRIGGER语句来创建,而
SQL
Server
中的触发器使用CREATE TRIGGER语句和AFTER或INSTEAD OF关键字来定义触发时机。
总之,
MySQL
和
SQL
Server
虽然都是关系型
数据库
管理系统,但它们的语法有一些不同,需要根据具体情况进行选择和使用。