Не удается сохранить символы UTF8 в MySQL

Не удается найти причину, по которой я не могу хранить в базе данных MySQL символы, такие как ţ, î, ş.

Определение моей таблицы:

CREATE TABLE IF NOT EXISTS `gen_admin_words_translated` ( `id` int(10) NOT NULL AUTO_INCREMENT, `word_id` int(10) NOT NULL, `value` text COLLATE utf8_unicode_ci, `lang_id` int(2) NOT NULL, `needUpd` int(1) NOT NULL DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2689 ; 

Соединение с базой данных выполняется со следующим скриптом:

 $charset = "UTF8"; $link = mysql_connect($host, $user, $pass); if(!$link){ die("Unable to connect to database server."); } mysql_selectdb($database); if(function_exists("mysql_set_charset")){ mysql_set_charset($charset, $link); }else{ mysql_query("SET NAMES $charset"); } 

У меня на главной части страницы:

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

и сценарий:

 $text = 'ţ, î, ş'; mysql_query("insert into gen_admin_words_translated (word_id, lang_id, value, needUpd) values (1, 1, '$text', 1)"); 

Все, что я получаю в конце таблицы:

 SELECT * FROM `gen_admin_words_translated` id word_id value lang_id needUpd 5166 1034 ?, 1 1 

Related of "Не удается сохранить символы UTF8 в MySQL"

Расширение моих комментариев в ответ:

Кажется, что вы правильно настроили все, и только застряли на вставке строкового литерала в базу данных. Для этого вам также необходимо убедиться, что ваша кодировка текста для сохраненного PHP-скрипта также является UTF-8 .

Большинство достойных редакторов сообщают вам, с какой кодировкой вы работаете в настоящее время, а также можете сохранять (например, конвертировать между) разные кодировки (даже Notepad делает это сегодня). Однако, как быстрая проверка, вы можете где-то добавить символ в свой файл и сохранить его. Если размер файла изменяется на 1 или 2 байта вместо 3, вы не используете UTF-8, и вам нужно преобразовать файл в эту кодировку.

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

Примечание. Хотя использование <meta> для установки кодировки для вашей страницы должно быть достаточным, лучше сделать это с помощью HTTP-заголовка из PHP следующим образом:

 header('Content-type: text/html; charset=utf-8'); 

поскольку я запускал ваш скрипт, он работал для меня:

 $charset = "UTF8"; $link = mysql_connect('localhost', 'root', '') or die('connection?'); mysql_select_db('test') or die('database?'); if(function_exists("mysql_set_charset")){ mysql_set_charset($charset, $link); }else{ mysql_query("SET NAMES $charset"); } $text = 'ţ, î, ş'; mysql_query("insert into gen_admin_words_translated (word_id, lang_id, value, needUpd) values (1, 1, '$text', 1)"); $query = mysql_query('SELECT * FROM `gen_admin_words_translated`'); $array = mysql_fetch_array($query); print_r($array) 

результат:

 Array ( [0] => 2689 [id] => 2689 [1] => 1 [word_id] => 1 [2] => ţ, î, ş [value] => ţ, î, ş [3] => 1 [lang_id] => 1 [4] => 1 [needUpd] => 1 ) 

вещи для проверки:

проверьте, действительно ли ваша веб-страница UTF-8, может быть, у вас есть некоторый набор настроек в другом месте.

 header('Content-type: text/html; charset=utf-8'); 

кодировка файла должна быть также UTF-8, поскольку она может нарушить ваши символы, если в противном случае ..

Если это:

 $text = 'ţ, î, ş'; 

является вашим литеральным кодом, вы должны убедиться, что исходный файл PHP закодирован как UTF-8 . В противном случае эти символы будут символами ISO-8859-1 в контексте Unicode, что приведет к сломанным символам.

Получается ли последний результат, который вы вставляете из MySQL Command-Line? Если это так, попробуйте SET NAMES utf8; перед запросом SELECT * FROM gen_admin_words_translated

В этом выражении вы вставляете символы, как они существуют в текущем файле PHP:

 $text = 'ţ, î, ş'; 

Однако они будут закодированы с использованием кодировки символов вашего файла PHP. Если этот PHP-файл не использует кодировку UTF-8, результирующая строка не будет кодироваться в кодировке UTF-8.

Вы должны использовать свой текстовый редактор, чтобы проверить кодировку символов, используемую в текущем файле. Все достойные текстовые редакторы должны иметь возможность отображать, а некоторые могут конвертировать кодировку символов, используемую в документе.

Чтобы создать более портативный код, гарантируя, что кодировка вашего документа не имеет значения, вы можете использовать закодированные значения следующим образом:

 $text = "\xC5\xA3, \xC3\xAE, \xC5\x9F"; 

К сожалению, если вам нужно много чего сделать, это будет больно, потому что вам нужно использовать многобайтовое шестнадцатеричное представление. PHP не имеет собственного Unicode-способа указания символов, как некоторые другие языки (где вы можете перейдите "\ u163" вместо "\ xC5 \ xA3").

Вы можете посмотреть представление UTF-8 в шестнадцатеричном формате, используя такие инструменты .

Проверьте файл инициализации MySQL. Он должен включать эти строки персонажа:

 [client] port=3306 [mysql] default-character-set=utf8 port = 3306 # [mysqld] basedir="..... #Path to the database root datadir="..... # The default character set that will be used when a new schema or table is # created and no character set is defined character-set-server=utf8 по [client] port=3306 [mysql] default-character-set=utf8 port = 3306 # [mysqld] basedir="..... #Path to the database root datadir="..... # The default character set that will be used when a new schema or table is # created and no character set is defined character-set-server=utf8