高性能MySQL:字符串类型(1)字符串类型( )
MySQL 支持多种字符串类型 每种类型还有很多变种 这些数据类型在 和 版本发生了很大的变化 使得情况更加复杂 从MySQL 开始 每个字符串列可以定义自己的字符集和排序规则 或者说校对规则(collation)(更多关于这个主题的信息请参考第 章) 这些东西会很大程度上影响性能
VARCHAR 和CHAR 类型
VARCHAR 和CHAR 是两种最主要的字符串类型 不幸的是 很难精确地解释这些值是怎么存储在磁盘和内存中的 因为这跟存储引擎的具体实现有关 下面的描述假设使用的存储引擎是InnoDB 和/ 或者MyISAM 如果使用的不是这两种存储引擎 请参考所使用的存储引擎的文档
先看看VARCHAR 和CHAR 值通常在磁盘上怎么存储 请注意 存储引擎存储CHAR 或者VARCHAR 值的方式在内存中和在磁盘上可能不一样 所以MySQL 服务器从存储引擎读出的值可能需要转换为另一种存储格式 下面是关于两种类型的一些比较
VARCHAR
VARCHAR 类型用于存储可变长字符串 是最常见的字符串数据类型 它比定长类型更节省空间 因为它仅使用必要的空间(例如 越短的字符串使用越少的空间) 有一种情况例外 如果MySQL 表使用ROW_FORMAT=FIXED 创建的话 每一行都会使用定长存储 这会很浪费空间
VARCHAR 需要使用 或 个额外字节记录字符串的长度 如果列的最大长度小于或等于 字节 则只使用 个字节表示 否则使用 个字节 假设采用latin 字符集 一个VARCHAR( ) 的列需要 个字节的存储空间 VARCHAR( ) 的列则需要 个字节 因为需要 个字节存储长度信息
VARCHAR 节省了存储空间 所以对性能也有帮助 但是 由于行是变长的 在UPDATE 时可能使行变得比原来更长 这就导致需要做额外的工作 如果一个行占用的空间增长 并且在页内没有更多的空间可以存储 在这种情况下 不同的存储引擎的处理方式是不一样的 例如 MyISAM 会将行拆成不同的片段存储 InnoDB则需要分裂页来使行可以放进页内 其他一些存储引擎也许从不在原数据位置更新数据
下面这些情况下使用VARCHAR 是合适的 字符串列的最大长度比平均长度大很多 列的更新很少 所以碎片不是问题 使用了像UTF 这样复杂的字符集 每个字符都使用不同的字节数进行存储
在 或者更高版本 MySQL 在存储和检索时会保留末尾空格 但在 或更老的版本 MySQL 会剔除末尾空格
InnoDB 则更灵活 它可以把过长的VARCHAR 存储为BLOB 我们稍后讨论这个问题
CHAR
CHAR 类型是定长的 MySQL 总是根据定义的字符串长度分配足够的空间 当存储CHAR 值时 MySQL 会删除所有的末尾空格(在MySQL 和更老版本中VARCHAR也是这样实现的 也就是说这些版本中CHAR 和VARCHAR 在逻辑上是一样的 区别只是在存储格式上) CHAR 值会根据需要采用空格进行填充以方便比较
CHAR 适合存储很短的字符串 或者所有值都接近同一个长度 例如 CHAR 非常适合存储密码的MD 值 因为这是一个定长的值 对于经常变更的数据 CHAR 也比VARCHAR 更好 因为定长的CHAR 类型不容易产生碎片 对于非常短的列 CHAR 比VARCHAR 在存储空间上也更有效率 例如用CHAR( ) 来存储只有Y 和N 的值 如果采用单字节字符集注 只需要一个字节 但是VARCHAR( ) 却需要两个字节 因为还有一个记录长度的额外字节
CHAR 类型的这些行为可能有一点难以理解 下面通过一个具体的例子来说明 首先 我们创建一张只有一个CHAR( ) 字段的表并且往里面插入一些值
当检索这些值的时候 会发现string 末尾的空格被截断了
如果用VARCHAR( ) 字段存储相同的值 可以得到如下结果
数据如何存储取决于存储引擎 并非所有的存储引擎都会按照相同的方式处理定长和变长的字符串 Memory 引擎只支持定长的行 即使有变长字段也会根据最大长度分配最大空间 不过 填充和截取空格的行为在不同存储引擎都是一样的 因为这是在MySQL 服务器层进行处理的
返回目录高性能MySQL
编辑推荐
ASP NET MVC 框架揭秘
Oracle索引技术
ASP NET开发培训视频教程
lishixinzhi/Article/program/MySQL/201311/29687
怎么在mysql里做字符串连接MySQL中 concat 函数
使用方法:
CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串 。如有任何一个参数为NULL,则返回值为 NULL 。
注意:
如果所有参数均为非二进制字符串,则结果为非二进制字符串 。
如果自变量中含有任一二进制字符串,则结果为一个二进制字符串 。
一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况 , 可使用显式类型 cast, 例如:
SELECT CONCAT(CAST(int_col AS CHAR), char_col)
MySQL的concat函数可以连接一个或者多个字符串,如
mysql select concat('10');
--------------
| concat('10') |
--------------
| 10|
--------------
1 row in set (0.00 sec)
mysql select concat('11','22','33');
------------------------
| concat('11','22','33') |
------------------------
| 112233 |
------------------------
1 row in set (0.00 sec)
MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL
mysql select concat('11','22',null);
------------------------
| concat('11','22',null) |
------------------------
| NULL|
------------------------
1 row in set (0.00 sec)
MySQL中 concat_ws 函数
使用方法:
CONCAT_WS(separator,str1,str2,...)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式 。第一个参数是其它参数的分隔符 。分隔符的位置放在要连接的两个字符串之间 。分隔符可以是一个字符串,也可以是其它参数 。
注意:
如果分隔符为 NULL,则结果为 NULL 。函数会忽略任何分隔符参数后的 NULL 值 。
如连接后以逗号分隔
mysql select concat_ws(',','11','22','33');
-------------------------------
| concat_ws(',','11','22','33') |
-------------------------------
| 11,22,33 |
-------------------------------
1 row in set (0.00 sec)
和MySQL中concat函数不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL
mysql select concat_ws(',','11','22',NULL);
-------------------------------
| concat_ws(',','11','22',NULL) |
-------------------------------
| 11,22 |
-------------------------------
1 row in set (0.00 sec)
MySQL中 group_concat 函数
完整的语法如下:
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
基本查询
mysql select * from aa;
------ ------
| id| name |
------ ------
|1 | 10|
|1 | 20|
|1 | 20|
|2 | 20|
|3 | 200|
|3 | 500|
------ ------
6 rows in set (0.00 sec)
以id分组 , 把name字段的值打印在一行,逗号分隔(默认)
mysql select id,group_concat(name) from aa group by id;
------ --------------------
| id| group_concat(name) |
------ --------------------
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
------ --------------------
3 rows in set (0.00 sec)
以id分组,把name字段的值打印在一行 , 分号分隔
mysql select id,group_concat(name separator ';') from aa group by id;
------ ----------------------------------
| id| group_concat(name separator ';') |
------ ----------------------------------
|1 | 10;20;20 |
|2 | 20|
|3 | 200;500|
------ ----------------------------------
3 rows in set (0.00 sec)
以id分组,把去冗余的name字段的值打印在一行,
逗号分隔
mysql select id,group_concat(distinct name) from aa group by id;
------ -----------------------------
| id| group_concat(distinct name) |
------ -----------------------------
|1 | 10,20|
|2 | 20|
|3 | 200,500 |
------ -----------------------------
3 rows in set (0.00 sec)
以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序
mysql select id,group_concat(name order by name desc) from aa group by id;
------ ---------------------------------------
| id| group_concat(name order by name desc) |
------ ---------------------------------------
|1 | 20,20,10|
|2 | 20|
|3 | 500,200|
------ ---------------------------------------
3 rows in set (0.00 sec)
repeat()函数
用来复制字符串,如下'ab'表示要复制的字符串,2表示复制的份数
mysql select repeat('ab',2);
----------------
| repeat('ab',2) |
----------------
| abab|
----------------
1 row in set (0.00 sec)
又如
mysql select repeat('a',2);
---------------
| repeat('a',2) |
---------------
| aa|
---------------
1 row in set (0.00 sec)
mysql向表中某字段后追加一段字符串:
update table_name set field=CONCAT(field,'',str)
mysql 向表中某字段前加字符串
update table_name set field=CONCAT('str',field)
MySql 中如何连接一列字符串GROUP_CONCAT(expr)完整句法如下: GROUP_CONCAT([DISTINCT] expr [,expr ...][ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col ...]][SEPARATOR str_val])这个函数在 MySQL 4.1 中被加入 。函数返回一个字符串结果,该结果由分组中的值连接组合而成: mysql SELECT student_name,- GROUP_CONCAT(test_score)- FROM student- GROUP BY student_name;ormysql SELECT student_name,- GROUP_CONCAT(DISTINCT test_score- ORDER BY test_score DESC SEPARATOR " ")- FROM student- GROUP BY student_name;在MySQL 中 , 你可以得到表达式结合体的连结值 。通过使用 DISTINCT 可以排除重复值 。如果希望对结果中的值进行排序,可以使用 ORDER BY 子句 。为了以倒序排序,可以在 ORDER BY 子句中用于排序的列名后添加一个 DESC (递减 descending) 关键词 。缺省为升序;这也可以通过使用 ASC 关键词明确指定 。SEPARATOR 是一个字符串值,它被用于插入到结果值中 。缺省为一个逗号 (",") 。你可以通过指定 SEPARATOR "" 完全地移除这个分隔符 。在你的配置中,通过变量 group_concat_max_len 要以设置一个最大的长度 。在运行时执行的句法如下: SET [SESSION | GLOBAL] group_concat_max_len = unsigned_integer;如果最大长度被设置,结果值被剪切到这个最大长度 。GROUP_CONCAT() 函数是一个增强的 Sybase SQL Anywhere 支持的基本 LIST() 函数 。如果只有一个列 , 并且没有其它选项被指定 , GROUP_CONCAT() 是向后兼容有极大限制的 LIST() 函数 。
mysql数据库链接字符串怎么使用import java.sql.*;public class SqlUtil{ public static void main(String[] args) { try { String url="jdbc:mysql://localhost/mydb"; String user="root"; //用户名 String pwd="123456"; //密码 //加载驱动,
【mysql怎么用字符串 mysql字符串函数】关于mysql怎么用字符串和mysql字符串函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 营销支持如何填写,营销支持需要什么条件
- 把u盘插在充电头会怎么样,把u盘插上插头后充电会怎样
- chatgpt预测答辩,预答辩会问什么问题
- php检测数据类型代码 php查询数据
- postgresql字符集修改,plsql修改字符集zhs16gbk
- 华为手机能联机的射击游戏,华为联机小游戏
- 大学生怎么在寝室安路由器,大学生宿舍怎么安装路由器
- go语言写的性测试工具 golang 测试用例
- oracle数据库名称sql查询,oracle查询数据库名实例名等