zoukankan      html  css  js  c++  java
  • 【MySQL】数据类型之字符相关

    "


    目录

    字符类型

    char类型

    varchar类型

    实测

    总结

    枚举类型与集合类型


    字符类型

    官网:https://dev.mysql.com/doc/refman/5.7/en/char.html
    注意:char与varchar括号内的参数指的是字符的固定长度

    char类型

    定长,简单粗暴,浪费空间,存取速度

    • 字符长度:0 ~ 255(一个中文是一个字符,是utf8编码的3个字节)
      例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储.
    • 检索:在检索时,显示的结果会自动删除尾部的空格,除非打开pad_char_to_full_length SQL模式
      (设置SQL模式:set  sql_mode = 'pad_char_to_full_length'; 查询sql的默认模式:select @@sql_mode;)

    varchar类型

    变长,精确,节省空间,存取速度慢

    • 字符长度:0 ~ 65535(如果大于21845会提示用其它类型,MySQL行最大限制为65535字节,字符编码为utf8:官方文档
    • 存储:varchar类型存储数据的真实内容,不会用空格填充,也不会在查询时过滤尾部的空格.
      强调:varchar类型会在真实数据前加1-2bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2bytes最大表示65535长度,正好符合MySQL对row的最大字节限制,即已足够使用).
      [如果真实数据<255bytes,则需要1bytes的前缀(1bytes=8bit 2**8最大表示的数字为255);如果真实数据>255bytes,则需要2bytes的前缀(2bytes=16bit 2**16最大表示的数字为65535)]
    • 检索:尾部有空格会保存下来,在检索时也会正常显示包含空格在内的内容.

    char 与 varchar 的官方解释:

    在这里插入图片描述

    实测

    测试之前先来了解两个函数:

    1. length()    # 查看字节数
    2. char_length()    # 查看字节数
    1. # 创建测试表,分别指明字段x为char类型,字段y为varchar类型
    2. mysql> create table test(x char(5), y varchar(5));
    3. Query OK, 0 rows affected (0.11 sec)
    4. # 插入数据,后面加空格
    5. mysql> insert into test values("数据库 ", "数据库 ");
    6. Query OK, 1 row affected (0.00 sec)
    7. # 在检索时,char类型会过滤掉后面的空格,而varchar正常显示
    8. mysql> select x, char_length(x), y, char_length(y) from test;
    9. +-----------+----------------+------------+----------------+
    10. | x | char_length(x) | y | char_length(y) |
    11. +-----------+----------------+------------+----------------+
    12. | 数据库 | 3 | 数据库 | 4 |
    13. +-----------+----------------+------------+----------------+
    14. 1 row in set (0.00 sec)
    15. # 设置SQL模式,使char类型原形毕露
    16. mysql> set sql_mode = 'pad_char_to_full_length';
    17. Query OK, 0 rows affected, 1 warning (0.00 sec)
    18. # 查当前SQL模式
    19. mysql> select @@sql_mode;
    20. +-------------------------+
    21. | @@sql_mode |
    22. +-------------------------+
    23. | PAD_CHAR_TO_FULL_LENGTH |
    24. +-------------------------+
    25. 1 row in set (0.00 sec)
    26. # 再次检索,发现char类型的数据是占满规定的长度的(在后面填充空格)
    27. mysql> select x, char_length(x), y, char_length(y) from test;
    28. +-------------+----------------+------------+----------------+
    29. | x | char_length(x) | y | char_length(y) |
    30. +-------------+----------------+------------+----------------+
    31. | 数据库 | 5 | 数据库 | 4 |
    32. +-------------+----------------+------------+----------------+
    33. 1 row in set (0.00 sec)
    34. # 查看字节数
    35. # char类型:3个中文字符 + 两个空格 = 11bytes
    36. # varchar类型:3个中文字符 + 1个空格 = 10bytes
    37. mysql> select x, length(x), y, length(y) from test;
    38. +-------------+-----------+------------+-----------+
    39. | x | length(x) | y | length(y) |
    40. +-------------+-----------+------------+-----------+
    41. | 数据库 | 11 | 数据库 | 10 |
    42. +-------------+-----------+------------+-----------+
    43. 1 row in set (0.01 sec)

    总结

    常用字符串系列:char varchar
    虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡

    其它字符串系列(效率:char > varchar > text)

    1. TEXT系列    TINYTEXT TEXT MEDIUMTEXT LONGTEXT
    2. BLOB 系列    TINYBLOB BLOB MEDIUMBLOB LONGBLOB
    3. BINARY系列    BINARY VARBINARY

    TEXT系列:text数据类型用于保存变长的大字符串,可以最多到65535(2**16 - 1)个字符
    mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
    longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.


    枚举类型与集合类型

    即字段的值只能在规定范围中选择,如单选框,多选框
    enum枚举:即单选,只能在给定的范围内选一个值.(如:性别 sex boy/girl)
    set集合:即多选,在给定的范围内可以选择一个或一个以上的值.如:爱好1,爱好2,爱好3)

    1. mysql> create table information(
    2. -> name char(3),
    3. -> sex enum("男", "女"),
    4. -> hobby set("抽烟", "喝酒", "烫头")
    5. -> );
    6. Query OK, 0 rows affected (0.05 sec)
    7. mysql> insert into information values
    8. -> ("张三", "男", "抽烟,喝酒"),
    9. -> ("李四", "女", "烫头");
    10. Query OK, 2 rows affected (0.00 sec)
    11. Records: 2 Duplicates: 0 Warnings: 0
    12. mysql> select * from information;
    13. +---------+------+---------------+
    14. | name | sex | hobby |
    15. +---------+------+---------------+
    16. | 张三 | 男 | 抽烟,喝酒 |
    17. | 李四 | 女 | 烫头 |
    18. +---------+------+---------------+
    19. 2 rows in set (0.00 sec)


    "
  • 相关阅读:
    innerHTML和innerText
    Function 构造器及其对象、方法
    构造函数
    jquery 获取及设置input各种类型的值
    在浏览器中输入URL并回车后都发生了什么?
    :after和:before的作用及使用方法
    使用JS监听键盘按下事件(keydown event)
    Javascript模块化编程(三):require.js的用法
    Javascript模块化编程(二):AMD规范
    Javascript模块化编程(一):模块的写法
  • 原文地址:https://www.cnblogs.com/zyk01/p/11375909.html
Copyright © 2011-2022 走看看