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 LENGTH(str)

文字列の長さstrをバイト単位で返します。マルチバイト文字は複数バイトとしてカウントされます。これは、5つの2バイト文字を含む文字列の場合、LENGTH()は10を返し、CHAR_LENGTH()は5を返すことを意味します。

多分あなたが必要とするのはCHAR_LENGTH(str)です

文字列の長さを文字数で返しますstr。マルチバイト文字は1文字としてカウントされます。これは、5つの2バイト文字を含む文字列の場合、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 に答える