Какие проблемы я должен знать при работе с корейскими наборами символов в mysql. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Какие проблемы я должен знать при работе с корейскими наборами символов в mysql.



 

В теории, хотя есть несколько версий набора символов euckr (Extended Unix Code Korea), только одна проблема была отмечена.

 

Мы используем ASCII‑вариант EUC‑KR, в котором код 0x5c указывает REVERSE SOLIDUS, \ вместо KS‑Roman‑варианта EUC‑KR, в котором код 0x5c определяет WON SIGN(тВй). Это означает, что Вы не можете преобразовывать Unicode U+20A9 в euckr:

 

mysql> SELECT CONVERT('тВй' USING euckr) AS euckr,

– > HEX(CONVERT('тВй' USING euckr)) AS hexeuckr;

+‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑+

| euckr | hexeuckr |

+‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑+

|? | 3F |

+‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑+

1 row in set (0.00 sec)

 

Графическая корейская диаграмма MySQL здесь: http://d.udm.net/bar/~bar/charts/euckr_korean_ci.html.

 

10.11.9: Почему я получаю сообщения об ошибке "Data truncated"?

 

Для иллюстрации мы создадим таблицу с одним столбцом Unicode (ucs2) и другим Chinese (gb2312):

 

mysql> CREATE TABLE ch

– > (ucs2 CHAR(3) CHARACTER SET ucs2,

– > gb2312 CHAR(3) CHARACTER SET gb2312);

Query OK, 0 rows affected (0.05 sec)

 

Мы пробуем помещать редкий символ ц▒М в обоих столбцах:

 

mysql> INSERT INTO ch VALUES ('Aц▒МB','Aц▒МB');

Query OK, 1 row affected, 1 warning (0.00 sec)

 

Имеется предупреждение. Давайте посмотрим, что там случилось:

mysql> SHOW WARNINGS;

+‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+

| Level | Code | Message |

+‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+

| Warning | 1265 | Data truncated for column 'gb2312' at row 1 |

+‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+

1 row in set (0.00 sec)

 

Так что это предупреждение только относительно столбца gb2312.

 

mysql> SELECT ucs2, HEX(ucs2), gb2312, HEX(gb2312) FROM ch;

+‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑+

| ucs2 | HEX(ucs2) | gb2312 | HEX(gb2312) |

+‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑+

| Aц▒МB | 00416C4C0042 | A?B | 413F42 |

+‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑+

1 row in set (0.00 sec)

 

Имеются несколько вещей, которые надлежит понять здесь:

 

Факт, что это является предупреждением, а не ошибкой, характерным для MySQL. Мы предпочитаем пробовать сделать то, что можем, чтобы получить метод наилучшего приближения, чем отказываться.

 

Символ ц▒М не находится в наборе символов gb2312. Мы рассматривали эту проблему ранее.

 

По общему признанию сообщение вводит в заблуждение. В этом случае не было никакого усечения: а произошла тривиальная замена символа на вопросительный знак. Авторы уже имели недовольство относительно этого сообщения (см. Глюк #9337). Но пока они придумывают кое‑что получше, имейте в виду что сообщение 2165 может означать ряд вещей.

 

С SQL_MODE=TRADITIONAL имелось бы сообщение об ошибке, но вместо ошибки 2165 Вы будете видеть: ERROR 1406 (22001): Data too long for column 'gb2312' at row 1.

 

10.11.10: Почему мой внешний GUI‑интерфейс или окно просмотра не отображает символы CJK правильно в моей прикладной программе, использующей Access, PHP или другой API?

 

Получите прямое подключение к серверу, применяя клиент mysql (в Windows: mysql.exe), и попытайтесь выполнить тот же самый запрос там. Если mysql отвечает правильно, то проблема может быть в том, что Ваш интерфейс прикладной программы требует инициализации. Используйте mysql, чтобы понять, какой набор символов это использует с помощью инструкции SHOW VARIABLES LIKE 'char%';. Если Вы используете Access, то Вы наиболее вероятно соединяетесь с MyODBC. В этом случае Вы должны проверить конфигурацию ODBC. Если, например, Вы используете big5, Вы ввели бы SET NAMES 'big5'. Обратите внимание, что; не требуется в этом случае. Если Вы используете ASP, Вы могли бы добавить SET NAMES в код. Имеется пример, который работал в прошлом:

 

<%

Session.CodePage=0

Dim strConnection

Dim Conn

strConnection="driver={MySQL ODBC 3.51 Driver}; \

server= server;uid= username;" \

"pwd= password; \

database= database; \

stmt=SET NAMES 'big5';"

Set Conn = Server.CreateObject("ADODB.Connection")

Conn.Open strConnection

%>

 

Аналогичным способом, если Вы используете любой набор символов, другой, чем latin1 с Connector/NET, Вы должны определить набор символов в строке подключения. Если Вы используете PHP, опробуйте это:

 

<?php

$link = mysql_connect($host, $usr, $pwd);

mysql_select_db($db);

if (mysql_error()) {

print "Database ERROR: ". mysql_error();

}

mysql_query("SET NAMES 'utf8'", $link);

?>

 

В этом случае мы использовали SET NAMES, чтобы изменить character_set_client, character_set_connection и character_set_results.

 

Правильно использовать более нового расширения mysqli, а не старого mysql. При использовании mysqli предыдущий пример мог бы быть переписан как показано здесь:

 

<?php

$link = new mysqli($host, $usr, $pwd, $db);

if (mysqli_connect_errno()) {

printf("Connect failed: %s\n", mysqli_connect_error());

exit();

}

$link‑>query("SET NAMES 'utf8'");

?>

 

Другая проблема, с которой часто сталкиваются в прикладных программах на PHP: что делать с предположениями, сделанными браузером. Иногда добавление или изменение тэга <meta> достаточно, чтобы исправить проблему: например, чтобы обеспечить, чтобы агент пользователя интерпретировал содержание страницы как UTF‑8, Вы должны включить <meta http‑equiv="Content‑Type" content="text/html; charset=utf‑8"> в <head> HTML‑страницы.

 



Поделиться:


Последнее изменение этой страницы: 2021-01-14; просмотров: 50; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.128.199.162 (0.008 с.)