mysql char与v_MySQL数据库总结 - char、varchar和text的区别等

Q:如何进行表结构复制

A:在指定数据库下,存在表source_table,现要创建与source_table结构相同的新表new_table,SQL如下:

mysql> CREATE TABLE new_table LIKE source_table;

Query OK, 1 row affected (0.04 sec)

注意:如果source_table存在auto_increment列,新表的自增起始值为1。

Q:如何进行数据导入

A:将source_table的所有数据导入new_table,SQL如下:

mysql> INSERT INTO new_table SELECT * FROM source_table;

Query OK, 5 rows affected (0.00 sec)

Records: 5 Duplicates: 0 Warnings: 0

注意:使用INSERT INTO …… SELECT方式导入数据时,要确定new_table存在。

Q:如何完整复制表结构和数据

A:通过一条命令完成对现有表结构和数据的复制,SQL如下:

mysql> CREATE TABLE new_table SELECT * FROM source_table;

Query OK, 5 rows affected (0.01 sec)

Records: 5 Duplicates: 0 Warnings: 0

注意:上述命令中的new_table在命令执行前不能存在。否则新表将不能创建成功。

Q:如何用现有数据填充自定义表

A: 当新表的结构发生变更后,需要从原表中导入数据时,可使用下列方法,SQL如下:

CREATE TABLE `new_table` (

`ID` INT NOT NULL PRIMARY KEY,

`GMT_CREATE` DATETIME NOT NULL,

`GMT_MODFIED` DATETIME NOT NULL,

`INFO` VARCHAR(64) NOT NULL,

`NAME` VARCHAR(32) NOT NULL

)ENGINE=InnoDB DEFAULT CHARSET=utf8

SELECT s.column_2 as ID, r.column_1 as GMT_CREATE, s.column_3 as GMT_MODFIED, r.column_3 as INFO, s.column_4 as NAME

FROM source_table_1 s, source_table_2 r

WHERE s.column_1 = r.column_2 and s.column_5 = expr;

Q:如何复制现有数据库

A:对数据库中的所有表进行复制,需使用游标,SQL示例如下:

DELIMITER $$

use `database`$$

DROP PROCEDURE IF EXISTS `database`.`datamove`$$

CREATE DEFINER=`user`@`%` PROCEDURE `datamove`(IN source_database varchar(32))

BEGIN

DECLARE v_table_name varchar(32);

DECLARE v_done BIT DEFAULT FALSE;

DECLARE c1 CURSOR FOR

SELECT table_name FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_SCHEMA = source_database;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;

OPEN c1;

REPEAT

FETCH c1

INTO v_table_name;

IF NOT v_done THEN

SET @sql = CONCAT('INSERT INTO ', v_table_name, ' SELECT * FROM ', source_database,'.',v_table_name);

PREPARE stmt FROM @sql;

EXECUTE stmt;

END IF;

UNTIL v_done END REPEAT;

CLOSE c1;

COMMIT;

END$$

DELIMITER;

说明:存储过程datamove用于复制现有数据库的数据。datamove部署在新建数据库中。有一个传入变量,是被复制的现有数据库名称。

例如:现有数据库test,现新建数据库test_1,希望test_1的数据与test相同。则将datamove部署与数据库test_1中,执行:

mysql> call datamove(‘test’);

Q: MySQL中char、varchar和text的区别

A: 引自:http://www.sensail.com/archives/85

他们的存储方式和数据的检索方式都不一样。

数据的检索效率是:char>varchar>text

空间占用方面,要具体情况具体分析了。M个字节,0 <=M<= 255

L+1个字节,其中L<=M且0 <=M<= 65535

L+2个字节,其中L< 216

Char为定长,varchar,text为变长

Char在保存的时候,后面(右边)会用空格填充到指定的长度,在检索的时候后面的空格会去掉,所以检索出来的数据需要再用什么trim之类的函数去处理。(与sql server可能有些不同)

Varchar在保存的时候,不进行填充。当值保存和检索时尾部的空格仍保留。

TEXT列不能有默认值,存储或检索过程中,不存在大小写转换.

当存储的字符超过他们定义的长度时候,如果不是在sql服务器的严格模式下,都会自动截取合适的字段存储,而不会出现错误。但是,如果是中文的话同样要报错误:)比如定义char(4),然后insert (‘c哈哈’).

注意一点的,Char,Varchar不像数值类型,有系统默认长度,所以必须在括号里定义长度,可以有默认值

text不可以写默认值,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入(严格模式下没有测试 :))

存储计算:

在使用UTF8字符集的时候,手册上是这样描叙的:

·        基本拉丁字母、数字和标点符号使用一个字节。

·        大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值