cari

Rumah  >  Soal Jawab  >  teks badan

Pengekodan aksara pelik untuk menyimpan data, skrip lama menunjukkannya baik, skrip baharu tidak

Saya cuba menulis semula tapak web lama.

Ia dalam bahasa Parsi dan menggunakan aksara Parsi/Arab.

CREATE DATABASE `db` DEFAULT CHARACTER SET utf8 COLLATE utf8_persian_ci;
USE `db`;

Hampir semua jadual/lajur saya telah COLLATE ditetapkan kepada utf8_persian_ci

Saya menggunakan codeigniter untuk skrip baharu saya dan saya telah

'char_set' => 'utf8',
'dbcollat' => 'utf8_persian_ci',

Dalam tetapan pangkalan data, jadi tiada masalah.

Jadi inilah bahagian yang pelik

Skrip lama menggunakan sejenis enjin pangkalan data yang dipanggil TUBADBENGINETUBA DB ENGINE... tiada yang istimewa.

Apabila saya memasukkan beberapa data (dalam bahasa Farsi) dalam pangkalan data menggunakan skrip lama, apabila saya melihat pangkalan data, aksara disimpan sebagai Ø1مران .

Skrip lama mendapat/memaparkan data dengan baik, tetapi skrip baharu memaparkannya menggunakan fon/charset pelik yang sama seperti pangkalan data

Jadi bila saya menaip rather 时,数据库存储的数据看起来像 Ø1مرا٠,当我在新脚本中获取它时,我会看到 Ø1Ù …را٠但在旧脚本中我看到?????

CREATE TABLE IF NOT EXISTS `tnewsgroups` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `fName` varchar(200) COLLATE utf8_persian_ci DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=11 ;

--
-- Dumping data for table `tnewsgroups`
--

INSERT INTO `tnewsgroups` (`ID`, `fName`) VALUES
(1, 'عمران'),
(2, 'معماری'),
(3, 'برق'),
(4, 'مکانیک'),
(5, 'test'),
(6, 'test2');

Sebaliknya, apabila saya memasukkan ??? terus ke dalam pangkalan data

Sudah tentu, saya menyimpan perkara yang sama dalam pangkalan data rather

Skrip baharu dipaparkan dengan sangat baik

Tapi dalam skrip lama saya dapat ???

Bolehkah sesiapa memahami ini?

Ini enjin besar

https://github.com/maxxxir/mz-codeigniter-crud/blob/master/tuba.php

Contoh penggunaan skrip lama:

define("database_type" , "MYSQL");
define("database_ip" , "localhost");
define("database_un" , "root");
define("database_pw" , "");
define("database_name" , "nezam2");
define("database_connectionstring" , "");
$db = new TUBADBENGINE(database_type , database_ip , database_un , database_pw , database_name , database_connectionstring);
$db->Select("SELECT * FROM tnews limit 3");
if ($db->Lasterror() != "") { echo "<B><Font color=red>ÎØÇ ! áØÝÇ ãÌÏøÏÇ ÊáÇÔ ˜äíÏ";  exit(); }
for ($i = 0 ; $i < $db->Count() ; $i++) {
    $row = $db->Next();
    var_dump($row);
}

P粉141455512P粉141455512325 hari yang lalu367

membalas semua(2)saya akan balas

  • P粉295616170

    P粉2956161702024-01-11 16:03:06

    jawapan deceze sangat bagus, tetapi saya boleh menambah beberapa maklumat yang mungkin membantu mengendalikan sejumlah besar rekod tanpa perlu mengujinya secara manual.

    Jika anda menukar CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) 失败,则会打印 NULL 而不是 field_name kandungan.

    Jadi saya menggunakan ini untuk mencari rekod tersebut:

    SELECT IFNULL(
        CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8)
        , '**************************************************')
    FROM table_name

    Atau ini:

    SELECT id, field_name, CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8)
    FROM table_name
    WHERE CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) IS NULL

    UPDATE dengan klausa ini hanya mempengaruhi rekod yang penukaran berjaya:

    UPDATE table_name
    SET
    field_name = CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8mb4 )
    WHERE
    CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8mb4) IS NOT NULL

    balas
    0
  • P粉920835423

    P粉9208354232024-01-11 13:05:48

    Ringkasnya, kerana soalan ini telah dibincangkan seribu kali sebelum ini:

    1. PHP menyimpan rentetan, seperti "汉字",以 UTF-8 编码。该字节为 E6 BC A2 E5 AD 97.
    2. Ia menghantar rentetan ini melalui latin1sambungan pangkalan data yang ditetapkan kepada .
    3. Pangkalan data menerima bait E6 BC A2 E5 AD 97,认为它们代表 latin1E6 BC A2 E5 AD 97 dan menganggap ia mewakili
    4. aksara.
    5. Watak storan pangkalan data
    6. æ¡ ¡ ¿ Li>
    7. Proses yang sama secara terbalik menyebabkan PHP menerima bait yang sama dan kemudian menganggapnya sebagai UTF-8. Perjalanan pergi dan balik berfungsi dengan baik untuk PHP, walaupun pangkalan data tidak mengendalikan aksara seperti yang sepatutnya.

    Jadi masalah di sini ialah sambungan pangkalan data tidak disediakan dengan betul apabila data dimasukkan ke dalam pangkalan data. Anda perlu menukar data dalam pangkalan data kepada aksara yang betul. Cuba ini:

    SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
    utf8 不是您所需要的,请尝试一下。如果有效,请将其更改为 UPDATEMungkin

    utf8
    bukan yang anda perlukan, sila cuba. Jika ia berfungsi, tukar kepada pernyataan 🎜KEMASKINI untuk mengemas kini data secara kekal. 🎜

    balas
    0
  • Batalbalas