Не удается найти причину, по которой я не могу хранить в базе данных 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
Расширение моих комментариев в ответ:
Кажется, что вы правильно настроили все, и только застряли на вставке строкового литерала в базу данных. Для этого вам также необходимо убедиться, что ваша кодировка текста для сохраненного 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