0
mysql> CREATE database testing CHARACTER SET utf16;
Query OK, 1 row affected (0.00 sec)

mysql> USE testing;
Database changed

mysql> CREATE TABLE t (str varchar(64));
Query OK, 0 rows affected (0.43 sec)

mysql> INSET INTO t values ("1234567891234567");
Query OK, 1 row affected (0.00 sec)

==============================

然后我有一段java代码

Connection connection = DriverManager.getConnection(url, usr, pass);
Statement statement = connection.createStatement();

statement.execute("USE  testing");

ResultSet rst = statement.executeQuery("SELECT str, LENGTH(str) FROM t;");
while (rst.next())
             System.out.print("java length: " + rst.getString(1).length() 
                     + "\nmysql length: " + rst.getInt(2));

这会给

java length: 16
mysql length: 32

我不明白为什么长度不同。我明确地将数据库的字符集设置为 UTF16(这是 Java 的默认字符集,对吗?)为什么我仍然会得到不一致的长度值?

4

5 回答 5

5

mySql 函数“CHAR_LENGTH()”返回 #/Unicode 字符(如 Java 的“.length”)。

MySQL 函数“LENGTH()”返回 #/bytes。

这是 MySQL 参考:

于 2012-04-26T03:11:42.920 回答
3

Mysql长度(字符串)

返回字符串的长度str,以字节为单位。多字节字符计为多个字节。这意味着对于包含五个两字节字符的字符串,LENGTH() 返回 10,而 CHAR_LENGTH() 返回 5。

也许你需要的是CHAR_LENGTH(str)

返回字符串的长度str,以字符为单位。多字节字符计为单个字符。这意味着对于包含五个两字节字符的字符串,LENGTH() 返回 10,而 CHAR_LENGTH() 返回 5。

于 2012-04-26T03:12:52.927 回答
0

Java 的默认字符集不是 UTF-16,它依赖于语言环境。

如果要更改 Java 中的 Charset,则必须在 JVM 启动之前进行,否则将使用依赖于语言环境的 defaultCharset 值。

于 2012-04-26T03:09:59.973 回答
0

尝试以 UTF-16 编码连接:

Connection connection = DriverManager.getConnection(url+"?characterEncoding=UTF-16", usr, pass);
于 2012-04-26T03:10:00.150 回答
0

我的猜测是 Java ios 报告字符数,而 MySQL 报告用于存储字符的字节数。

于 2012-04-26T03:10:28.177 回答