2012-04-26 2 views
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 строка против тузды строк

Тогда у меня есть кусок 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, не так ли?) Почему у меня все еще возникают несогласованные значения длины?

ответ

0

По умолчанию charset Java не UTF-16, его локаль dependent.

Если вы хотите изменить Charset в Java, вам нужно будет сделать это до запуска JVM, иначе будет использоваться значение defaultCharset, которое зависит от локали.

0

пытаются подключиться в UTF-16 кодировке:

Connection connection = DriverManager.getConnection(url+"?characterEncoding=UTF-16", usr, pass); 
0

Я думаю, что Java ИОС подсчитывалось количество символов, в то время как MySQL сообщает количество байтов, используемых для хранения символов.

3

Mysql LENGTH(str)

Возвращает длину строки str, измеряемую в байтах. Многобайтовый символ считается как несколько байтов. Это означает, что для строки, содержащей пять символов два байта, длина() возвращает 10, в то время как CHAR_LENGTH() возвращает 5.

Может быть то, что вам нужно, это CHAR_LENGTH(str)

Возвращает длину строка str, измеренная в символах. A многобайтовый символ считается единственным символом. Это означает, что для строка, содержащая пять двухбайтовых символов, LENGTH() возвращает 10, , тогда как CHAR_LENGTH() возвращает 5.

Смежные вопросы