mysql CHAR_LENGTH()与LENGTH()

CHAR_LENGTH() :Return number of characters(字符) in argument(参数)
LENGTH() : Return the length of a string(字符串) in bytes(字节)

https://dev.mysql.com/doc/refman/5.5/en/string-functions

官方说明,CHAR_LENGTH() 返回变量中字符的个数,LENGTH() 返回一个字符串占多少字节。
个人英语比较马虎,所以不知道翻译对不对,凑合看。
结论:

gbk-gbk 一个中文字符也是一个字符,一个汉子占两个字节,所以是 5 7
gbk - utf8  不能直接转换,需通过unicode转码,转码后就是 7 7
gbk- latin1 可直接转换,转换为单字节字符,转码后是 7 7
utf8(一个中文三个字节)---gbk: 直接转换,尾部奇数字节截断(中文个数*3/2+英文字符个数) 9  9
utf8(一个中文三个字节)---utf8: 不用转换,就是 5  9
utf8--------latin1: 直接转换,单字节字符  就是 9 9

select char_length(‘世界sad‘),length(‘世界sad‘);的结果跟两个因素有关:
客户端(linux默认utf8,windows默认GB2312,可通过securecrt 模拟),mysql字符编码设置(主要是client,connection和result,set names xxx)

测试1:
mysql version:5.6.17 windows 7 平台

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> select char_length(‘世界sad‘),length(‘世界sad‘);
+------------------------+-------------------+
| char_length(‘世界sad‘) | length(‘世界sad‘) |
+------------------------+-------------------+
| 7 | 7 |
+------------------------+-------------------+1 row in set (0.00 sec)

mysql> show variables like ‘char%‘;
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | D:\wamp\bin\mysql\mysql5.6.17\share\charsets\ |
+--------------------------+-----------------------------------------------+8 rows in set (0.00 sec)

mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> select char_length(‘世界sad‘),length(‘世界sad‘);
+------------------------+-------------------+
| char_length(‘世界sad‘) | length(‘世界sad‘) |
+------------------------+-------------------+
| 5 | 7 |
+------------------------+-------------------+1 row in set (0.00 sec)

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> select char_length(‘世界sad‘),length(‘世界sad‘);
+------------------------+-------------------+
| char_length(‘世界sad‘) | length(‘世界sad‘) |
+------------------------+-------------------+
| 7 | 7 |
+------------------------+-------------------+1 row in set (0.00 sec)

测试2:
mysql 5.5   tlinux 1.2/centos 6.x

mysql> set names utf8;Query OK, 0 rows affected (0.00 sec)

mysql>  select char_length(‘世界sad‘),length(‘世界sad‘);+--------------------------+---------------------+| char_length(‘世界sad‘) | length(‘世界sad‘) |
+--------------------------+---------------------+|                        5 |                   9 |
+--------------------------+---------------------+1 row in set (0.00 sec)

mysql> set names gbk;Query OK, 0 rows affected (0.00 sec)

mysql>  select char_length(‘世界sad‘),length(‘世界sad‘);+--------------------------+---------------------+| char_length(‘世界sad‘) | length(‘世界sad‘) |
+--------------------------+---------------------+|                        6 |                   9 |
+--------------------------+---------------------+1 row in set (0.00 sec)

mysql> set names latin1;Query OK, 0 rows affected (0.00 sec)

mysql>  select char_length(‘世界sad‘),length(‘世界sad‘);+--------------------------+---------------------+| char_length(‘世界sad‘) | length(‘世界sad‘) |
+--------------------------+---------------------+|                        9 |                   9 |
+--------------------------+---------------------+1 row in set (0.00 sec)

mysql>

测试3: mysql 5.6   tlinux1.2

elcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1Server version: 5.6.25 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> select char_length(‘世界sad‘),length(‘世界sad‘);
+--------------------------+---------------------+
| char_length(‘世界sad‘)   | length(‘世界sad‘)   |
+--------------------------+---------------------+
|                        5 |                   9 |
+--------------------------+---------------------+1 row in set (0.00 sec)

mysql>  show variables like ‘char%‘;
+--------------------------+-----------------------------------------+
| Variable_name            | Value                                   |
+--------------------------+-----------------------------------------+
| character_set_client     | utf8                                    |
| character_set_connection | utf8                                    |
| character_set_database   | utf8                                    |
| character_set_filesystem | binary                                  |
| character_set_results    | utf8                                    |
| character_set_server     | utf8                                    |
| character_set_system     | utf8                                    |
| character_sets_dir       | /usr/local/mysql-5.6.25/share/charsets/ |
+--------------------------+-----------------------------------------+8 rows in set (0.00 sec)

mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)

mysql>  show variables like ‘char%‘;
+--------------------------+-----------------------------------------+
| Variable_name            | Value                                   |
+--------------------------+-----------------------------------------+
| character_set_client     | gbk                                     |
| character_set_connection | gbk                                     |
| character_set_database   | utf8                                    |
| character_set_filesystem | binary                                  |
| character_set_results    | gbk                                     |
| character_set_server     | utf8                                    |
| character_set_system     | utf8                                    |
| character_sets_dir       | /usr/local/mysql-5.6.25/share/charsets/ |
+--------------------------+-----------------------------------------+8 rows in set (0.00 sec)

mysql> select char_length(‘世界sad‘),length(‘世界sad‘);
+--------------------------+---------------------+
| char_length(‘世界sad‘)   | length(‘世界sad‘)   |
+--------------------------+---------------------+
|                        6 |                   9 |
+--------------------------+---------------------+1 row in set (0.02 sec)

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql>  show variables like ‘char%‘;
+--------------------------+-----------------------------------------+
| Variable_name            | Value                                   |
+--------------------------+-----------------------------------------+
| character_set_client     | latin1                                  |
| character_set_connection | latin1                                  |
| character_set_database   | utf8                                    |
| character_set_filesystem | binary                                  |
| character_set_results    | latin1                                  |
| character_set_server     | utf8                                    |
| character_set_system     | utf8                                    |
| character_sets_dir       | /usr/local/mysql-5.6.25/share/charsets/ |
+--------------------------+-----------------------------------------+8 rows in set (0.00 sec)

mysql> select char_length(‘世界sad‘),length(‘世界sad‘);
+--------------------------+---------------------+
| char_length(‘世界sad‘)   | length(‘世界sad‘)   |
+--------------------------+---------------------+
|                        9 |                   9 |
+--------------------------+---------------------+1 row in set (0.00 sec)

mysql>

测试4:

mariadb 5.5  tlinux 2.0/centos 7

[[email protected]_ops01      ~]#  rpm -qa |grep mariadbmariadb-devel-5.5.41-2.el7_0.x86_64
mariadb-libs-5.5.41-2.el7_0.x86_64
mariadb-server-5.5.41-2.el7_0.x86_64
mariadb-embedded-devel-5.5.41-2.el7_0.x86_64
mariadb-embedded-5.5.41-2.el7_0.x86_64
mariadb-test-5.5.41-2.el7_0.x86_64
mariadb-5.5.41-2.el7_0.x86_64
mariadb-bench-5.5.41-2.el7_0.x86_64
[[email protected]_ops01      ~]# mysqlWelcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 58Server version: 5.5.41-MariaDB-log MariaDB Server

Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

MariaDB [(none)]> show variables like ‘char%‘;show variables like ‘char%‘;
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+8 rows in set (0.00 sec)

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+8 rows in set (0.00 sec)

MariaDB [(none)]> select char_length(‘世界sad‘),length(‘世界sad‘);
+--------------------------+---------------------+
| char_length(‘世界sad‘) | length(‘世界sad‘) |
+--------------------------+---------------------+
|                        9 |                   9 |
+--------------------------+---------------------+1 row in set (0.00 sec)

MariaDB [(none)]> set names gbk;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> select char_length(‘世界sad‘),length(‘世界sad‘);
+--------------------------+---------------------+
| char_length(‘世界sad‘) | length(‘世界sad‘) |
+--------------------------+---------------------+
|                        6 |                   9 |
+--------------------------+---------------------+1 row in set (0.00 sec)

MariaDB [(none)]> set names utf8;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> select char_length(‘世界sad‘),length(‘世界sad‘);
+--------------------------+---------------------+
| char_length(‘世界sad‘) | length(‘世界sad‘) |
+--------------------------+---------------------+
|                        5 |                   9 |
+--------------------------+---------------------+1 row in set (0.00 sec)

MariaDB [(none)]>

测试5:
windows系统(终端设置为utf8) mysql 5.6 
chcp 65001 

时间: 2024-10-07 04:20:45

mysql CHAR_LENGTH()与LENGTH()的相关文章

【MySQL】使用Length和Cast函数计算TEXT类型字段的长度

背景: 前段时间,业务需要,为了快速让解析的Excel入库,所以把不是很确定的字段全部设置成了TEXT. 今天需要进行表结构优化,把字段长度控制在合适的范围,并尽量不使用TEXT类型. -- 计算长度select LENGTH(CAST(fileName AS CHAR)) from files; select MAX(LENGTH(CAST(fileName AS CHAR))) from files; select LENGTH(CAST(fileName AS CHAR)) as le f

MySQL常用数据类型 length 专题

MySQL-data_type数据类型 1.查看数据类型 mysql> help data type    //通过help对数据进行查看,以及使用的方法 2.MySQL常见的数据类型 整数int.定点小数dec.浮点数float.字符串varchar.时间-时区.布尔bool.位 前言======================================== 在MySQL数据库中,进行数据存储时,难免会出现数据类型转换,其中就包括:隐式类型转换.显示类型转换 1.隐式类型转换:有害.无害

Mysql如何查字段的长度,Mysql中length()、char_length()的区别

1.今天发生了一件有意思的事情,传输的数据大于标准定的字段长度了,我把字段长度调大了,把数据传输过来了.谁知道,人家的数据不符合标准,要删除了重新搞,那么你如何将超长的数据删除呢,或者将超长的数据查询出来. 答:剧透一下,其实使用char_length()查询出来的,就可以把这些删除掉,然后将调大的字段长度调小就行了.备注,我实际操作的字段都是中文字符哈,别再写教程写出血案了. 2.先了解一下,Mysql中length().char_length()的区别. 1).length():mysql里

mysql中length字符长度函数使用方法

在mysql中length是计算字段的长度一个汉字是算三个字符,一个数字或字母算一个字符了,与char_length是有一点区别,本文章重点介绍第一个函数. mysql里面的length函数是一个用来获取字符串长度的内置函数.具体用法示例如下: (1)查看某字符串的长度(比如本站网址) SELECT LENGTH('www.111cn.Net'); (2)查询文章表(article)中标题最长的10篇文章 SELECT id,title FROM article ORDER BY LENGTH(

MySQL Error--InnoDB Table mysqlinnodb_index_stats has length mismatch in the column

使用MySQL 5.7.24版本的安装文件替换MySQL 5.7.19版本的安装文件,数据库复制频繁中断,查看error日志发现下面错误: [Warning] InnoDB: Table mysql/innodb_index_stats has length mismatch in the column name table_name. Please run mysql_upgrade 解决办法: 在MySQL服务正常运行的状态下,使用mysql_upgrade命令进行处理: mysql_upg

mysql核心知识要点

1整体知识介绍:mysql基本操作和使用,mysql优化(索引,分表等),mysql部署(读写分离,负载均衡等) 数据库基本介绍:数据库概念,常用数据库,web应用三大软件分工,PHP动态语言特点(处理数据),数据的存放(脚本运行时和执行完毕),数据库系统 关系型数据库:概念(关系+二维表),教学系统实例,常见关系型数据库,关系型数据库特点(所有数据相同结构,没有数据也分配存储空间) 非关系型数据库:键值对型,常见非关系型数据库,非关系型数据库特点(内存运行,硬盘同步) 关系型数据库典型概念:行

【Python之路】第二十篇--MySQL(二)

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名], 用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 1.创建视图 --格式:CREATE VIEW 视图名称 AS SQL语句 create view v1 as select nid,name from tb1 where nid > 4 2.删除视图 --格式:DROP VIEW 视图名称 deop view v1 3.修改视图 -- 格式:ALTER VIEW 视图名称 AS S

MySQL之二:库、储存引擎、表操作

一.库操作 1.数据库命名规则: 可以由字母.数字.下划线.@.#.$ 区分大小写 唯一性 不能使用关键字如 create select 不能单独使用数字 最长128位 2.数据库相关操作 #创建数据库 create database 数据库名 charset utf8; #查看数据库 show databases; show create database db1; select database(); #查看当前所在数据库 #选择数据库 use 数据库名 #删除数据库 drop databa

MySQL (九)

1 代码执行结构 代码执行结构有三种:顺序结构.分支结构和循环结构. 1.1 分支结构 分支结构:实现准备多个代码块,按照条件选择性执行某段代码. 在MySQL中只有if分支. 基本语法 if 条件判断 then -- 满足条件要执行的代码 else if -- 不满足条件要执行的代码 else -- 不满足条件要执行的代码 end if; 触发器结合if分支:判断商品库存是否足够,不够不能生成订单. -- 触发器结合if分支,判断商品库存是否足够,不够不能生成订单 DELIMITER $$ C