पूर्ण रूप से हाँ। आप वर्ण कोड निकायों को बदल सकते हैं (उदा. {
और ƫ
) "मैपिंग" में वर्ण कोड को देखे बिना उनके प्रतिस्थापन वर्णों के साथ। लेकिन नामित इकाइयां (उदा. "
) को हमेशा ऊपर देखने की आवश्यकता होगी।
यहाँ सामान्य मामले को हल करने का मेरा प्रयास है:
-
HTML में परिभाषित नामित वर्ण निकायों को संग्रहीत करने के लिए एक तालिका बनाएं:
CREATE TABLE ents ( ref VARCHAR(8) NOT NULL COLLATE utf8_bin, rep CHAR(1) NOT NULL, PRIMARY KEY (ref) );
-
इस तालिका को पॉप्युलेट करें - मैं एक स्क्रिप्ट का उपयोग करने का सुझाव देता हूं, उदाहरण के लिए 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]);
-
इकाई प्रतिस्थापन करने के लिए SQL फ़ंक्शन को परिभाषित करें (जहां लागू हो, या वर्ण कोड द्वारा इस तालिका का उपयोग करके):
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 ;
-
इस फ़ंक्शन को दो बार लागू करें अपनी (जाहिरा तौर पर) डबल-एन्कोडेड तालिका को डीकोड करने के लिए:
UPDATE my_table SET my_column = dhe(dhe(my_column));