PHP скрипт пишет в БД в неправильной кодировке русские слова

big boy
На сайте с 18.11.2006
Offline
307
705

Сабж:


<?php
include 'bd.php';

$file = 'ruwords.txt';

$fo = @fopen($file, 'r');
$words = explode("\n", fread($fo, filesize($file)));

$limit = 3;
$bad = $good = $len = 0;
foreach ($words as $value) {
$len = mb_strlen($value,'UTF-8')-1;
if ($len < $limit) {
$bad++;
}
if ($len >= $limit) {
echo $value . ' ' . $len . '<BR>';
mysql_query("INSERT INTO ruwords SET word = '$value', lengh = '$len'") or die(' Не удалось записать слово в БД: ' . mysql_error());
$good++;
}
}
mysql_close();
?>

Файл ruwords.txt содержит русские слова по 1 на каждой строке. Скрипт отбирает те, что не менее 3 символов и пишет их в БД. echo всё выводит нормально на экран после обработки, но вместо слов в таблице я вижу:

ант

аул

виг

век

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

Самой таблице уже пробовал менять следующие кодировки: utf8_general_ci, utf8_unicode_ci, utf8_bin, cp1251_general_ci, cp866_general_ci. Файл со словами и сам скрипт тоже перепиливал в UTF-8 или Windows-1251.

При коннекте к БД пробовал:

mysql_query("SET NAMES cp1251");

mysql_query("SET CHARACTER SET cp1251");

Ну и соответственно подставлял туда различные кодировки. Ноль.

Окружение:

PHP Version 5.3.29

БД 10.0.21-MariaDB - MariaDB Server

Кодировка сервера: UTF-8 Unicode (utf8)

✔ Google spam update убил сайты? Что делать - https://webmasta.ru/blog/google-october-2022-spam-brain-update
D
На сайте с 14.01.2007
Offline
153
#1

во избежание проблем, в одной кодировке должны быть:

1. БД

2. соединение с БД(SET NAMES...)

3. Файл php, который работает с базой

4. Заголовки сервера

5. Мета в html

при изменениях в базе, данные не конвертировать, а удалять и заполнять заново - конечно, если есть возможность

big boy
На сайте с 18.11.2006
Offline
307
#2

Победил!

На случай если кому пригодится.

Шаг 1 - надо узнать фактическую кодировку БД. Пишем в пых после коннекта к базе:


$res = mysql_query("SHOW VARIABLES LIKE '%char%'");
for(;$row = mysql_fetch_row($res); print('<br>'))
foreach($row as $val) echo $val.' ';

У меня выдал следующее:


character_set_client latin1
character_set_connection latin1
character_set_database utf8
character_set_filesystem binary
character_set_results latin1
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

Шаг 2 - значения latin1 надо изменить на UTF-8. Для этого самый простой вариант - это вставить:


mysql_query ("set character_set_client='utf8'");
mysql_query ("set character_set_results='utf8'");
mysql_query ("set collation_connection='utf8_general_ci'");

После этого скрипт нормально отработал и русский текст хорошо встал в БД.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий