请教从数据库里查询出来的字符的字节数,谢谢

oracleperl 2021-05-13 11:55:36
drop table test;
create table test
(
name varchar(1)
) engine=myisam default charset=utf8mb4;

insert into test values('严');
commit;

然后执行如下SQL,发现“严”占了3个字节
mysql> select name,length(name) from test;
+------+--------------+
| name | length(name) |
+------+--------------+
| 严 | 3 |
+------+--------------+

这说明这个汉字保存成了UTF-8编码

现在我
static HashMap<String,String> h_test = new HashMap<String,String>();
String str=rs.getString("name");
h_test.put(str,"");
请问str里和h_test里的“严”是UTF-8编码的码?

如何知道str的字节数?

谢谢
...全文
395 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2021-05-14
  • 打赏
  • 举报
回复
1. javac 命令的 encoding 参数,用来指定 Java 源文件的字符编码,以防编译过程中出现乱码问题。命令指定的编码要与文件的编码一致才行。 如果 encoding 参数指定错了,有可能会编译报错,也有可能编译不报错,但是,执行时字符串显示的是乱码。 具体是哪种情况,要看你程序中的字符串的内容。 2. 你说的很对,只要编译通过后,class 文件可以处处运行,不用再关注编码问题,因为,所有class文件中的字符串,编码统一使用 UTF-8 编码,不存在使用其他编码的状况。如果这种情况还出现乱码,首先检查 javac 的 encoding 参数,有可能编译的时候,源文件的编码与参数不一致。 3. MySQL 数据库,你建的表,是要存储在硬盘上的,表中的字符串数据,也会保存到数据文件中。表的编码,指的是 存储在硬盘时字符的编码。 数据文件在加载到 数据库服务器的内存时,会进行编码转换,统一将转换成 Unicode 编码,也就是说,你存储在表中的字符串,保存在硬盘中使用的是 UTF-8 (UTF8MB4), 加载到内存中时 使用的是 Unicode 编码(双字节字符编码),然后,你可以通过 select 语句进行查询,将查询结果传输给你,在传输的时候,字符串会再次进行编码转换。 首先,JDBC 的 URL 中,characterEncoding=UTF-8 指的是,你的程序(JDBC)与数据库进行通信时,字符串所采用的编码是 UTF-8。刚刚说过,查询结果在传输时会再次进行编码转换,转换的目标编码就是这个参数所指定的。 其次,传输时的编码,与数据库表的编码,并没有直接关系。因为,数据库在处理字符串时,统一使用的是 Unicode 编码,只有在写入硬盘或者网络传输时才会进行编码转换。只要你存储的是中文, 表编码与URL中设置的编码,配置成UTF-8 和 GBK 都可以,一样配置一种编码也可以,不会出现乱码的状况。当然,我们通常会将编码配置成一致的,方便问题的排查。 最后,将“好”保存到String str=rs.getString("name") , 这个语句是运行在本地的,与数据库无关。JVM中的字符串,统一使用 Unicode 编码,“好”这个字符,在内存中(str对象所表示的字符)占两个字节,getString("name") 会将UTF-8编码的数据转换成Unicode形式的字符串返回,然后被 str 引用。
oracleperl 2021-05-13
  • 打赏
  • 举报
回复
引用 4 楼 冰思雨 的回复:
谢谢大神指点 我想一个问题一个问题整理清楚 1.首先编译的时候,-encoding是针对.java文件的编码说明 如下,说明test.java的编码是GBK javac -encoding GBK test.java 如下,说明test.java的编码是UTF-8 javac -encoding UTF-8 test.java 如果-encoding和test.java的编码不匹配,就有可能编译报错 2.如上源码不管是GBK编码的,还是UTF-8编码的,只要能编译成功 WINDOWS和Linux平台都能使用,源码本身是什么编码并不重要,对吧? 3.我有一个mysql数据里,有一张表,表数据编码是UTF-8 (UTF8MB4) 也就是汉字是3个字节的。 现在我连接数据库,查询这个表, 然后将表的记录字段值保存到String,或者hashmap里 假设select name from t limit 1 name的值是“好” 首先,如下characterEncoding=UTF-8和characterEncoding=GBK是起到什么作用? DBURL="jdbc:mysql://localhost:3306/"+dbname+"?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8"; DBURL="jdbc:mysql://localhost:3306/"+dbname+"?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=GBK"; 其次,由于表的数据是UTF-8的,那么 从数据库服务器传输到java变量,这个传输的过程是什么编码? 最后,将“好”保存到String str=rs.getString("name") 此时在str里的“好”是什么编码,假设是UTF-16, 那么是java自动将数据库的UTF-8自动转成str的UTF-16了吗? 谢谢大神
冰思雨 2021-05-13
  • 打赏
  • 举报
回复
楼主那个 HashMap 里面的字符串,编码都是 Uncode 的编码, 你在写入文件的时候,进行转码即可。 两种方式: 1. 构建 FileWriter 对象时,设置文件的编码方式是 UTF-8 ,然后,写入字符串即可自动完成编码转换。 2. 构建 FileOutputSteam 写入二进制数据流,即 byte 数组,使用 String.getBytes(“UTF-8”) 方法,得到 UTF-8 编码的二进制数据,写入输出流当中。
冰思雨 2021-05-13
  • 打赏
  • 举报
回复
Java 内存中的字符都是 双字节数据,采用的是 Unicode 编码,Unicode16 双字节编码。 然后,在谈谈其他相关的编码。 比如:Java 源文件的编码,一般使用的是 UTF-8 编码,也有用 GBK 编码的,这没有什么问题,因为,Java 源文件要进行编译的,编译过程会对字符串进行编码转换,最后,编译完成会生成 class 文件,字节码文件中的字符串是统一使用 UTF-8 编码。所以,很多人在编写 Java 源文件的时候,直接让源文件也保存成 UTF-8 编码,省得编译器进行编码转换了。 数据库中的字符串也存在编码方式的问题,我们要具体分析一下,这个涉及编码的地方比较多。 1. 内存当中,数据处理时的字符编码,一般使用 Unicode 编码,以为它是定长编码,处理起来比较方便; 2. 数据文件(硬盘文件)中的字符编码(建表的时候可以设置),一般使用 UTF-8 / GBK 等本地语言对应的编码(要存储多国语言的使用UTF-8); 3. 数据传输时的字符编码,就是 JDBC 连接数据库后,你查询结果中有字符串,然后,从服务器传输到你的应用程序时使用的编码,一般也使用 UTF-8 编码。 楼主查看的编码,应该是数据表中存储字符采用的编码。 Unicode 和 UTF-8 编码,都可以编码多国语言的字符,一个是定长编码,一个是变长编码,使用在不同的场景当中。 定长编码方便数据的处理,可以很快找到字符串中的某个位置的字符; 变长编码方便数据的传输和存储,虽然,汉字要多占一些空间,但是,可以支持多国语言并且英文很省空间。 如果你建的表中的字符串只有中文,可以在建表的时候设置编码为 GBK/GB2312 即可。
oracleperl 2021-05-13
  • 打赏
  • 举报
回复
引用 1 楼 PNZ.BeijingL 的回复:
和你运行程序的系统的编码环境有关,例如我台机的编码格式是gbk, 所以就是2字节,但是mac 是utf-8 结果就是3字节 System.out.println(cc.getBytes().length); System.out.println(Charset.defaultCharset());
谢谢大神 感觉很复杂 1. 编译时的encoding是啥意思? javac -encoding GBK me.java 2.运行时的-Dfile.encoding是啥意思? java -Dfile.encoding=utf-8 me 3. 连数据库时的characterEncoding啥意思? characterEncoding=UTF-8 好复杂啊!如上3个encoding有什么区别,分别起到什么作用? 谢谢 我觉得编码无非就是: 1. 以什么编码规则写入 2. 以什么编码规则读取 3. 以什么编码规则展示 我就是想实现: 1. 保存在数据库表里的字符是UTF-8的,也可能是GBK的 不管是UTF-8还是GBK, 然后查询数据库表,将表数据都以UTF-8编码保存到String或者hashmap, 2. 保存在文件里的字符是UTF-8的,也可能是GBK的 不管是UTF-8还是GBK, 然后读取文件,将文件数据都以UTF-8编码保存到String或者hashmap, 请教如何实现?谢谢
=PNZ=BeijingL 2021-05-13
  • 打赏
  • 举报
回复
和你运行程序的系统的编码环境有关,例如我台机的编码格式是gbk, 所以就是2字节,但是mac 是utf-8 结果就是3字节

System.out.println(cc.getBytes().length);
System.out.println(Charset.defaultCharset());

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧