Специальные символы не будут работать в MySQL (UTF-8) - PullRequest
4 голосов
/ 21 июля 2010

Итак, у меня возникли некоторые проблемы при попытке перейти из Latin1 кодированных баз данных, таблиц и столбцов, и теперь, когда все наконец-то в UTF-8, я не могу обновить строку столбец. Я пытаюсь заменить «е» на е с острым (é). Но это дает мне это:

ОШИБКА 1366 (HY000): неверное строковое значение: '\ x82m ...' для столбца «Имя» в строке 1

при запуске этого:

UPDATE access SET Name='ém' WHERE id="2";

Все базы данных дают мне это при запуске команды состояния (кроме части current database, конечно):


Connection id:          1  
Current database:       access  
Current user:           root@localhost  
SSL:                    Not in use  
Using delimiter:        ;  
Server version:         5.1.47-community MySQL Community Server (GPL)  
Protocol version:       10  
Connection:             localhost via TCP/IP  
Server characterset:    utf8  
Db     characterset:    utf8  
Client characterset:    utf8  
Conn.  characterset:    utf8  
TCP port:               3306  
Uptime:                 20 min 16 sec  

Threads: 1 Questions: 110 Slow queries: 0 Opens: 18 Flush tables: 1 Open tables: 11  Queries per second avg: 0.90

И выполнение команды chcp в cmd дает мне 850. Ох, и в некоторые моменты я получил это:

ОШИБКА 1300 (HY000): недопустимая строка символов utf8: 'ém' ГДЕ id = "2"

Я везде искал решение, но нигде не мог найти ничего, и, поскольку у меня всегда были хорошие ответы на Stackoverflow, я решил спросить здесь.

Спасибо за любую помощь!

Ответы [ 4 ]

4 голосов
/ 19 февраля 2011

Решение состоит в том, чтобы установить переменные соединения для любой кодовой страницы, используемой вашей установкой Windows (не на латиницу 1, как то, что рекомендует множество страниц - кодировка символов cmd.exe не является латиницей 1).

Inв моем случае кодовая страница 850:

mysql> SET NAMES cp850;

Вот пример с подключением, установленным в UTF-8:

mysql> show variables like '%char%';
+--------------------------+---------------------------------+
| Variable_name            | Value                           |
+--------------------------+---------------------------------+
| character_set_client     | utf8                            |
| character_set_connection | utf8                            |
| character_set_database   | utf8                            |
| character_set_filesystem | binary                          |
| character_set_results    | utf8                            |
| character_set_server     | utf8                            |
| character_set_system     | utf8                            |
| character_sets_dir       | C:\xampp\mysql\share\charsets\  |
+--------------------------+---------------------------------+
8 rows in set (0.00 sec)

Это то, что происходит с символами с акцентом:

mysql> select nom from assignatura where nom like '%prob%';
+---------------------------------------+
| nom                                   |
+---------------------------------------+
| Probabilitat i Processos Estocàstics |
| Probabilitat i Processos Estocàstics |
+---------------------------------------+
2 rows in set (0.03 sec)

Обратите внимание на посторонний символ непосредственно перед á.Кроме того, ударение является неправильным направлением, оно должно быть à.

После выполнения SET NAMES cp850;:

mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | cp850                          |
| character_set_connection | cp850                          |
| character_set_database   | utf8                           |
| character_set_filesystem | binary                         |
| character_set_results    | cp850                          |
| character_set_server     | utf8                           |
| character_set_system     | utf8                           |
| character_sets_dir       | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)

Мы, наконец, получаем правильный акцентированный символ:

mysql> select nom from assignatura where nom like '%prob%';
+--------------------------------------+
| nom                                  |
+--------------------------------------+
| Probabilitat i Processos Estocàstics |
| Probabilitat i Processos Estocàstics |
+--------------------------------------+
2 rows in set (0.00 sec)
3 голосов
/ 21 июля 2010

Этот поток , хотя и несколько устаревший, похоже, приводит к выводу, что cmd.exe и клиент mysql не обрабатывают кодировку UTF-8 должным образом (вина в большей степени направлена ​​на cmd.exe ).

Рекомендуется чтение SQL из файла, так же как и использование альтернативного клиента - или разновидности UNIX. :)

0 голосов
/ 21 июля 2010

Ну ... 0x82 в коде страницы 850 e-sharp. Это будет 0xE9 в ISO-8859-1, что делает его чем-то вроде 0xD0 0xB4 в UTF-8.Я не знаю, есть ли хороший способ заставить окно DOS правильно обрабатывать ввод UTF-8.Вот альтернатива, если вы используете клиент командной строки.Вы можете установить набор символов клиента так, чтобы он соответствовал вашей локальной кодовой странице, и позволить библиотеке mysql позаботиться о транскодировании для вас:

c:\> mysql --default-character-set=cp850
mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.1.34, for apple-darwin9.6.0 (i386) using readline 5.2

Connection id:         17
Current database:
Current user:          daveshawley@localhost
SSL:                   Not in use
Current pager:         stdout
Using outfile:         ''
Using delimiter:       ;
Server version:        5.1.34-log Source distribution
Protocol version:      10
Connection:            localhost via TCP/IP
Server characterset:   ucs2
Db     characterset:   ucs2
Client characterset:   cp850
Conn.  characterset:   cp850
TCP port:              3306
Uptime:                19 days 8 hours 37 min 55 sec

Threads: 2  Questions: 248  Slow queries: 0  Opens: 71  Flush tables: 1  Open tables: 64  Queries per second avg: 0.0
--------------

Я знаю, что это работает для комбинации latin1 водно окно и utf8 в другом окне на моем MacBook.Я также проверил, что ALTER TABLE ... CONVERT TO CHARACTER SET ucs2 поступил правильно.

0 голосов
/ 21 июля 2010

Когда вы вводите вещи в командной строке, строки будут в любом наборе символов, который использует терминал. Почему клиент mysql не переводит это перед отправкой в ​​базу данных, все еще озадачивает, но это не так. Вы, вероятно, отправляете latin1 в БД.

Вы можете сохранить ваш SQL обновления в текстовом файле, сделать уверенным , что текстовый файл UTF-8, и запустить что-то вроде type myfile.txt | mysql db_name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...