Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

mysql ganti karakter khusus html dengan setara UTF

Seperti yang disebutkan dalam komentar saya di atas , sangat tidak jelas apa yang Anda coba lakukan dalam kasus Anda sendiri.

Baiklah. Anda dapat mengganti entitas kode karakter (mis. { dan ƫ ) dengan karakter penggantinya tanpa harus mencari kode karakter di "pemetaan". Tetapi entitas bernama (mis. " ) akan selalu perlu diperhatikan.

Inilah upaya saya untuk memecahkan kasus umum:

  1. Buat tabel untuk menyimpan entitas karakter bernama yang didefinisikan dalam HTML:

    CREATE TABLE ents (
      ref VARCHAR(8) NOT NULL COLLATE utf8_bin,
      rep CHAR(1)    NOT NULL,
      PRIMARY KEY (ref)
    );
    
  2. Isi tabel ini - Saya sarankan menggunakan skrip, misalnya dari PHP:

    $dbh = new PDO("mysql:dbname=$dbname", $username, $password);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
    $ins = $dbh->prepare('INSERT INTO ents (ref, rep) VALUES (?, ?)');
    $t = get_html_translation_table(HTML_ENTITIES);
    foreach ($t as $k => $v) $ins->execute([substr($v, 1, -1), $k]);
    
  3. Tentukan fungsi SQL untuk melakukan penggantian entitas (menggunakan tabel ini jika berlaku, atau dengan kode karakter):

    DELIMITER ;;
    
    CREATE FUNCTION dhe(s TEXT) RETURNS TEXT
    BEGIN
      DECLARE n, p, i, t INT DEFAULT 0;
      DECLARE r VARCHAR(12);
      entity_search: LOOP
        SET n := LOCATE('&', s, n+1);
        IF (!n) THEN
          LEAVE entity_search;
        END IF;
    
        IF (SUBSTRING(s, n+1, 1) = '#') THEN
          CASE
            WHEN SUBSTRING(s, n+2, 1) RLIKE '[[:digit:]]' THEN
              SET t := 2, p := n+2, r := '[[:digit:]]';
            WHEN SUBSTRING(s, n+2, 1) = 'x' THEN
              SET t := 3, p := n+3, r := '[[:xdigit:]]';
            ELSE ITERATE entity_search;
          END CASE;
        ELSE
          SET t := 1, p := n+1, r := '[[:alnum:]_]';
        END IF;
    
        SET i := 0;
        reference: LOOP
          IF SUBSTRING(s, p+i, 1) NOT RLIKE r THEN
            IF SUBSTRING(s, p+i, 1) RLIKE '[[:alnum:]_]' THEN
              ITERATE entity_search;
            END IF;
            LEAVE reference;
          END IF;
          IF i = 8 THEN ITERATE entity_search; END IF;
          SET i := i + 1;
        END LOOP reference;
    
        SET s := CONCAT(
          LEFT(s, n-1),
          CASE t
            WHEN 1 THEN COALESCE(
              (SELECT rep FROM ents WHERE ref = SUBSTRING(s, p, i))
            , SUBSTRING(s, n, i + IF(SUBSTRING(s, p+i, 1)=';',1,0))
            )
            WHEN 2 THEN CHAR(SUBSTRING(s, p, i))
            WHEN 3 THEN CHAR(CONV(SUBSTRING(s, p, i), 16, 10))
          END,
          SUBSTRING(s, p + i + IF(SUBSTRING(s, p+i, 1)=';',1,0))
        );
      END LOOP entity_search;
      RETURN s;
    END;;
    
    DELIMITER ;
    
  4. Terapkan fungsi ini dua kali untuk memecahkan kode (tampaknya) tabel yang disandikan ganda:

    UPDATE my_table SET my_column = dhe(dhe(my_column));
    


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP 7 tidak dapat menemukan MySQLi

  2. Dapatkan perbedaan tahun antara dua tanggal di MySQL sebagai bilangan bulat

  3. Pilih dari tabel yang sama sebagai Sisipan atau Perbarui

  4. Masalah dengan MySql INSERT MAX()+1

  5. MySQL TIMEDIFF() vs TIMESTAMPDIFF():Apa Bedanya?